首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在wordpress functions.php中重写插件类函数?

如何在wordpress functions.php中重写插件类函数?
EN

Stack Overflow用户
提问于 2020-01-27 17:21:38
回答 2查看 4.8K关注 0票数 3

我想基本上覆盖我的Wordpress functions.php中的插件类函数。我想给编辑器的插件设置访问权限。有办法吗?因为它有一个构造函数。会非常感激的。

插件代码

代码语言:javascript
复制
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

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2020-01-27 19:23:58

简短的回答,你试过使用像管理菜单编辑器这样的管理菜单编辑器插件吗?我没有经验,因此不能保证它,但它似乎很好的审查和管理。

编辑:如果他们正在对UI方法以及admin_menu钩子进行性能检查,那么最好使用WP_Role::add_cap()WPDM_MENU_ACCESS_CAP添加到editor角色中。您必须确保该功能不允许他们访问其他他们不应该访问的东西。根据常量的名称,它听起来很好,但是您需要粗略地浏览一下插件,以确保。

长答案:对于WordPress,通常情况下,如果操作正确,则很少需要“覆盖”插件类、类方法或函数(不过,有时也需要“覆盖”)。伟大的关于WordPress的事情之一是它的钩子系统,特别是它的动作钩

当插件使用add_action()并省略第三个参数($priority)时,默认情况下设置为10。优先级的工作方式是先在这个钩子上运行较低的数字,因此请看下面的内容:

代码语言:javascript
复制
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_functionsome_other_function中设置的任何内容。

现在您的插件有了这一行add_action("admin_menu", array($this, 'menu'));,它将自己的menu方法添加到具有10优先级的admin_menu钩子中。这意味着您可以编写自己的函数并将其挂钩到admin_menu钩子上,优先级较低(较高),如1199。在该函数中,可以使用remove_submenu_page()函数删除插件添加的页面,然后使用add_menu_page()函数将其添加回插件,但更改任何参数!例如:

代码语言:javascript
复制
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 $menuglobal $submenu变量,可以在将它们呈现到页面之前修改它们,但是在权限确定之后,可以在这个钩子上获得非常难看的放松权限,尽管限制非常简单,但下面是一个简单的示例:

代码语言:javascript
复制
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 );
票数 2
EN

Stack Overflow用户

发布于 2021-11-10 15:38:41

更一般地(但多亏了@XHynx的具体解决方案):

functions.php

代码语言:javascript
复制
remove_action("admin_menu", 'menu');
add_action("admin_menu", 'my_menu');

function my_menu(){
    /*copy the original function here and modify it */
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59935980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档