Как я могу переопределить функцию класса плагина в функциях WordPress. php? - PullRequest
1 голос
/ 27 января 2020

Я хочу переопределить функцию класса плагина в моих функциях Wordpress. 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

Спасибо.

1 Ответ

1 голос
/ 27 января 2020

Краткий ответ, вы пытались использовать плагин редактора меню администратора, такой как Редактор меню администратора ? У меня нет опыта работы с ним, и поэтому я не могу поручиться за него, но он, кажется, хорошо проверен и управляется.


Редактировать : Если они выполняют проверку возможностей метод 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.

Для чего это хорошо, в том, что func имеет доступ для изменения или отмены всего, что установлено в some_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 вам нужно захватить глобально созданный метод класса, вызвать его как метод stati c или создать новый экземпляр класса и использовать там метод. Я сделал удар в том, что может быть там, но не видя плагин, я не могу сказать. Например, у меня есть плагин, в котором мне нужно связываться с плагином 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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...