WordPress 操作与过滤器:了解区别

WBOY
WBOY 原创
2023-08-31 16:25:07 1032浏览

WordPress 操作与过滤器:了解区别

  • 函数
  • 动作挂钩
  • 过滤器挂钩
  • 直接调用函数
  • 将函数挂钩到操作
  • 将函数挂钩到过滤器

操作和过滤器挂钩是各种 WordPress API 的基本组成部分。没有它们,您在主题和(尤其是)插件中的功能就会受到限制。

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

在本文中,我将定义操作和过滤器挂钩并描述它们之间的区别,并且我将演示如何在主题和插件中使用它们。我还将给出一些示例,说明您何时可以使用它们。

当您在 WordPress 中添加操作并将过滤器挂钩添加到代码中(或者将函数挂钩到它们)时,它有助于了解 WordPress 如何调用操作和过滤器以及按什么顺序发生的情况。我不会在这里详细介绍这一点,因为我们有另一个教程可以完成这项工作。

定义和差异

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

函数

函数是大多数人在学习 WordPress 开发时首先接触到的东西;如果您已将代码添加到主题的 functions.php 文件中,那么您将编写一个函数。

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

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

动作挂钩

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

您可以使用 do_action() 函数添加自己的操作挂钩,我将很快演示该函数。您挂钩到该操作的任何函数都将在代码中的该点运行。

过滤器挂钩

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

您可以使用 apply_filters() 函数在代码中添加过滤器,我将很快演示该函数。正如单词“apply”所示,您将过滤器应用于现有代码,而使用 do_action() 创建的操作在您将函数挂钩到它之前是空的。

使用函数、操作和过滤器

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

直接调用函数

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

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( '//m.sbmmt.com/m/' ) ?>" 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="https://wordpress.org/">WordPress</a> and designed by <a href="https://compass-design.co.uk">Compass Design</a>.
			</a>
		</small><!-- #credits -->
	</section><!--#colophon-->
	<?php }
}

这个函数是可插入的,因为我在父主题中使用它;如果我随后在子主题中创建一个具有相同名称的新函数,它将覆盖该函数。注意该函数中还包含另一个函数compass_colophon(),直接在代码中调用。

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

compass_colophon();

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

正如我稍后将演示的,此函数也可以挂钩到操作或过滤器。

将函数挂钩到操作

与直接调用该版权页函数相比,如果将其附加到挂钩,我将拥有更大的灵活性。

创建操作挂钩

我可以在 footer.php 文件中的该位置添加一个操作挂钩,而不是在页脚文件中调用 compass_colophon() 函数,方法是添加以下内容:

do_action( 'compass_in_footer' );

do_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() 函数设置优先级,所以为 compass_smallprint() 函数设置 20 将使该函数在之后运行/em> 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() 函数,我将其内容添加到 footer.php 文件中,将其转换为过滤器>apply_filters() 函数如下:

echo apply_filters( 'compass_colophon', '
    <section class="colophon" role="contentinfo">
		<small class="copyright left">
			<?php echo compass_copyright(); ?>
			<a href="<?php echo home_url( '//m.sbmmt.com/m/' ) ?>" 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() 函数的第二个参数的代码。

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

因此,我使用 do_action() 函数将 compass_in_footer 操作添加到我的 footer.php 文件中,如上所示,然后我在我的 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( '//m.sbmmt.com/m/' ) ?>" 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( '//m.sbmmt.com/m/' ) ?>" title="<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>" rel="home">
				<?php bloginfo( 'name' ); ?>
				</a>
			</small><!-- #copyright -->'
		);
		
		echo apply_filters( 'compass_credit_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_colophon 函数,或者我可以创建一个挂钩到 compass_copyright_filtercompass_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' );

这会用我的 new_credits() 函数的内容覆盖我原来的 compass_credits_filter 过滤器挂钩中设置的值,但将其他所有内容保留在 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' );

快速回顾

让我们鸟瞰整个事情,以更好地理解它是如何组合在一起的。本教程的主要目标是将内容输出到页脚,并以一种使其他人可以轻松修改页脚内容的方式进行。

最简单的方法是直接调用 footer.php 文件中的函数。然而,这剥夺了函数执行及其输出的一些灵活性。克服这个限制的一种方法是使用钩子,这就是我们接下来所做的。

我们将对 compass_colophon() 函数的调用替换为对 do_action() 的调用。请记住,do_action() 函数没有调用 compass_colophon()。它只是在 do_action() 调用的位置创建了一个操作挂钩。在我们的例子中,操作挂钩的名称是 compass_in_footer

触发 compass_in_footer 操作时我们要调用的实际函数是通过调用 add_action() 函数来指定的。它将我们的钩子名称作为它的第一个参数,我们的回调函数作为第二个参数。我们附加到 compass_in_footer 操作的第一个回调函数是 compass_colophon() 函数。

我们还可以选择将多个回调函数附加到同一个钩子。这正是我们添加 compass_smallprint() 函数作为操作挂钩的另一个回调时所做的事情。调用函数的顺序由传递给 add_action() 的第三个参数的值决定。这使我们能够确保 compass_smallprint() 函数在 compass_colophon() 之后执行。

使用操作挂钩的一个优点是,当触发操作时,您还可以通过将其名称传递给 remove_action() 函数来停止执行任何附加的回调函数。

此时,我们有一个在页脚中触发的操作钩子,并且我们调用了附加到该操作钩子的不同回调函数。基本上,我们采取了一些操作并输出想要放置在网站页脚中的内容。其他人也可以取消我们的函数的挂钩并将他们自己的回调函数附加到操作挂钩。

如果您只想部分更改页脚的输出,而不完全覆盖或取消原始函数,该怎么办?这就是过滤器被证明有用的时候。

我们使用 apply_filters() 函数创建新的过滤器挂钩。它至少接受两个参数。第一个是过滤器挂钩的名称,我们在两个 apply_filters() 调用中将其设置为 compass_copyright_filtercompass_credit_filter 。第二个参数是我们要过滤或修改的值。我们将其设置为显示版权和信用信息的 HTML 代码。

然后我们可以将我们自己的函数挂接到这些过滤器上。我们在 add_filter() 函数的帮助下完成此操作。该函数接受两个参数。第一个参数是过滤钩子的名称,第二个参数是要用来过滤值的回调函数的名称。

要记住的另一件重要事情是,只有使用 add_filter() 函数附加回调时,传递给 apply_filters() 的值才会被过滤。否则,作为第二个参数传递给 apply_filters() 的值将保持不变。

我们使用此功能来更改片尾字幕,但保持页脚中的版权信息不变。

更多 WordPress 教程

现在您已经知道如何在 WordPress 中添加操作了,也许您想扩展您的编码技能。 WordPress 应用过滤器后,您可以按照我们的教程学习其他技巧:

最终想法

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

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

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

以上就是WordPress 操作与过滤器:了解区别的详细内容,更多请关注php中文网其它相关文章!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。