我想基本上覆盖我的Wordpress functions.php中的插件类函数。我想给编辑器的插件设置访问权限。有办法吗?因为它有一个构造函数。会非常感激的。
插件代码
class BulkImport
{
function __construct()
{
add_action("admin_menu", array($this, 'menu'));
}
function menu()
{
add_submenu_page('edit.php?post_type=wpdmpro', __( "Bulk Import ‹ Download Manager" , "download-manager" ), __( "Bulk Import" , "download-manager" ), WPDM_MENU_ACCESS_CAP, 'importable-files', array($this, 'UI'));
}
}我想将WPDM_MENU_ACCESS_CAP替换为edit_pages
谢谢。
发布于 2020-01-27 19:23:58
简短的回答,你试过使用像管理菜单编辑器这样的管理菜单编辑器插件吗?我没有经验,因此不能保证它,但它似乎很好的审查和管理。
编辑:如果他们正在对UI方法以及admin_menu钩子进行性能检查,那么最好使用WP_Role::add_cap()将WPDM_MENU_ACCESS_CAP添加到editor角色中。您必须确保该功能不允许他们访问其他他们不应该访问的东西。根据常量的名称,它听起来很好,但是您需要粗略地浏览一下插件,以确保。
长答案:对于WordPress,通常情况下,如果操作正确,则很少需要“覆盖”插件类、类方法或函数(不过,有时也需要“覆盖”)。伟大的关于WordPress的事情之一是它的钩子系统,特别是它的动作钩。
当插件使用add_action()并省略第三个参数($priority)时,默认情况下设置为10。优先级的工作方式是先在这个钩子上运行较低的数字,因此请看下面的内容:
add_action( 'some_hook', 'some_other_function' );
add_action( 'some_hook', 'some_function', 3 );
add_action( 'some_hook', 'func', 999 );尽管按照这些顺序编写,当some_hook对该请求运行时,some_function将首先运行(优先级3),然后运行some_other_function (默认优先级为10),最后运行func,优先级为999。
这很好,因为func可以修改或撤销some_function和some_other_function中设置的任何内容。
现在您的插件有了这一行add_action("admin_menu", array($this, 'menu'));,它将自己的menu方法添加到具有10优先级的admin_menu钩子中。这意味着您可以编写自己的函数并将其挂钩到admin_menu钩子上,优先级较低(较高),如11或99。在该函数中,可以使用remove_submenu_page()函数删除插件添加的页面,然后使用add_menu_page()函数将其添加回插件,但更改任何参数!例如:
add_action( 'admin_menu', 'change_BulkImport_submenu', 11 );
function change_BulkImport_submenu(){
remove_submenu_page( 'edit.php?post_type=wpdmpro', 'importable-files' );
add_submenu_page('edit.php?post_type=wpdmpro', __( "Bulk Import ‹ Download Manager" , "download-manager" ), __( "Bulk Import" , "download-manager" ), 'edit_pages', 'importable-files', array('BulkImport', 'UI') );
}这里的情况可能会有点复杂,取决于您正在使用的插件的方式。在add_submenu_page的最后一个参数中,您需要获取全局实例化类方法,将其作为静态方法调用,或者实例化类的一个新实例并在那里使用该方法。我尝试了一下里面可能是什么,但没有看到插件,我就说不出来了。例如,我有一个插件,我必须处理优雅主题的"Bloom“插件,为了做到这一点,我调用了global $et_bloom,然后在钩子上调用了remove_action( 'wp_footer', [$et_bloom, 'display_flyin'] );,这是一种冲突。
您将看到关于修改
global $menu, $submenu(或$GLOBALS['submenu'])的帖子,但只有在限制权限而不是放松权限时,这些帖子才能工作。这是因为在add_submenu_page()的早期,它会检查current_user_can($capability)的返回值,如果当前用户没有它,它将被添加到全局$_wp_submenu_nopriv中,然后函数在那里返回false(因此不会添加项)。
一般来说,如果可能的话,我更喜欢解钩/重新挂钩的方法,因为它会让你更清楚地知道你在做什么,以及为什么做,而且它在两个方向都有效(限制/放松)。但是,在admin_menu钩子中,您可以访问global $menu和global $submenu变量,可以在将它们呈现到页面之前修改它们,但是在权限确定之后,可以在这个钩子上获得非常难看的放松权限,尽管限制非常简单,但下面是一个简单的示例:
add_action( 'admin_menu', function(){
global $menu, $submenu;
// Is the submenu I want in the page I want?
if( isset($submenu['my-top-level-slug']) ){
// Yes, we have an array of arrays (each submenu item = array)
foreach( $submenu['my-top-level-slug'] as $index => $submenu_array ){
//var_dump( $index );
// Search these arrays for my secondary slug
$search = array_search('my-secondary-slug', $submenu_array );
// This will return the submenu index if we found it, false if not
if( $search != false ){
// We found it! It's in this $index. Modify the [1]st element (permissions)
$submenu['my-top-level-slug'][$index][1] = 'manage_options';
// Stop processing this loop, we found what we came for.
break;
}
}
}
}, 11 );发布于 2021-11-10 15:38:41
更一般地(但多亏了@XHynx的具体解决方案):
functions.php
remove_action("admin_menu", 'menu');
add_action("admin_menu", 'my_menu');
function my_menu(){
/*copy the original function here and modify it */
}https://stackoverflow.com/questions/59935980
复制相似问题