0

the_title、the_content などのフックを作成する翻訳プラグインを使用しています。タイトルを表示しない 1 ビットのコードを除いて、すべて正常に動作しています。次のコードを使用します。

$page_title = apply_filters('the_title',get_the_title());

get_the_title()またはthe_title( )を使用しようとすると、壊れます。

適用フィルターは何をしますか? また、翻訳プラグインからフックをスキップしないようにするにはどうすればよいですか?

4

1 に答える 1

2

the_titlethe_contentまた、Wordpress コアにも存在します。それらは多くのことに利用されています。フックとは何かを知っていれば、このような行が役立つ理由は明らかです。

フィルター フックとアクション フックは、本質的に洗濯物のリストです。関数を次々とフックに配置して、キューを形成することができます。このフックが (do_actionおよびapply_filtersそれぞれによって) 呼び出されると、Wordpress は次から次へと関数のキューを解除します。それがそうであるように、それはそれらを実行します。

add_action( 'test', 'func1' );
add_action( 'test', 'func2' );
do_action( 'test' ); // Executes func1 and then func2

アクションとフィルターの違いは、どちらも値を受け入れることができますが、フィルターのみが変更された値を返すことです。アクションは、それ自体で重要なことを行います。フィルターは値を受け取り、後で使用できるように変更されたバージョンを返します。たとえば、印刷されるすべてのタイトルを大文字にthe_titleするには、次のコードを使用できます。

add_filter( 'the_title', function( $title ) {
    return strtoupper( $title );
});

関数ではなくフックにフックされたすべてthe_titleの関数が実行されることがわかっているapply_filtersため、 function のどこかでそれを見つけることを期待していますthe_title。実際、その機能は基本的echo get_the_titleに次のget_the_titleとおりです。

function get_the_title( $id = 0 ) {
        $post = &get_post($id);

        $title = isset($post->post_title) ? $post->post_title : '';
        $id = isset($post->ID) ? $post->ID : (int) $id;

        if ( !is_admin() ) {
                if ( !empty($post->post_password) ) {
                        $protected_title_format = apply_filters('protected_title_format', __('Protected: %s'));
                        $title = sprintf($protected_title_format, $title);
                } else if ( isset($post->post_status) && 'private' == $post->post_status ) {
                        $private_title_format = apply_filters('private_title_format', __('Private: %s'));
                        $title = sprintf($private_title_format, $title);
                }
        }
        return apply_filters( 'the_title', $title, $id );
}

ソース コード内のフックを探すことを学ぶことは急成長中の Wordpress 開発者にとって最も重要であるため、関数全体を投稿します。ソース コードにはフックが散らばっているので、それらを使用して、Wordpress の組み込み関数の多くの側面を変更できます。ソースコードを見つけapply_filters( 'the_title', ... )たので、その重要性を理解できます!

the_titleによって与えられた値をエコーするだけで、フックにフィルターを付けることで返されるget_the_title値を変更したり、置き換えたりすることもできます!get_the_titlethe_title

さて、私がこれまで書いてきたことすべてが不当だと思わないでほしい。実際、「なぜ機能しないのですか?」という主な質問に簡単に答えることができます。

まず第一にthe_title、関数に渡すことはできません! 書くようなものsomefunction( $var1, echo $var2, $var3 )です。echo はその出力をブラウザーに送信するため、echo を使用して関数に値を渡すことはできません。

より良い試みはあなたが投稿したものです

$page_title = apply_filters('the_title',get_the_title());

しかし、これまで見てきたように、戻り値にはすでにget_the_title適用されています。the_titleこれらすべての機能をもう一度適用するだけです。カスタム フィルタがアタッチされているthe_title場合や、何もできない場合は、おかしな結果になる可能性があります。したがって、結果を混乱させるか、不当です。これが、単純にこれを行う必要がある理由です。

$page_title = get_the_title();

さて、あなたも言った

タイトルを表示しない 1 ビットのコードを除いて、すべて正常に動作しています

これは紛らわしいです。なぜなら、変数の代入が何かを出力するとは思わないからです! タイトルを出力するには、これを行うことができます

$page_title = get_the_title();
echo $page_title;

しかし、私たちが学んだように、これは実際には (わずかな違いについてはソース コードを見てください)、次のものと同じです。

the_title();

したがって、おそらく単独で使用したいという結論に達するために、かなり多くのことを書きましたthe_title。しかし、これがフィルター/アクション フックに関する優れたリソースになることを願っています。

ご質問は大歓迎です。

于 2012-12-31T15:30:14.287 に答える