Heim  >  Artikel  >  Web-Frontend  >  WordPress-Aktionen vs. Filter: Kennen Sie den Unterschied

WordPress-Aktionen vs. Filter: Kennen Sie den Unterschied

WBOY
WBOYOriginal
2023-08-31 16:25:071397Durchsuche

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

  • Funktion
  • Action-Hook
  • Filterhaken
  • Funktion direkt aufrufen
  • Funktionen in Aktionen einbinden
  • Hook-Funktionen zu Filtern

Aktions- und Filter-Hooks sind ein wesentlicher Bestandteil verschiedener WordPress-APIs. Ohne sie ist Ihre Funktionalität in Themes und (insbesondere) Plugins eingeschränkt.

Aber manchmal ist es leicht, die beiden zu verwechseln, insbesondere wenn WordPress sowohl Aktions-Hooks als auch Filter-Hooks mit demselben Namen hat.

In diesem Artikel definiere ich Aktions- und Filter-Hooks, beschreibe die Unterschiede zwischen ihnen und zeige, wie man sie in Themes und Plugins verwendet. Ich werde auch einige Beispiele dafür geben, wann Sie sie verwenden können.

Wenn Sie Ihrem Code in WordPress Aktionen und Filter-Hooks (oder Hook-Funktionen) hinzufügen, hilft es zu verstehen, wie WordPress Aktionen und Filter aufruft und in welcher Reihenfolge sie ausgeführt werden. Ich werde hier nicht näher darauf eingehen, da wir ein anderes Tutorial haben, das diese Aufgabe erledigt.

Definitionen und Unterschiede

Beginnen wir mit einigen Definitionen. Außerdem definiere ich Aktions- und Filter-Hooks und -Funktionen, damit Sie den Unterschied zwischen ihnen erkennen können.

Funktion

Funktionen sind das Erste, was den meisten Menschen beim Erlernen der WordPress-Entwicklung in den Sinn kommt. Wenn Sie der Datei functions.php Ihres Themes Code hinzugefügt haben, schreiben Sie eine Funktion.

Funktionen legen fest, wie Dinge geschehen. Sie schreiben eine Funktion, um Daten abzufragen, Inhalte auszugeben oder viele andere Aufgaben auszuführen. Sie können Funktionen direkt in den Vorlagendateien Ihres Themes aufrufen (ausführen) oder sie mit Aktions- oder Filter-Hooks verknüpfen. Funktionen können auch Vorlagen-Tags (z. B. bedingte Tags) enthalten, um anzugeben, wann die Funktion angewendet werden soll.

Ich werde Ihnen später in diesem Artikel verschiedene Möglichkeiten zum Ausführen von Funktionen zeigen.

Action-Hook

Ein Aktions-Hook (oder eine Aktion) wird ausgelöst, wenn etwas passiert, z. B. das Laden einer Seite, die Anmeldung eines Benutzers oder eine benutzerdefinierte Aktion, die Sie in Ihrem Theme oder Plugin definieren.

Mit der do_action()-Funktion können Sie Ihre eigenen Aktions-Hooks hinzufügen, die ich in Kürze demonstrieren werde. Alle Funktionen, die Sie in diese Aktion einbinden, werden an dieser Stelle im Code ausgeführt.

Filterhaken

Filter-Hooks oder Filter steuern, wie etwas passiert oder ändern, was bereits ausgegeben wird. Sie können Filter verwenden, um Metadaten in einem bestimmten Format auszugeben, die Textausgabe des Plugins zu überschreiben oder die Anzeige bestimmter Inhalte vollständig zu verhindern.

Sie können Filter im Code hinzufügen, indem Sie die Funktion apply_filters() verwenden, was ich in Kürze demonstrieren werde. Wie das Wort „anwenden“ andeutet, wenden Sie den Filter auf vorhandenen Code an, während die mit apply_filters() 函数在代码中添加过滤器,我将很快演示该函数。正如单词“apply”所示,您将过滤器应用于现有代码,而使用 do_action() erstellte Aktion leer ist, bis Sie eine Funktion damit verknüpfen.

Verwenden Sie Funktionen, Operationen und Filter

Schauen wir uns einige Beispiele an, die zeigen, wie Funktionen, Operationen und Filter verwendet werden. Zunächst schauen wir uns die direkte Verwendung von Funktionen im Code an, ohne sie an Hooks anzuhängen.

Funktion direkt aufrufen

Unten sehen Sie ein Beispiel für eine Funktion, die direkt in der Vorlagendatei aufgerufen wird. Auf meiner Kundenseite habe ich in der Fußzeile eine Copyright-Seite hinzugefügt, die die Copyright-Informationen enthält. Die Funktion ist wie folgt:

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

Diese Funktion ist steckbar, da ich sie im übergeordneten Theme verwende; wenn ich dann im untergeordneten Theme eine neue Funktion mit demselben Namen erstelle, überschreibt sie die Funktion. Beachten Sie, dass diese Funktion auch eine weitere Funktion compass_colophon() enthält, die direkt im Code aufgerufen wird.

Diese Funktion befindet sich in der functions.php 文件中。我可以直接在我的主题的 footer.php-Datei meines übergeordneten Themes und nennt sie so:

compass_colophon();

Dadurch wird der Code in der Funktion an der Stelle ausgegeben, an der er in meinem Theme aufgerufen wird. Sie können einer Funktion auch Argumente übergeben und diese Argumente dann innerhalb der Funktion verwenden.

Wie ich später zeigen werde, kann diese Funktion auch mit Aktionen oder Filtern verknüpft werden.

Funktionen in Aktionen einbinden

Ich hätte mehr Flexibilität, wenn ich es an einen Hook anhängen würde, als wenn ich diese Copyright-Seitenfunktion direkt aufrufen würde.

创建操作挂钩

我可以在 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( '/' ) ?>" 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( '/' ) ?>" 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_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() 之后执行。

Ein Vorteil der Verwendung von Aktions-Hooks besteht darin, dass Sie beim Auslösen einer Aktion auch die Ausführung einer angehängten Rückruffunktion stoppen können, indem Sie deren Namen an die remove_action()-Funktion übergeben.

An diesem Punkt haben wir einen Aktions-Hook, der in der Fußzeile ausgelöst wird, und wir rufen verschiedene Rückruffunktionen auf, die an diesen Aktions-Hook angehängt sind. Grundsätzlich ergreifen wir Maßnahmen und geben den Inhalt aus, den wir in der Fußzeile unserer Website platzieren möchten. Andere können unsere Funktion auch aushängen und ihre eigenen Rückruffunktionen an den Aktions-Hook anhängen.

Was ist, wenn Sie die Ausgabe der Fußzeile nur teilweise ändern möchten, ohne die ursprüngliche Funktion vollständig zu überschreiben oder abzubrechen? Hier erweisen sich Filter als nützlich.

Wir verwenden apply_filters() 函数创建新的过滤器挂钩。它至少接受两个参数。第一个是过滤器挂钩的名称,我们在两个 apply_filters() 调用中将其设置为 compass_copyright_filtercompass_credit_filter . Der zweite Parameter ist der Wert, den wir filtern oder ändern möchten. Wir haben es so eingerichtet, dass der HTML-Code für Urheberrechts- und Quellenangaben angezeigt wird.

Wir können dann unsere eigenen Funktionen an diese Filter anschließen. Dies machen wir mit Hilfe der add_filter()-Funktion. Diese Funktion akzeptiert zwei Parameter. Der erste Parameter ist der Name des Filter-Hooks und der zweite Parameter ist der Name der Callback-Funktion, die zum Filtern der Werte verwendet werden soll.

Eine weitere wichtige Sache, die Sie beachten sollten, ist, dass die an apply_filters() übergebenen Werte nur gefiltert werden, wenn Sie einen Rückruf mit der Funktion add_filter() 函数附加回调时,传递给 apply_filters() 的值才会被过滤。否则,作为第二个参数传递给 apply_filters() anhängen. Andernfalls bleibt der als zweites Argument an apply_filters() übergebene Wert unverändert.

Wir verwenden diese Funktion, um den Abspann zu ändern, aber die Copyright-Informationen in der Fußzeile beizubehalten.

Weitere WordPress-Tutorials

Da Sie nun wissen, wie man Aktionen in WordPress hinzufügt, möchten Sie vielleicht Ihre Programmierkenntnisse erweitern. Sobald WordPress den Filter angewendet hat, können Sie unserem Tutorial folgen, um weitere Tricks zu lernen:

Abschließende Gedanken

Wenn Sie den Unterschied zwischen Aktions-Hooks und Filter-Hooks verstehen und sie effektiv nutzen können, wird dies Ihre Theme- und Plugin-Entwicklung erleichtern. Tatsächlich können Sie einfach kein Plugin schreiben, ohne mindestens einen Hook-Typ zu verwenden, da die einzige Möglichkeit, den Code in einem Plugin zu aktivieren, über die angehängten Aktions- und Filter-Hooks besteht.

Diese Anleitung zeigt Ihnen, wie Sie mithilfe von Funktionen, Aktions-Hooks und einem oder mehreren Filter-Hooks dieselbe Funktionalität hinzufügen, außerdem Techniken zum Entfernen von Funktionen aus Hooks und Ratschläge, wann jede Technik nützlicher ist.

Zusätzlich zum Verknüpfen von Funktionen mit den von Ihnen erstellten Aktionen und Filter-Hooks können Sie diese auch mit von WordPress bereitgestellten Aktionen und Filtern verknüpfen, z. B. mit wp_head 操作或 body_class-Filtern.

Das obige ist der detaillierte Inhalt vonWordPress-Aktionen vs. Filter: Kennen Sie den Unterschied. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn