WordPress Walker вызвать родительский метод Walk ()

При расширении базового класса Уокера мне нужно расширить walk() метод.

Тем не менее, позвонив родителю walk() метод не дает результатов.

Вот подходы, которые я попробовал:

public function walk($elements, $max_depth) {
parent::walk($elements, $max_depth);
}

public function walk($elements, $max_depth) {
$parent_class=get_parent_class($this);
$args = array($elements, $max_depth);

call_user_func_array(array($parent_class, 'walk'), $args);
}

Мне кажется, что как только я переопределю walk() вещи ломаются.

Должен ли этот метод возвращать какое-то конкретное значение?
Должен ли я вызвать родительский метод по-другому?

4

Решение

Walker::walk вернет строку, полученную в результате операции ходьбы.
То, что вы получите, это текст, который был создан с использованием методов Walker::display_element, Walker::start_lvl, Walker::start_el и так далее…
То, что вы получите от родительского метода, — это уже HTML-код, который, вероятно, будет трудно корректно изменить во второй раз, но если вы действительно хотите это сделать:

public function walk($elements, $max_depth) {
$html = parent::walk($elements, $max_depth);

/* Do something with the HTML output */

return $html;
}
2

Другие решения

Как указано в комментарии @TheFallen, класс Walker of WordPress возвращает результат

// Extracted from WordPress\wp-includes\class-wp-walker.php
public function walk( $elements, $max_depth ) {
$args = array_slice(func_get_args(), 2);
$output = '';

//invalid parameter or nothing to walk
if ( $max_depth < -1 || empty( $elements ) ) {
return $output;
}

...

Итак, если вы хотите расширить класс и перезаписать метод, Вы ДОЛЖНЫ сохранить оригинальное поведение, возвращая вывод тоже. Мое предложение:

class Extended_Walker extends Walker {
public function walk( $elements, $max_depth ) {
$output = parent::walk($elements, $max_depth);

// Your code do things with output here...

return $output;
}
}
2

По вопросам рекламы [email protected]