如何修改访问插件选项所需的功能?

时间:2014-07-28 作者:EliasNS

我有以下几点3 different Roles: Admin, Editor, 和SEO. 我已经安装了Yoast的WordPress SEO,我想得到这个:

  • I don\'t want the editors to see the SEO options, 因为他们只写帖子,不知道SEO。有一个人SEO 角色,谁将进行优化
  • I don\'t want the SEO person to see other plugins options. 我只想拥有与编辑器相同的功能,但要启用SEO功能
我一直在尝试这个网站上的一些片段,我能够将元框隐藏到Editors, 但是not the little \'rating box\' over the Publish button.

我也不知道如何处理第二点,因为所有插件都使用相同的manage_options 能力,因此我无法将该能力分配给SEO 角色和I don\'t know how to change the capability needed 无需修改插件文件(插件更新时将丢失的内容)。

提前谢谢。

3 个回复
最合适的回答,由SO网友:Howdy_McGee 整理而成

也许这不是最好的方法,因为它确实给了编辑器对设置和选项的访问权限,但它给了特定的编辑器(基于用户ID)编辑选项的权限。然后,我们测试是否正在加载一个选项模板,如果正在加载,并且用户id与我们授予的权限相同,则终止进程并弹出消息。

1) 所以,首先,创建您的SEO用户并为他分配一个编辑角色。

2) 接下来,我们需要让该用户能够manage_options. 您可以通过编辑用户并查看URL来找到它,它应该是URL中最后的参数之一。

/** Give our SEO Guy Permissions **/
function give_seo_yoastToast() {
    $user = new WP_User( $seo_user_id );
    $user->add_cap( \'manage_options\');
}
add_action( \'admin_init\', \'give_seo_yoastToast\');
3) 现在,我们需要确保我们所有的SEO dudeski都不能访问任何关键选项。据我所知,以下页面是该用户编辑重要信息的唯一方式。如果他们确实查看了这些页面,我们会将其删除并发出消息,您可以随意更改消息。

/** Remove Access to Certain Pages **/
add_action( \'load-options-general.php\', \'prevent_seoguy_access\' );
add_action( \'load-options-writing.php\', \'prevent_seoguy_access\' );
add_action( \'load-options-reading.php\', \'prevent_seoguy_access\' );
add_action( \'load-options-discussion.php\', \'prevent_seoguy_access\' );
add_action( \'load-options-media.php\', \'prevent_seoguy_access\' );
add_action( \'load-options-permalink.php\', \'prevent_seoguy_access\' );
add_action( \'load-options.php\', \'prevent_seoguy_access\' );
function prevent_seoguy_access(){
    $currID = is_user_logged_in() ? get_current_user_id() : 0;

    if($currID == $seo_user_id ){
        wp_die("There was a hole here once, it\'s gone now.");
        exit();
    }
}
4) 现在,他可以查看菜单中的页面,但当他访问这些页面时,他会看到上面的消息。作为额外的一步,让我们从菜单中删除此页面。请注意,如果您确实在没有上述功能的情况下删除了菜单页,那么精明的用户可以通过URL直接访问任何选项页。

/** Remove Settings Menu Page from SEO Guy **/
function seo_guy_menu() {
    if(!current_user_can(\'administrator\')){
        remove_menu_page(\'options-general.php\');
    }
}
add_action(\'admin_menu\', \'seo_guy_menu\');
5) 你完了!

不幸的是,正如你在问题中指出的那样,Yoast似乎没有能力在不给用户不必要的额外权限的情况下为所有SEO内容授予特定于用户的权限,这太糟糕了。另一方面,你可以不使用静态$seo_user_id 改为创建一个SEO角色,同时授予该角色编辑器权限。这是一个多一点的工作(虽然不是太多),但如果你只有一个人做你的搜索引擎优化永远那么以上的方法是好的,我想。

SO网友:Matt Sims

更改用户查看Yoast SEO设置页面所需功能的最佳方法是使用wpseo_manage_options_capability 滤器

下面是一个如何使用它的示例(放置在functions.php 文件):

/**
 * Return the capability that users need to view the Yoast SEO settings pages.
 *
 * @return mixed|void
 */
function my_custom_wpseo_manage_options_capability() {

    $manage_options_cap = \'edit_others_posts\';

    return $manage_options_cap;
}
add_filter( \'wpseo_manage_options_capability\', \'my_custom_wpseo_manage_options_capability\' );
在上面的示例中edit_others_posts 使用此功能是为了(在默认WordPress安装中)编辑器和管理员都可以访问Yoast SEO设置。

在您不希望“普通”编辑器具有访问权限的情况下,您需要创建一个新角色(即“SEO”),该角色具有与编辑器相同的功能,外加一个额外的自定义功能(即。manage_wpseo_options) 可在上述功能中使用,以代替edit_others_posts.

这个Members plugin 通过JustinTadlock,您可以轻松地为此创建新角色和功能。

注意:这可能不适用于多站点,因为this issue.

<小时>Update: 在Yoast SEO v5中。5+以上wpseo_manage_options_capability 过滤器已重命名为wpseo_manage_options.

SO网友:Fabian

我刚刚找到了一个非常简单的解决方案。如果您还没有-安装某种形式的功能管理器插件。然后,从capabilities manager中创建一个新功能-称之为“CUSTOM\\u capability\\u NAME”或任何您想要的名称。然后将其分配给特定角色或用户。

Important: 复制、备份和要修改的文件。如果要备份,可以随时恢复原始文件。

然后,在实际的服务器上,您需要将目录更改为wp-content/plugins/然后grep并查找所有具有“manage\\u选项”的文件。

示例:grep \'manage_options\' */*

棘手的是,您必须找到将菜单或子菜单添加到仪表板的主功能。下面是我的两个Yoast SEO特定访问的示例。

$manage_options_cap = apply_filters( \'wpseo_manage_options_capability\', \'CUSTOM_CAPABILITY_NAME\' );


add_submenu_page( \'wpseo_dashboard\', __( \'WooCommerce SEO Settings\', \'yoast-woo-seo\' ), __( \'WooCommerce SEO\', \'yoast-woo-seo\' ), \'CUSTOM_CAPABILITY_NAME\', $this->short_name, array(
PS-不要更改以“$”开头的任何内容-这是一个变量。:)

结束

相关推荐

WP_LOCALIZE_SCRIPT与WordPress中的mce_外部_plugins

我不确定这是否可能。我可以使用wp_localize_script 具有mce_external_plugins 滤器我想向tinymce插件脚本发送一个变量。例如:add_filter( \"mce_external_plugins\", array( &$this, \'add_test_plugin\' ) ); public function add_test_plugin( $plugin_array ){ global $pagenow;&#