代码之家  ›  专栏  ›  技术社区  ›  chrisl-921fb74d

WordPress过滤器文档?正在尝试理解添加筛选器()。

  •  9
  • chrisl-921fb74d  · 技术社区  · 14 年前

    我读了几遍文档,一直很难弄清楚这个函数是怎么回事。在查看文档、查看源代码之后,我越来越困惑。

    add_filter($tag, $hook, $priority, $args);

    在我看来,新函数扩展了父函数。令我困惑的是钩子的哪些部分被覆盖了。在文档中的一些示例中,我看到一些变量替换为新$tag中的$args。

    我几乎完全理解: http://www.andrewnacin.com/2010/05/18/rethinking-template-tags-in-plugins/

    但我不知道你是如何传递参数的,而这些参数最终会被覆盖。

    事先谢谢。

    4 回复  |  直到 13 年前
        1
  •  12
  •   John P Bloch    14 年前

    add_filter() 是一个伴随函数 apply_filters() . 以前 apply_filters 为某个筛选器运行 $tag 论点 ADDIX FILTER() ),您可以使用 add_filter 为一个标记注册一个过滤器。什么时候? Apple yFixter() 使用该标记名执行,它按顺序调用所有已注册的筛选器。过滤器用于通过函数传递数据以进行操作。例如,我经常使用的是wp-list-pages过滤器。我用它从页面列表中删除换行符。这就是它的工作原理:

    首先,我定义一个函数,它接受一个参数,并在使用后返回它:

    function my_list_pages_filter($pages){
      $pages = preg_replace( array("\n","\r"), '', $pages );
      return $pages;
    }
    

    然后我加上过滤钩: 添加_filter(“wp_list_pages”、“my_list_pages_filter”);

    附加滤波器 告诉wordpress“当函数 应用滤波器 调用时,第一个参数为“wp\u list\u pages”,调用 my_list_pages_filter “过滤器必须至少发送一个值(任何类型:字符串、数组、整数等),并且它们期望函数返回一个值。”

    它们为您提供了一种方法,在将输入发送回来之前对其进行操作。

    do_action 是一个完全不同的钩子。要将信息发送到筛选函数,请执行以下操作(取自示例):

    <div id="content" <?php $class='post post_content'; echo apply_filters('my_custom_classes', $class); ?>>
    

    然后在functions.php文件中添加:

    add_filter('my_custom_classes','my_custom_classes_function');
    function my_custom_classes_function($classes){
      $output 'class="'. $classes.'"';
      return $output;
    }
    

    这是过滤器的一个基本用法,但它是一个开始。您可以通过相同的示例了解如何使用过滤器以及一些增强功能:

    function my_custom_classes_function($classes){
      $classes = explode( ' ', $classes );
      if(is_home())
        $classes[] = 'home_content';
      if(is_single())
        $classes[] = 'single_content';
      if(is_page())
        $classes[] = 'page_content';
      if(is_tag())
        $classes[] = 'tag_content';
      $output 'class="'. implode( ' ', $classes ) .'"';
      return $output;
    }
    
        2
  •  4
  •   DavidJ    13 年前

    克里斯, 你似乎对一些事情感到困惑:

    1. 过滤器和操作是不相关的(它们都是wp称之为“钩子”的类型,但在其他方面是不相关的)。上面你说“用我的过滤器……”,但是“做动作()是为了动作” 过滤器。
    2. 标签(即添加过滤器、应用过滤器、添加动作、做动作的标签参数)与XML/HTML意义上的标签无关(也许你知道)。
    3. 调用操作时,使用do_action()除了强制的标记名之外,您可能还希望传递一个参数。上面您调用了do-action(“content-class”),首先,除非您首先注册了一个标记名为“content-class”的操作,否则它将无效;其次,在您的操作函数content-class-filter(更好的名称是content-class-action,因为它与filters无关)中,它有一个可选的参数$classes,它可以始终为“”,因为您没有在标记名后提供要执行操作的参数。还请注意,您可能打算写$output=。
    4. 过滤器不会“覆盖”任何东西(特别是在OO语言意义上)。使用相同标记添加多个筛选器将导致在调用标记的Apply_筛选器时调用所有筛选器。可以使用priority参数控制排序。行动也是如此。
        3
  •  2
  •   CoolBeans Jake    13 年前

    这篇文章很好,但我必须犯一些愚蠢的错误,尽管如此……

    我试图通过这个“添加过滤器”技术删除“屏幕选项”下WP3+导航菜单中的一些项目:

    wp admin/includes/nav-menus.php:

    function wp_nav_menu_manage_columns() {
        return array(
            '_title' => __('Show advanced menu properties'),
            'cb' => '<input type="checkbox" />',
            'link-target' => __('Link Target'),
            'css-classes' => __('CSS Classes'),
            'xfn' => __('Link Relationship (XFN)'),
            'description' => __('Description'),
        );
    }
    

    mytheme/function.php:

    原始函数似乎不是某个类的一部分:

    add_filter('wp_nav_menu_manage_columns', 'new_wp_nav_menu_manage_columns');
    function new_wp_nav_menu_manage_columns() {
        return array(
            '_title' => __('Show advanced menu properties'),
            'cb' => '<input type="checkbox" />',
            'link-target' => __('Link Target'),
        );
    }
    

    但结果我可以看到原始的“屏幕选项”和所有项目。 如果我去掉这些线条: 'css classes'=>。_ ('css classes'), ‘xfn’=& gt; (‘链接关系(XFN)’, '说明'=>uu('说明'), 直接在wp核心中,一切看起来都正常,所以我不确定是否可以用这种方式覆盖所有wp函数。

    非常感谢你的建议。 谨致问候,米洛

        4
  •  0
  •   chrisl-921fb74d    14 年前

    我把钩子放在模板文件中:

    <div id="content" <?php content_class() ?>>
    

    钩子只在函数文件中自我执行:

    function content_class() {
     do_action('content_class');
    }
    

    使用我的过滤器,我试图将类传递给这个函数。

    function content_class_filter($classes='') {
       $output 'classes="'. $classes.'"';
       return $output;
    }
    

    最后,我真的很困惑如何编写过滤器…