ホームページ  >  記事  >  ウェブフロントエンド  >  WordPress アクションとフィルター: 違いを理解する

WordPress アクションとフィルター: 違いを理解する

WBOY
WBOYオリジナル
2023-08-31 16:25:071397ブラウズ

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

    ###関数###
  • アクションフック
  • フィルターフック
  • 関数を直接呼び出す
  • 関数をオペレーションにフックする
  • フィルターへのフック関数
  • アクション フックとフィルター フックは、さまざまな WordPress API の基本的な部分です。これらがないと、テーマと (特に) プラグインの機能が制限されます。

しかし、特に WordPress に同じ名前のアクション フックとフィルター フックの両方がある場合、この 2 つを混同しやすいことがあります。

この記事では、アクション フックとフィルター フックを定義し、それらの違いについて説明し、テーマとプラグインでそれらを使用する方法を示します。どのような場合に使用できるか例も紹介します。

アクションとフィルターのフックを WordPress のコードに追加する (またはそれらに関数をフックする) 場合、WordPress がアクションとフィルターを呼び出す方法と、それが行われる順序を理解するのに役立ちます。これについては別のチュートリアルがあるため、ここでは詳しく説明しません。

定義と違い

いくつかの定義から始めましょう。また、アクションとフィルターのフックと関数も定義して、それらの違いを確認できるようにします。

###関数###

関数は、WordPress 開発を学ぶときにほとんどの人が最初に出会うものです。テーマの

functions.php

ファイルにコードを追加した場合は、関数を記述することになります。

関数は、物事がどのように起こるかを指定します。データのクエリ、コンテンツの出力、またはその他の多くのタスクを実行する関数を作成します。テーマのテンプレート ファイル内で関数を直接呼び出す (実行する) ことも、アクション フックやフィルター フックに関数をフックすることもできます。関数には、関数をいつ適用するかを指定するテンプレート タグ (コンディショナル タグなど) を含めることもできます。 関数を実行するさまざまな方法については、この記事の後半で説明します。

アクションフック

アクション フック (またはアクション) は、ページの読み込み、ユーザーのログイン、テーマやプラグインで定義したカスタム アクションなど、何かが発生したときにトリガーされます。

do_action()

関数を使用して独自のアクション フックを追加できます。これについては後ほど説明します。このアクションにフックした関数はすべて、コード内のその時点で実行されます。

フィルターフック フィルター フックまたはフィルターは、何かがどのように発生するか、または既に出力されている内容を変更するかを制御します。フィルターを使用すると、メタデータを特定の形式で出力したり、プラグインのテキスト出力をオーバーライドしたり、特定のコンテンツが完全に表示されないようにすることができます。

apply_filters()

関数を使用してコードにフィルターを追加できます。これについては後ほど説明します。 「適用」という言葉が示すように、フィルタを既存のコードに適用しますが、

do_action()

で作成されたアクションは、関数をフックするまでは空です。

関数、演算、フィルターの使用 関数、演算、フィルターの使用方法を示すいくつかの例を見てみましょう。まず、関数をフックに接続せずにコード内で直接使用する方法を見ていきます。

関数を直接呼び出す

次は、テンプレート ファイル内で直接呼び出される関数の例です。私のクライアント サイトでは、著作権情報を含む著作権ページをフッターに追加しました。関数は次のとおりです:

リーリー

この関数は親テーマで使用しているためプラグイン可能ですが、子テーマで同じ名前の新しい関数を作成すると、その関数は上書きされます。この関数には、コード内で直接呼び出される別の関数

compass_colophon()

も含まれていることに注意してください。

この関数は、親テーマの

functions.php ファイルにあります。次のように、テーマの footer.php

ファイル内で直接呼び出すことができます。 リーリー

これにより、テーマ内で呼び出される場所に関数のコードが出力されます。関数に引数を渡し、その引数を関数内で使用することもできます。 後で説明するように、この関数はアクションまたはフィルターにフックすることもできます。 関数をオペレーションにフックする

著作権ページ関数を直接呼び出すよりも、フックにアタッチした方が柔軟性が高くなります。

创建操作挂钩

我可以在 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() 之后执行。

アクション フックを使用する利点の 1 つは、アクションがトリガーされたときに、コールバック関数の名前を remove_action() 関数に渡すことによって、そのコールバック関数の実行を停止できることです。

この時点で、フッター内で起動するアクション フックがあり、そのアクション フックにアタッチされたさまざまなコールバック関数を呼び出します。基本的に、何らかのアクションを実行し、Web サイトのフッターに配置したいコンテンツを出力します。他の人は関数のフックを解除し、独自のコールバック関数をアクション フックにアタッチすることもできます。

元の関数を完全にオーバーライドまたはキャンセルせずに、フッターの出力を部分的にのみ変更したい場合はどうすればよいでしょうか?このような場合にフィルターが役立ちます。

apply_filters() 関数を使用して、新しいフィルター フックを作成します。少なくとも 2 つのパラメータを受け入れます。 1 つ目はフィルター フックの名前で、2 つの apply_filters() 呼び出しで compass_copyright_filtercompass_credit_filter に設定します。 2 番目のパラメーターは、フィルターまたは変更する値です。著作権情報やクレジット情報のHTMLコードを表示するように設定しました。

その後、独自の関数をこれらのフィルターにフックできます。これは、add_filter() 関数を使用して行います。この関数は 2 つのパラメータを受け入れます。最初のパラメータはフィルタ フックの名前で、2 番目のパラメータは値をフィルタするために使用するコールバック関数の名前です。

もう 1 つ覚えておくべき重要な点は、apply_filters() に渡される値は、add_filter() 関数を使用してコールバックがアタッチされている場合にのみフィルターされるということです。それ以外の場合、2 番目の引数として apply_filters() に渡される値は変更されません。

この機能を使用してエンド クレジットを変更しますが、フッターの著作権情報はそのままにします。

その他の WordPress チュートリアル

WordPress にアクションを追加する方法がわかったので、コーディング スキルを拡張したいと思うかもしれません。 WordPress がフィルターを適用したら、チュートリアルに従って他のトリックを学ぶことができます:

###最終的な考え###

アクション フックとフィルター フックの違いを理解し、それらを効果的に使用できるようになると、テーマとプラグインの開発が容易になります。実際、少なくとも 1 種類のフックを使用せずにプラグインを作成することはできません。これは、プラグイン内のコードをアクティブにする唯一の方法が、付属のアクション フックとフィルター フックを使用することであるためです。

このガイドでは、関数、アクション フック、および 1 つ以上のフィルター フックを使用して同じ機能を追加する方法、フックから関数を削除するテクニック、および各テクニックがより役立つ場合についてのアドバイスを示します。

関数を作成したアクション フックやフィルター フックにフックするだけでなく、

wp_head

アクションや body_class## など、WordPress が提供するアクションやフィルターに関数をフックすることもできます。フィルター。

以上がWordPress アクションとフィルター: 違いを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。