Intereting Posts
Stale $ GLOBALS после пользовательского пустого набора результатов WP_Query беспокоит мой шаблон, чья ошибка? Отобразить категории inline Список сообщений категории – проблема thumbnail_size Переходы is_front_page с параметрами url, генерируемыми плагином Как сохранить несколько параметров из раскрывающегося списка в профиле пользователя Добавление и обновление повторяющихся метаданных настраиваемых полей Введите пароль в поле «Хэш» в базу данных, распакуйте в админ? Как я могу отобразить список только категорий, которые отмечены как «признанные» в бэкэнд? Как я перечисляю категории и общие категории для сообщений ниже этих категорий? Имеет ли WordPress «API-интерфейс формы», Получить страницы только с определенной таксономией Получение эскиза эскиза таксономии Отфильтрованная таблица в wordpress Лучшие практики для полностью настраиваемой домашней страницы – без плагинов RSS-канал для динамического набора условий пользовательской таксономии

Как отредактировать / заменить функцию Parent functions.php в Child Theme, чтобы добавить класс «Walker»

Я использую тему «Tesseract» в качестве родительской темы, и я бы хотел использовать класс walker для получения описаний меню. Тем не менее, мне трудно понять, как редактировать php, потому что я не знаю, как правильно заменить функции родительской темы.

Мне нужно изменить функцию родительской темы

Согласно этой странице , я должен найти найти wp_nav_menu() , который, по их wp_nav_menu() , автор, скорее всего, в header.php, и замените этот вызов функции этим.

 <?php $walker = new Menu_With_Description; ?> <?php wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu', 'walker' => $walker ) ); ?> 

Проблема в том, что для моей темы wp_nav_menu() вызывается в моем файле functions.php родительской темы, а не в header.php, хотя содержащая функция ( tesseract_output_menu ) вызывается внутри header.php. Это означает, что я собираюсь, скорее всего, заменить функцию родительской темы, но я не уверен, как это сделать правильно.

tesseract_output_menu – это эта функция внутри родительского файла child_tesseract_output_menu темы, который вызывается внутри header.php, я попытаюсь изменить его на функцию child_tesseract_output_menu .

Это функция родительской темы:

 function tesseract_output_menu( $cont, $contClass, $location, $depth ) { switch( $location ) : case 'primary': $hblox = 'header'; break; case 'primary_right': $hblox = 'header_right'; break; case 'secondary': $hblox = 'footer'; break; case 'secondary_right': $hblox = 'footer_right'; break; endswitch; $locs = get_theme_mod('nav_menu_locations'); $menu = get_theme_mod('tesseract_' . $hblox . '_menu_select'); $isMenu = get_terms( 'nav_menu' ) ? TRUE : FALSE; $locReserved = ( $locs[$location] ) ? TRUE : FALSE; $menuSelected = ( is_string($menu) ) ? TRUE : FALSE; // IF the location set as parameter has an associated menu, it's returned as a key-value pair in the $locs array - where the key is the location and the value is the menu ID. We need this latter to get the menu slug required later -in some cases- in the wp_nav_menu params array. if ( $locReserved ) { $menu_id = $locs[$location]; // $value = $array[$key] $menuObject = wp_get_nav_menu_object( $menu_id ); $menu_slug = $menuObject->slug; }; $custSet = ( $menuSelected && ( $menu !== 'none' ) ); if ( empty( $isMenu ) ) : //Case 1 - IF THERE'S NO MENU CREATED -> easy scenario: no location setting, no customizer setting ( this latter only appears if there IS at least one menu created by the theme user ) => display basic menu wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu', 'container_class' => '', 'container' => FALSE, 'depth' => $depth ) ); elseif ( !empty( $isMenu ) ) : //Case 2 - THERE'S AT LEAST ONE MENU CREATED if ( !$custSet && $locReserved ) { //no setting in customizer OR dropdown is set to blank value, location SET in Menus section => display menu associated with this location in Appearance -> wp_nav_menu( array( // 'menu' => $menuSlug, 'menu' => $menu_slug, 'theme_location' => $location, 'menu_class' => 'nav-menu', 'container_class' => $contClass, 'container' => $cont, 'depth' => $depth ) ); } else if ( !$custSet && !$locReserved ) { //no setting in customizer OR dropdown is set to blank value, location NOT SET in Menus section => display basic menu wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu', 'container_class' => '', 'container' => FALSE, 'depth' => $depth ) ); } else if ( $custSet ) { //menu set in customizer AND dropdown is NOT set to blank value, location SET OR NOT SET in Menus section => display menu set in customizer ( setting a menu to the given location in customizer will update any existing location-menu association in Appearance -> Menus, see function tesseract_set_menu_location() in functions.php ) wp_nav_menu( array( 'menu' => $menu, 'theme_location' => $location, 'menu_class' => 'nav-menu', 'container_class' => $contClass, 'container' => $cont, 'depth' => $depth ) ); } endif; } 

Стек представляет собой пример

Из того, что я знаю, я, вероятно, захочу использовать действие или фильтр для этого, как показано в this question : как переопределить родительские функции в дочерних темах?

Пример мне не ясен

Проблема в том, что в примере, который я пытаюсь выполнить, не объяснено полностью, и я не совсем понимаю, как работают фильтры. В этом примере стека они, похоже, удаляют функцию, называемую twentyten_auto_excerpt_more , с одним именем osu_twentyten_auto_excerpt_more , но они делают это с использованием первого аргумента, называемого excerpt_more :

Функция переопределения дочерних элементов в ответе «Стек»:

 // Override read more link function osu_twentyten_continue_reading_link() { return ' <a href="'. get_permalink() . '">' . __( 'Read on <span class="meta-nav">&rarr;</span>', 'twentyten-child' ) . '</a>'; } function osu_twentyten_auto_excerpt_more( $more ) { return ' &hellip;' . osu_twentyten_continue_reading_link(); } remove_filter( 'excerpt_more', 'twentyten_auto_excerpt_more' ); add_filter( 'excerpt_more', 'osu_twentyten_auto_excerpt_more' ); 

Поскольку я хочу изменить tesseract_output_menu , на основании этого примера, я уверен, что я бы назвал свою child_tesseract_output_menu функцию заменой родительской функции child_tesseract_output_menu чем-то вроде child_tesseract_output_menu , я думаю, это ясно. Но то, что я не понимаю, является эквивалентом / аналогом первого аргумента в моем случае, который является тем же exerpt_more в приведенном выше примере. Они не говорят, что такое excerpt_more . Мне нужно знать, что первый аргумент remove_filter and add_filter` должен быть в моем случае.

Чтобы сделать это более ясным

Пример стека

  1. используемые функции: add filter , remove filter
  2. второй аргумент remove filter (родительская функция, подлежащая замене): twentyten_auto_excerpt_more
  3. второй аргумент фильтра добавления ( osu_twentyten_auto_excerpt_more функция): osu_twentyten_auto_excerpt_more
  4. первый аргумент добавить фильтр и удалить фильтр: exerpt more

Мой случай, v1: замена tesseract_output_menu :

  1. используемые функции: add filter , remove filter
  2. второй аргумент remove filter (родительская функция для замены): tesseract_output_menu
  3. второй аргумент фильтра добавления ( child_tesseract_output_menu функция): child_tesseract_output_menu
  4. первый аргумент добавить фильтр и удалить фильтр: ??? Какую функцию мне нужно включить в первый аргумент ???

Я понимаю, что вместо этого я хочу упорядочить вещи таким образом

Мой случай, v2: замена wp_nav_menu :

  1. используемые функции: add filter , remove filter
  2. второй аргумент remove filter (родительская функция для замены): wp_nav_menu
  3. второй аргумент фильтра добавления ( child_wp_nav_menu функция): child_wp_nav_menu
  4. первый аргумент добавить фильтр и удалить фильтр: tesseract_output_menu

Какой лучший подход взять, если я должен использовать v1 моего дела, что является эквивалентом excerpt_more в моем случае?

Solutions Collecting From Web of "Как отредактировать / заменить функцию Parent functions.php в Child Theme, чтобы добавить класс «Walker»"

Перейдите в свой functions.php в своей дочерней теме, добавьте это:

 function childtheme_override_tesseract_output_menu( $cont, $contClass, $location, $depth ) { //tesseract_output_menu function code modified as you wish here } 

В родительской теме functions.php оберните функцию tesseract_output_menu следующим образом:

 if (function_exists('childtheme_override_tesseract_output_menu')) { /** * run the child override */ function tesseract_output_menu() { childtheme_override_tesseract_output_menu(); } } else { /** * run the original parent function */ function tesseract_output_menu( $cont, $contClass, $location, $depth ) { //original code untouched } } 

таким образом, вы можете переопределить родительскую функцию темы, это стандартный способ, я не уверен, почему функция родительской темы уже не обернута таким образом, вы можете видеть в темах, которые поставляются с wordpress для того же кода для него, поэтому функция может быть заменена, if ( ! function_exists( 'twentysixteen_setup' ) ) .

Я понял более легкий подход, который работал, который включал редактирование файла header.php моего ребенка

  1. В файле header.php файла child найдите все вызовы функции wp_nav_menu называется wp_nav_menu .
  2. Замените те вызовы tesseract_output_menu a на новую функцию, которая называется child_tesseract_output_menu .
  3. Включите нужную отредактированную версию этой функции в файл functions.php моей дочерней темы.

Это функция включения класса walker в файле function.php моей дочерней темы:

 function child_tesseract_output_menu( $cont, $contClass, $location, $depth ) { switch( $location ) : case 'primary': $hblox = 'header'; break; case 'primary_right': $hblox = 'header_right'; break; case 'secondary': $hblox = 'footer'; break; case 'secondary_right': $hblox = 'footer_right'; break; endswitch; $locs = get_theme_mod('nav_menu_locations'); $menu = get_theme_mod('tesseract_' . $hblox . '_menu_select'); $isMenu = get_terms( 'nav_menu' ) ? TRUE : FALSE; $locReserved = ( $locs[$location] ) ? TRUE : FALSE; $menuSelected = ( is_string($menu) ) ? TRUE : FALSE; // IF the location set as parameter has an associated menu, it's returned as a key-value pair in the $locs array - where the key is the location and the value is the menu ID. We need this latter to get the menu slug required later -in some cases- in the wp_nav_menu params array. if ( $locReserved ) { $menu_id = $locs[$location]; // $value = $array[$key] $menuObject = wp_get_nav_menu_object( $menu_id ); $menu_slug = $menuObject->slug; }; $custSet = ( $menuSelected && ( $menu !== 'none' ) ); if ( empty( $isMenu ) ) : //Case 1 - IF THERE'S NO MENU CREATED -> easy scenario: no location setting, no customizer setting ( this latter only appears if there IS at least one menu created by the theme user ) => display basic menu $walker = new Menu_With_Description; wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu', 'container_class' => '', 'container' => FALSE, 'depth' => $depth, 'walker' => $walker ) ); elseif ( !empty( $isMenu ) ) : //Case 2 - THERE'S AT LEAST ONE MENU CREATED if ( !$custSet && $locReserved ) { //no setting in customizer OR dropdown is set to blank value, location SET in Menus section => display menu associated with this location in Appearance -> $walker = new Menu_With_Description; wp_nav_menu( array( // 'menu' => $menuSlug, 'menu' => $menu_slug, 'theme_location' => $location, 'menu_class' => 'nav-menu', 'container_class' => $contClass, 'container' => $cont, 'depth' => $depth, 'walker' => $walker ) ); } else if ( !$custSet && !$locReserved ) { //no setting in customizer OR dropdown is set to blank value, location NOT SET in Menus section => display basic menu $walker = new Menu_With_Description; wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu', 'container_class' => '', 'container' => FALSE, 'depth' => $depth, 'walker' => $walker ) ); } else if ( $custSet ) { //menu set in customizer AND dropdown is NOT set to blank value, location SET OR NOT SET in Menus section => display menu set in customizer ( setting a menu to the given location in customizer will update any existing location-menu association in Appearance -> Menus, see function tesseract_set_menu_location() in functions.php ) $walker = new Menu_With_Description; wp_nav_menu( array( 'menu' => $menu, 'theme_location' => $location, 'menu_class' => 'nav-menu', 'container_class' => $contClass, 'container' => $cont, 'depth' => $depth, 'walker' => $walker ) ); } endif; }