如何在start_el()函数中挂钩Walker_Category_Checklist参数?

时间:2018-02-11 16:22:11

标签: wordpress hook

我正在尝试扩展Walker_Category_Checklist类。

class My_Walker_Category_Checklist extends Walker_Category_Checklist {
    function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) {
        var_dump( $args['MY_PAREMETER'] ); // Output is NULL...

        var_dump( $args['checked_ontop'] ); // This is NULL too...
    }
}

我需要将一些额外的参数传递给$args数组。此参数基于post meta,如果我将在get_post_meta()中调用start_el,则将对列表中的每个元素执行此操作,因为元素计数接近500,因此该元素将被执行。 在这里,我为wp_terms_checklist_args创建了钩子:

add_filter( 'wp_terms_checklist_args', function( $args, $post_id ) {
    if ( is_admin() ) {
        if ( !empty( $args['taxonomy'] ) && ( $args['taxonomy'] === 'my-taxonomy' ) && ( ! isset( $args['walker'] ) || ! $args['walker'] instanceof Walker ) ) {
            $args['walker']        = new My_Walker_Category_Checklist;

            $args['MY_PAREMETER'] = get_post_meta( $post_id, 'my_data', 1 );

            $args['checked_ontop'] = false;
        }
    }

    return $args;
}, 10, 2 );

$args['checked_ontop'] = false此参数有效但NULLstart_el,因此我理解这是不同的$args参数。 如何在扩展类中将其他数据传递给$args函数的start_el参数? 谢谢!

更新1

将我的参数添加到var_dump

后直接过滤$args来自wp_terms_checklist_args的{​​{1}}
$args

这是来自array(5) { ["taxonomy"]=> string(14) "my-taxonomy" ["popular_cats"]=> array(10) { [0]=> int(64) //... } ["walker"]=> object(My_Walker_Category_Checklist)#3282 (4) { ["tree_type"]=> string(8) "category" ["db_fields"]=> array(2) { ["parent"]=> string(6) "parent" ["id"]=> string(7) "term_id" } ["max_pages"]=> int(1) ["has_children"]=> NULL } ["my_parameter"]=> string(7) "my-data" ["checked_ontop"]=> bool(false) } var_dump函数的$args的{​​{1}}。这里没有在过滤器中添加的参数。

My_Walker_Category_Checklist

更新1.1 以下一种方式将args传递给start_el不会产生任何结果:

array(6) {
      ["taxonomy"]=>
      string(14) "my-taxonomy"
      ["disabled"]=>
      bool(false)
      ["list_only"]=>
      bool(false)
      ["selected_cats"]=>
      array(10) {
        [0]=>
        int(212)
        //...
      }
      ["popular_cats"]=>
      array(3) {
        [0]=>
        int(64)
        //...
      }
      ["has_children"]=>
      bool(true)
    }

这在保存所选术语时出现问题,因为wp_terms_checklist_args变量已被重写。其中$args['selected_cats']['custom_data'] = array( 'MY_PAREMETER' => 'wow!', ); 给出了下一个: [ “selected_cats”] =>

selected_cats

错过了所有选定的类别。

1 个答案:

答案 0 :(得分:1)

我认为最好的解决方案是将所需数据添加到子节点构造函数中。将在创建class时调用一次。

class My_Walker_Category_Checklist extends Walker_Category_Checklist {
    function __construct(){
        $this->myparam = 'my param';
    }
    //...
    function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) {
        var_dump( $this->myparam );
    }
}