web-dev-qa-db-ja.com

テーマ用に複数のフックを作成する

現時点でIamはテーマに取り組んでいて、さらに柔軟性を高めるために、いくつかの場所にいくつかのカスタムフックを追加したいという点に達しました。

テーマに複数のフックを追加したいです。私はさまざまなセクション(ヘッダ、コンテンツ、サイドバー、フッタなど)を持っていて、それらすべての場所にbeforeinsideafterフックを追加したいのです。

だから私は最初私のテーマのために複数のフックを作成するためにこのようなコードブロックを使用していました:

/* Teaser hooks */
function _s_before_teaser() { do_action('_s_before_teaser', 'teaser'); }
function _s_inside_teaser() { do_action('_s_inside_teaser', 'teaser'); }
function _s_after_teaser() { do_action('_s_after_teaser', 'teaser'); }

/* Header hooks */
function _s_before_header() { do_action('_s_before_header', 'header'); }
function _s_inside_header() { do_action('_s_inside_header', 'header'); }
function _s_after_header() { do_action('_s_after_header','header'); }

......

/* Sidebar hooks */
function _s_before_sidebar() { do_action('_s_before_sidebar', 'sidebar'); }
function _s_inside_sidebar() { do_action('_s_inside_sidebar', 'sidebar'); }
function _s_after_sidebar() { do_action('_s_after_sidebar', 'sidebar'); }

/* Footer hooks */
function _s_before_footer() { do_action('_s_before_footer', 'footer'); }
function _s_inside_footer() { do_action('_s_inside_footer', 'footer'); }
function _s_after_footer() { do_action('_s_after_footer', 'footer'); }

このコードでテンプレートファイルで<?php _s_before_header(); ?>を使うことができます。

この設定では、すべて正常に機能します。

しかし、私はそのコード、あるいは少なくとも大きなコードブロックが醜く、そしてまた重複した(ちょっと)コードを使いたくないと思います

そのため、そのコードブロックの代わりに、このコードを次のように書き換えました。

function _s_create_all_hooks() {
    $sections = array(
        'header',
        'branding',
        'navigation',
        'content',
        'single',
        'sidebar',
        'footer'
    );

    foreach ($sections as $section) {
        do_action('_s_before_'.$section, $section);
        do_action('_s_inside_'.$section, $section);
        do_action('_s_after_'.$section, $section);
    }
}
add_action('wp_loaded', '_s_create_all_hooks', 10, 1 );

これはまた働いています、しかし...

このメソッドで私はもう<?php _s_before_header(); ?>を使うことができません、私はもう関数を持っていないからです。

代わりに私は今テンプレートでこれを使わなければなりません<?php do_action('_s_before_header', 'header'); ?>

しかし、Iamはこのメソッドにわくわくしないようにしています。また、Iamはテンプレート内のdo_actionスニペットも見苦しいものです。

私はすでにウェブを検索し、いくつかのhook-tutorialsを見つけました、しかしすべてのチュートリアルと記事の中で1つのサンプルフックだけが作成されます。一度に複数のフックを作成することに関する記事はありませんでした。

私の質問は、一度に複数のフックを作成するためのベストプラクティスは何ですか?

1
LWS-Mo

あなたがしたのは、単一のパラメータを持つdo_actionです。

File: wp-includes/plugin.php
417:  * @param string $tag     The name of the action to be executed.
418:  * @param mixed  $arg,... Optional. Additional arguments which are passed on to the
419:  *                        functions hooked to the action. Default empty.
420:  */
421: function do_action($tag, $arg = '') {

PHPはリベラルな言語なので、do_actionに複数のパラメーターを追加して、後でadd_actionの4番目の引数でパラメーターの数を使用することもできます。

function _hookgenerator( $name ) { do_action($name); }

これがあなたがそれを機能させることができる方法であるのでテストして自由に感じなさい。この例では、フック引数はまったく使用していません。多分考えた後、あなたもそれを必要としないでしょう。

4
prosti