【问题标题】:Wordpress walker call parent walk() methodWordpress walker 调用父 walk() 方法
【发布时间】:2016-05-19 11:14:35
【问题描述】:

在扩展 Walker 基类时,我需要扩展 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(),事情就会中断。

这个方法应该返回一些特定的值吗? 我应该以不同的方式调用父方法吗?

【问题讨论】:

  • 在检查了WP核心后,我看到walk()方法返回了一些输出,那么你有没有像return parent::walk($elements, $max_depth);这样尝试过?

标签: php wordpress class parent


【解决方案1】:

Walker::walk 将返回 walk 操作产生的字符串。 您将得到一个使用Walker::display_elementWalker::start_lvlWalker::start_el 等方法创建的文本... 您将从父方法获得的已经是 HTML 代码,可能很难在第二次以正确的方式修改,但如果您真的想这样做:

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

  /* Do something with the HTML output */

  return $html;
}

【讨论】:

  • 确实,你是对的,我错过了这一点,因为我期望从每个元素的核心多次调用 parent::walk。但事实并非如此
【解决方案2】:

正如@TheFallen 在评论中指出的那样,Wordpress 的 Walker 类会返回一个输出

// 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;  
     }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 2016-05-03
    • 2014-02-23
    • 2021-10-03
    相关资源
    最近更新 更多