[英]How can i override plugin class function in wordpress functions.php?
我想基本上覆盖我的 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
谢谢。
简短的回答,您是否尝试过使用管理菜单编辑器插件,例如Admin Menu Editor ? 我没有这方面的经验,因此不能保证它,但它似乎得到了很好的审查和管理。
编辑:如果他们正在对UI
方法以及admin_menu
挂钩进行功能检查,则最好使用WP_Role::add_cap()
将WPDM_MENU_ACCESS_CAP
添加到editor
角色。 您必须确保该功能不会让他们访问他们不应该访问的其他东西。 根据常量的名称,听起来没问题,但您需要粗略地浏览一下插件以确保。
长答案:使用 WordPress,通常如果操作正确,您很少需要“覆盖”插件类、类方法或函数(尽管有时您会这样做)。 WordPress 的一大优点是它的Hooks系统,特别是它的Action Hooks 。
当插件使用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。
这有什么some_other_function
,是func
可以修改或撤消some_function
和some_other_function
设置的任何some_other_function
。
现在你的插件有这一行add_action("admin_menu", array($this, 'menu'));
,它将自己的menu
方法添加到admin_menu
挂钩,优先级为10
。 这意味着您可以编写自己的函数并将其挂钩到具有较低(较高数字)优先级的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
的最后一个参数中,您需要获取全局实例化的类方法,将其作为静态方法调用,或者实例化类的新实例并在那里使用该方法。 我试了一下那里可能有什么,但没有看到插件,我无法判断。 例如,我有一个插件,我必须弄乱 Elegant Theme 的“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
(所以该项目不会被添加)。
一般来说,如果可能的话,我更喜欢 unhook/rehook 方法,因为它会更清楚地了解你在做什么,为什么,并且它在两个方向上都有效(限制/放松)。 但是,在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 );
更一般的(但感谢@XHynx 的特定解决方案):
函数.php
remove_action("admin_menu", 'menu');
add_action("admin_menu", 'my_menu');
function my_menu(){
/*copy the original function here and modify it */
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.