Les hooks d'action et de filtre sont un élément essentiel de diverses API WordPress. Sans eux, vos fonctionnalités dans les thèmes et (surtout) les plugins sont limitées.
Mais parfois, il est facile de confondre les deux, surtout si WordPress possède à la fois des crochets d’action et des crochets de filtre portant le même nom.
Dans cet article, je définirai les hooks d'action et de filtrage et décrirai les différences entre eux, et je montrerai comment les utiliser dans les thèmes et les plugins. Je vais également donner quelques exemples de cas où vous pouvez les utiliser.
Lorsque vous ajoutez des actions et des hooks de filtrage à votre code dans WordPress (ou que vous y attachez des fonctions), cela aide à comprendre comment WordPress appelle les actions et les filtres et dans quel ordre cela se produit. Je n'entrerai pas dans les détails ici car nous avons un autre tutoriel qui fait le travail.
Commençons par quelques définitions. Je vais également définir les actions et filtrer les hooks et les fonctions afin que vous puissiez voir la différence entre eux.
Les fonctions sont la première chose que la plupart des gens rencontrent lorsqu'ils apprennent le développement WordPress ; si vous avez ajouté du code au fichier functions.php de votre thème, vous écrirez une fonction.
Les fonctions précisent comment les choses vont se passer. Vous écrivez une fonction pour interroger des données, générer du contenu ou effectuer de nombreuses autres tâches. Vous pouvez appeler (exécuter) des fonctions directement dans les fichiers modèles de votre thème, ou vous pouvez les accrocher à des hooks d'action ou de filtre. Les fonctions peuvent également contenir des balises de modèle (telles que des balises conditionnelles) pour spécifier quand la fonction doit être appliquée.
Je vais vous montrer différentes façons d'exécuter des fonctions plus loin dans cet article.
Un crochet d'action (ou action) est déclenché lorsque quelque chose se produit, comme le chargement d'une page, la connexion d'un utilisateur ou une action personnalisée que vous définissez dans votre thème ou plugin.
Vous pouvez ajouter vos propres crochets d'action en utilisant la fonction do_action()
, que je vais démontrer sous peu. Toutes les fonctions que vous connectez à cette action seront exécutées à ce stade du code.
Les crochets de filtre ou les filtres contrôlent la façon dont quelque chose se produit ou modifie ce qui est déjà sorti. Vous pouvez utiliser des filtres pour afficher les métadonnées dans un format spécifique, remplacer la sortie texte du plugin ou empêcher l'affichage complet de certains contenus.
Vous pouvez ajouter des filtres dans le code à l'aide de la fonction apply_filters()
, que je vais démontrer sous peu. Comme l'indique le mot « appliquer », vous appliquez le filtre au code existant, alors que l'action créée avec apply_filters()
函数在代码中添加过滤器,我将很快演示该函数。正如单词“apply”所示,您将过滤器应用于现有代码,而使用 do_action()
est vide jusqu'à ce que vous y accrochiez une fonction.
Examinons quelques exemples montrant comment utiliser les fonctions, les opérations et les filtres. Tout d’abord, nous verrons comment utiliser les fonctions directement dans le code sans les attacher à des hooks.
Ci-dessous un exemple de fonction appelée directement dans le fichier modèle. Sur mon site client, j'ai ajouté une page de droits d'auteur dans le pied de page qui contient les informations de droits d'auteur. La fonction est la suivante :
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 } }
Cette fonction est connectable car je l'utilise dans le thème parent ; si je crée ensuite une nouvelle fonction du même nom dans le thème enfant, elle remplacera la fonction. Notez que cette fonction contient également une autre fonction compass_colophon()
, qui est appelée directement dans le code.
Cette fonction se trouve dans le fichier functions.php
文件中。我可以直接在我的主题的 footer.php
de mon thème parent et l'appelle ainsi :
compass_colophon();
Cela affichera le code dans la fonction à l'emplacement où il est appelé dans mon thème. Vous pouvez également transmettre des arguments à une fonction, puis utiliser ces arguments dans la fonction.
Comme je le démontrerai plus tard, cette fonction peut également être accrochée à des actions ou des filtres.
J'aurais plus de flexibilité si je l'attachais à un hook que si j'appelais directement cette fonction de page de copyright.
我可以在 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</strong> 文件中,将其转换为过滤器>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_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' );
这会用我的 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()
之后执行。
L'un des avantages de l'utilisation des action hooks est que lorsqu'une action est déclenchée, vous pouvez également arrêter l'exécution de toute fonction de rappel attachée en passant son nom à la fonction remove_action()
.
À ce stade, nous avons un crochet d'action qui se déclenche dans le pied de page et nous appelons différentes fonctions de rappel attachées à ce crochet d'action. Fondamentalement, nous prenons des mesures et produisons le contenu que nous souhaitons placer dans le pied de page de notre site Web. D'autres peuvent également décrocher notre fonction et attacher leurs propres fonctions de rappel au crochet d'action.
Que se passe-t-il si vous souhaitez uniquement modifier partiellement la sortie du pied de page, sans remplacer ni annuler complètement la fonction d'origine ? C’est à ce moment-là que les filtres s’avèrent utiles.
Nous utilisons apply_filters()
函数创建新的过滤器挂钩。它至少接受两个参数。第一个是过滤器挂钩的名称,我们在两个 apply_filters()
调用中将其设置为 compass_copyright_filter
和 compass_credit_filter
. Le deuxième paramètre est la valeur que nous souhaitons filtrer ou modifier. Nous l'avons configuré pour afficher le code HTML des informations sur les droits d'auteur et le crédit.
Nous pouvons ensuite accrocher nos propres fonctions à ces filtres. Nous faisons cela à l'aide de la fonction add_filter()
. Cette fonction accepte deux paramètres. Le premier paramètre est le nom du hook de filtre et le deuxième paramètre est le nom de la fonction de rappel à utiliser pour filtrer les valeurs.
Une autre chose importante à retenir est que les valeurs transmises à apply_filters()
ne seront filtrées que si vous attachez un rappel à l'aide de la fonction add_filter()
函数附加回调时,传递给 apply_filters()
的值才会被过滤。否则,作为第二个参数传递给 apply_filters()
. Sinon, la valeur passée à apply_filters()
comme deuxième argument restera inchangée.
Nous utilisons cette fonctionnalité pour modifier le générique de fin tout en conservant intactes les informations de droit d'auteur dans le pied de page.
Maintenant que vous savez comment ajouter des actions dans WordPress, vous souhaitez peut-être élargir vos compétences en codage. Une fois WordPress appliqué le filtre, vous pouvez suivre notre tutoriel pour apprendre d'autres astuces :
Comprendre la différence entre les action hooks et les filter hooks et être capable de les utiliser efficacement facilitera le développement de votre thème et de votre plugin. En fait, vous ne pouvez tout simplement pas écrire un plugin sans utiliser au moins un type de hook, car la seule façon d'activer le code dans un plugin est via son action attachée et ses hooks de filtre.
Ce guide vous montre comment ajouter la même fonctionnalité à l'aide de fonctions, de crochets d'action et d'un ou plusieurs crochets de filtre, ainsi que des techniques pour supprimer des fonctions des crochets et des conseils sur les moments où chaque technique est plus utile.
En plus d'accrocher des fonctions aux actions et aux filtres que vous créez, vous pouvez également les accrocher aux actions et aux filtres fournis par WordPress, tels que les filtres wp_head
操作或 body_class
.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!