Замена функциональности ядра WordPress с помощью плагина - PullRequest
1 голос
/ 28 июля 2011

Я создаю плагин WordPress для пользовательского макета меню.Мне хорошо известно, что я мог бы так же легко внедрить это меню непосредственно в тему, и я довольно подробно ознакомился с функциями и ограничениями wp_nav_menu(), плюс я уже попробовал и протестировал каждый уже созданный плагин для замены по умолчанию.Меню WordPress.

Я хочу использовать плагин, поскольку мой клиент будет реализовывать его на нескольких разных сайтах WordPress, многие из которых работают на разные темы - и большинство из них - темы, которые я не создавал, и я делаю это.не хочу переписывать свой код на случай, если они обновят тему в будущем.

Когда я искал способ реализовать меню в теме, я обнаружил, что с тех пор существует только два хороших метода.нет крючка или фильтра, вызываемого во время отображения меню.Первый заключается в изменении темы для поиска плагина (это похоже на метод, используемый PixoPoint и многими другими плагинами меню):

header.php:

if(function_exists('pixopoint_menu')){
    pixopoint_menu();
} else {
    wp_nav_menu();
}

Второй метод - это класс ходунков:

plugin.php:

class my_walker_class Extends Walker_Nav_Menu {
    function start_el(&$output, $item, $depth, $args) {
        /*
        *  Etc. Etc.
        */
    }
}

header.php:

wp_nav_menu( Array( 'walker' => 'my_walker_class' ) );

Однако, как вы заметите, оба эти метода требуют модификации стандартного файла header.php.

В идеале я хотел бы просто заменить функцию wp_nav_menu(), если мой плагин загружен,так как это дало бы поддержку моего плагина для большинства тем без необходимости редактировать какие-либо файлы темы.Есть ли хороший способ сделать это?Или есть лучший способ написать плагин меню, которого я не вижу?

1 Ответ

2 голосов
/ 29 июля 2011

Вы можете использовать фильтр wp_nav_menu_args, чтобы изменить аргументы, переданные в wp_nav_menu, чтобы вы могли указать свой собственный класс обходчика.

add_filter('wp_nav_menu_args', 'my_wp_nav_menu_args_filter');
function my_wp_nav_menu_args_filter($args = array()) {
  $args['walker'] = new my_walker_class();
  return $args;
}
...