我是靠谱客的博主 老迟到黑猫,最近开发中收集的这篇文章主要介绍WordPress动作和筛选器:有什么区别?,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

动作和筛选器挂钩是各种WordPress API的基本组成部分。 没有它们,您在主题和(尤其是)插件方面的工作将受到限制。

但是有时容易混淆两者,特别是在WordPress具有名称相同的动作钩子和过滤器钩子的情况下。

在本文中,我将定义动作钩子和过滤器钩子,并描述它们之间的区别,并演示如何在主题和插件中使用它们。 我还将举例说明何时使用它们。

当您在代码中添加动作和过滤器挂钩(或您将函数挂钩)时,它有助于了解WordPress如何调用动作和过滤器以及以什么顺序发生。 我不会在此详细介绍,因为我们还有另一本教程可以完成该工作。

定义和差异

让我们从一些定义开始。 我还将定义动作,过滤器挂钩和函数,因此您可以看到它们之间的区别。

功能

功能是大多数人学习WordPress开发时首先要使用的功能; 如果您已将代码添加到主题的functions.php文件中,则将编写一个函数。

函数指定如何发生。 您可以编写一个函数来查询数据,输出内容或执行许多其他任务。 您可以直接在主题的模板文件中调用(执行)函数,也可以将它们挂接到动作或过滤器挂钩。 功能还可以包括模板标签(例如条件标签),以指定何时应应用功能。

我将在本文后面向您展示执行函数的不同方式。

动作钩

当发生某种事情(例如,加载页面,用户登录或您在主题或插件中定义的自定义操作)时,将触发操作挂钩(或操作)。

您可以使用do_action()函数添加自己的动作挂钩,我将在稍后演示。 您挂接到该操作的所有函数都将在代码中的该点运行。

滤钩

过滤器挂钩(或过滤器)控制事件的发生方式或更改已输出的内容。 您可以使用过滤器以特定格式输出元数据,覆盖插件输出的文本或完全阻止显示某些内容。

您可以使用apply_filters()函数在代码中添加过滤器, apply_filters()我将进行演示。 正如“应用”一词所表示的那样,您将过滤器应用于现有代码,而使用do_action()创建的操作为空,直到您将函数挂接到它。

使用函数,动作和过滤器

让我们看一些示例,这些示例演示如何使用函数,操作和过滤器。 首先,我们将研究直接在您的代码中使用函数而不将它们附加到钩子上。

直接调用函数

这是直接在模板文件中调用的函数的示例。 在我的客户站点中,我在页脚中添加了一个colophon,其中包括版权信息。 功能如下:

if ( ! function_exists( 'compass_colophon' ) ) {
function compass_colophon() { ?>
    <section class="colophon" role="contentinfo">
		<small class="copyright left">
			<?php echo compass_copyright(); ?>
			<a href="<?php echo home_url( '/' ) ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home">
			<?php bloginfo( 'name' ); ?>
			</a>
		</small><!-- #copyright -->

		<small class="credits right">
				Powered by <a href="http://wordpress.org/">WordPress</a> and designed by <a href="http://compass-design.co.uk">Compass Design</a>.
			</a>
		</small><!-- #credits -->
	</section><!--#colophon-->
	<?php }
}

当我在父主题中使用该功能时,该功能是可插入的。 如果我随后在子主题中创建一个具有相同名称的新函数,则它将覆盖此函数。 请注意,该函数包括另一个函数compass_colophon() ,直接在代码中调用它。

该函数位于我的父主题的functions.php文件中。 我可以在主题的footer.php文件中直接调用它,如下所示:

compass_colophon();

这会在我调用主题的位置输出函数中的代码。 您还可以将参数传递给函数,然后在函数内部使用这些参数。

正如我将在稍后演示的那样,该功能也可以与动作或过滤器挂钩。

将功能挂钩到动作

与其直接调用该colophon函数,不如将它附加到一个钩子上,它将具有更大的灵活性。

创建动作挂钩

我可以在footer.php文件中的那个位置添加一个动作钩子,而不是在我的页脚文件中调用compass_colophon()函数,方法是:

do_action( 'compass_in_footer' );

do_action()函数具有一个强制性参数,它是操作的名称。 您还可以选择向其添加参数。

将功能挂钩到动作

因此,现在无需调用我的colophon函数,而是需要将其挂钩到新的action挂钩上。 在我的functions.php文件中,将其添加到我的函数中:

add_action( 'compass_in_footer', 'compass_colophon' );

这将我的函数挂接到compass_in_footer动作,这意味着我函数内的代码将在放置该动作的代码点处运行。 第一个参数是动作挂钩的名称,第二个参数是我的函数的名称。

这样做的好处是,您可以将多个功能挂接到同一操作上,并且可以设置优先级,以便它们按您希望的顺序触发。

假设我还有另一个函数要钩到我的compass_in_footer钩子,即compass_smallprint() ,它包含一些更小的字体:

if ( ! function_exists( compass_smallprint() ) ) {
    function compass_smallprint() {
		// contents of function here
	}
}
add_action( 'compass_in_footer', 'compass_smallprint', 20 );

您可以在此处看到我在add_action()函数中添加了第三个参数,这是优先级。 默认优先级为10 ,如果您将此保留空白,则将应用该优先级。 所以,因为我还没有设置优先级为我compass_colophon()函数,设置20对compass_smallprint()函数将使该函数运行 compass_colophon()函数。

从动作中取消功能

有时您想要停止运行某个功能,并且由于无法插入而无法覆盖它。 如果该函数已被挂钩到动作挂钩,则可以使用remove_action()函数来完成此操作。

所以,如果我想阻止我的compass_smallprint()函数的运行,我解开它从compass_in_footer像这样的动作:

remove_action( 'compass_in_footer', 'compass_smallprint', 20 );

remove_action()函数具有三个参数:动作挂钩的名称,函数的名称以及该功能最初与动作挂钩的优先级。 您必须包括此工作的优先级。

如果要阻止所有功能执行,也可以从动作中取消所有功能。 进行此操作时请小心,因为有些功能可能会导致您不了解操作。

为此,请使用remove_all_actions()函数:

remove_all_actions( 'compass_in_footer' );

将优先级数字添加为第二个参数只会删除以您指定的优先级挂接到该动作挂钩的函数,从而为您提供更多控制权。

挂钩函数到过滤器

您还可以选择挂钩函数以过滤挂钩。 要更改或覆盖某些现有代码时,可以执行此操作。 创建过滤器挂钩时(使用apply_filters()函数),您可以将其包装在主题或插件中的代码周围,然后通过连接到挂钩的任何过滤器进行更改。

如果您具有要覆盖默认设置的主题或插件选项,或者正在创建的父主题可能具有被子主题覆盖的元素,则此功能很有用。

创建过滤器挂钩

apply_filters()函数具有三个参数:过滤器挂钩的名称,要过滤的值(即默认值)和可选变量,然后将这些可选变量传递给连接到过滤器的函数。

您可以在主题模板文件中或通过动作挂钩挂钩的函数中添加过滤器。 让我们来看看这两个选项。

返回我的compass_colophon()函数,通过将其内容添加到apply_filters()函数内部的footer.php文件中,将其转换为过滤器,如下所示:

echo apply_filters( 'compass_colophon', '
    <section class="colophon" role="contentinfo">
		<small class="copyright left">
			<?php echo compass_copyright(); ?>
			<a href="<?php echo home_url( '/' ) ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home">
			<?php bloginfo( 'name' ); ?>
			</a>
		</small><!-- #copyright -->

		<small class="credits right">
				Powered by <a href="http://wordpress.org/">WordPress</a> and designed by <a href="http://compass-design.co.uk">Compass Design</a>.
			</a>
		</small><!-- #credits -->
	</section><!--#colophon-->'
);

这将输出我设置为apply_filters()函数的第二个参数的代码。

但是,我不想将其直接添加到主题模板文件中,因此,我会将过滤器添加到我已经通过动作钩子附加的函数中。

所以,我的加compass_in_footer行动,我的footer.php使用文件do_action()函数如上文所示,然后我创造我的一个函数functions.php文件,该文件被钩到行动,并包含一个过滤器:

if ( ! function_exists( 'compass_colophon' ) ) {
function compass_colophon() {
    echo apply_filters( 'compass_colophon_filter', '
		<section class="colophon" role="contentinfo">
			<small class="copyright left">
				<?php echo compass_copyright(); ?>
				<a href="<?php echo home_url( '/' ) ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home">
				<?php bloginfo( 'name' ); ?>
				</a>
			</small><!-- #copyright -->
	
			<small class="credits right">
					Powered by <a href="http://wordpress.org/">WordPress</a> and designed by <a href="http://compass-design.co.uk">Compass Design</a>.
				</a>
			</small><!-- #credits -->
		</section><!--#colophon-->'
	);
}
add_action( 'compass_in_footer', 'compass_colophon' );

这意味着我现在可以通过以下三种方式之一覆盖默认内容:

  • 通过在我的子主题中创建一个称为compass_colophon()的新函数,该函数将覆盖我的父主题中的该函数,因为它是可插入的
  • 通过从compass_in_footer动作钩子上解开compass_colophon()函数并编写一个新函数,将其附加到该函数上
  • 通过创建一个新的功能,其余然后勾到compass_colophon_filter滤波器钩,它覆盖在我的值apply_filters()函数

在现实生活中,您不需要这么多的选择,因此更有可能将过滤器应用于函数中部分内容而不是全部内容。

因此,我可以创建两个过滤器,一个用于版权部分,另一个用于信用:

if ( ! function_exists( 'compass_colophon' ) ) {
function compass_colophon() {
    
	echo '<section class="colophon" role="contentinfo">';
		
		echo apply_filters( 'compass_copyright_filter', '
			<small class="copyright left">
				<?php echo compass_copyright(); ?>
				<a href="<?php echo home_url( '/' ) ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home">
				<?php bloginfo( 'name' ); ?>
				</a>
			</small><!-- #copyright -->'
		);
		
		echo apply_filters( 'compass_copyright_filter', '
			<small class="credits right">
					Powered by <a href="http://wordpress.org/">WordPress</a> and designed by <a href="http://compass-design.co.uk">Compass Design</a>.
				</a>
			</small><!-- #credits -->'
		);
	echo '</section><!--#colophon-->';
}
add_action( 'compass_in_footer', 'compass_colophon' );

然后,我可以通过取消挂钩或在子主题中编写一个新的指南针功能来覆盖我的整个罗盘功能,或者可以创建一个钩在compass_copyright_filter _ compass_copyright_filter compass_credits_filter过滤器或compass_credits_filter过滤器过滤器钩子上的函数,以分别覆盖每个元素。

挂钩函数到过滤器

要将函数挂钩到过滤器挂钩,请使用add_filter()函数,该函数具有两个参数:挂钩的名称和函数的名称。

因此,要更改积分,我将编写以下函数:

function new_credits() { ?>
    <small class="credits right">
		Powered by <a href="http://wordpress.org/">WordPress</a> and designed by <a href="http://rachelmccollin.co.uk">Rachel McCollin</a>.
			</a>
	</small><!-- #credits -->
<?php }
add_filter( 'compass_credits_filter', 'new_credits' );

这将覆盖值集我原来compass_credits_filter过滤钩子与我的内容new_credits()功能,但保留一切compass_colophon()函数相同。

您还可以在将函数挂钩到过滤器时指定优先级,方法与操作挂钩完全相同。 优先级较低的功能将首先运行。

从过滤器中取消功能

与动作挂钩一样,您也可以从过滤器挂钩中删除功能。 您可以使用remove_filter()函数执行此操作,该函数具有三个参数:过滤器挂钩的名称,函数的名称和优先级,如果在最初将函数挂钩到过滤器时设置了优先级,则优先级是必需的。

因此,要删除我的new_credits()函数,请使用以下代码:

remove_filter( 'compass_credits_filter', 'new_credits' );

然后,代码输出将恢复为我在原始apply_filters()函数中指定的值。 因此,如果我想删除new_credits()函数而在其位置上没有任何显示,则必须添加一个新函数。 然后,我解开第一个函数并像这样钩住我的新函数:

function no_credits() {
    return;
}
remove_filter( 'compass_credits_filter', 'new_credits' );
add_filter( 'compass_credits_filter', 'no_credits' );

摘要

了解动作钩子和过滤器钩子之间的区别,并能够有效地使用它们,将有助于您的主题和插件开发。 实际上,如果不使用至少一种类型的钩子,就根本不能编写插件,因为激活插件中的代码的唯一方法是通过附加到其上的动作和过滤器钩子。

本指南向您展示了如何使用功能,动作挂钩和一个或多个过滤器挂钩添加相同的功能,以及如何从挂钩中删除功能的技巧,以及有关每种技巧何时更有用的建议。

除了将函数挂钩到您自己创建的动作和过滤器挂钩之外,您还可以将它们挂钩到WordPress提供的动作和过滤器 ,例如wp_head动作或body_class过滤器。

翻译自: https://code.tutsplus.com/articles/wordpress-actions-and-filters-whats-the-difference--cms-25700

最后

以上就是老迟到黑猫为你收集整理的WordPress动作和筛选器:有什么区别?的全部内容,希望文章能够帮你解决WordPress动作和筛选器:有什么区别?所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部