繁体   English   中英

如何在 wordpress functions.php 中覆盖插件类函数?

[英]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_functionsome_other_function设置的任何some_other_function

现在你的插件有这一行add_action("admin_menu", array($this, 'menu')); ,它将自己的menu方法添加到admin_menu挂钩,优先级为10 这意味着您可以编写自己的函数并将其挂钩到具有较低(较高数字)优先级的admin_menu挂钩,例如1199 在该函数中,您可以使用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 $menuglobal $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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM