wordpress 过滤器文档?试图理解 add_filter()

Posted

技术标签:

【中文标题】wordpress 过滤器文档?试图理解 add_filter()【英文标题】:wordpress filters documentation? Trying to understand add_filter() 【发布时间】:2011-02-28 08:14:09 【问题描述】:

我多次阅读文档并且一直很难弄清楚该函数发生了什么。在查看文档以及查看源代码后,我越来越困惑。

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

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

这里我几乎都明白了:http://www.andrewnacin.com/2010/05/18/rethinking-template-tags-in-plugins/

但后来我不知道你如何传递参数以及最终被覆盖。

提前致谢。

【问题讨论】:

我认为,如果您已经无法理解过滤器和操作,那么 tut 只会更加令人困惑。您能解释一下您尝试使用它们的背景吗?然后我们可以更具体地满足您的需求,而不是仅仅重复食典。 【参考方案1】:

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

我正在尝试通过这种“add_filter”技术删除“屏幕选项”下的 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:

原来的函数似乎不是某些 CLASS 的一部分:

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' => _('链接关系 (XFN)'), '描述' => __('描述'), 直接在 WP 核心中,一切看起来都不错,所以我不确定是否可以通过这种方式覆盖所有 WP 功能。

非常感谢您的建议。 最好的问候,米洛

【讨论】:

【参考方案2】:

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

    过滤器和操作不相关(它们都是 WP 所谓的“钩子”类型,但在其他方面不相关)。上面您说“使用我的过滤器...”,但 do_action() 用于操作 not 过滤器。 标签(即 add_filter、apply_filter、add_action、do_action 的标签参数与 XML/html 意义上的标签无关(-也许你知道)。 在调用动作时,使用 do_action() 您可能希望在强制标记名称之外传递一个参数。上面你调用了 do_action('content_class'),首先,除非你首先使用标签名称“content_class”注册一个动作,否则它不会起作用,其次,在你的动作函数 content_class_filter 中(最好将 content_class_action 命名为is 与过滤器无关),有一个可选参数 $classes,它始终为 '',因为您没有在标记名称之后为 do_action 提供参数。另请注意,您可能打算写 $output = .. 过滤器不会“覆盖”任何东西(尤其是在 OO 语言意义上)。添加具有相同标签的多个过滤器将导致在调用标签的 apply_filters 时调用所有过滤器。您可以使用优先级参数控制排序。操作也是如此。

【讨论】:

【参考方案3】:

add_filter()apply_filters() 的伴随函数。在为某个过滤器运行apply_filters 之前(add_filter() 中的$tag 参数),您可以使用add_filter 为标签注册过滤器。当apply_filters() 使用该标签名称执行时,它会按顺序调用所有已注册的过滤器。过滤器用于通过函数传递数据以进行操作。例如,我经常发现自己使用的是 wp_list_pages 过滤器。我用它从页面列表中删除换行符。下面是它的工作原理:

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

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

然后我添加过滤器钩子: add_filter('wp_list_pages', 'my_list_pages_filter');

add_filter 告诉 WordPress “当函数 apply_filters 被调用且第一个参数是 'wp_list_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;

【讨论】:

【参考方案4】:

我已经在模板文件中放置了钩子:

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

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

function content_class() 
 do_action('content_class');

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

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

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

【讨论】:

以上是关于wordpress 过滤器文档?试图理解 add_filter()的主要内容,如果未能解决你的问题,请参考以下文章

板邓:wordpress中add_filter和apply_filters函数用法

德语特殊字符在 WordPress 架构中不起作用

如何更改 Wordpress 电子邮件的回复标题中的电子邮件地址

不能复制我的wordpress小部件

Wordpress 将过滤器添加到 the_content()

WordPress add_filter 不适用于 localhost 中的 robots_txt