web-dev-qa-db-ja.com

ショートコード機能は、コンテンツのレンダリング中に適用されますか。それとも、実行されて投稿コンテンツとともに保存されますか。

私が質問をきちんと尋ねたかどうかはわかりません、それにお詫び申し上げます。私がやろうとしているのは、ショートコードで<!--nextpage-->タグを出力することです。しかし、それはうまくいきません。コンテンツがレンダリングされるときにショートコードが適用されるのに対して、<!--nextpage-->は事前にリンクに解決されるからです。これができるかどうか誰かが知っていますか?投稿がレンダリングされるときに私のショートコードを通して<!--nextpage-->タグを適用することができますか?

1

どのような順序でthe_content();にフィルタが適用されるのか、それが十分早いのかどうかはわかりませんが、それがうまくいかない場合は、ショートコードが正しく適用されると考えるのは正しいと思います。遅れた。

/wp-includes/shortcodes.php (296行、3.2p)から、当然のことながらショートコードは次のように解決されることがわかります。

add_filter('the_content', 'do_shortcode', 11); // AFTER wpautop()

do_shortcodeフックが実行されるときに代わりに the_posts を実行すると、それらが十分に早く実行されるようになります。投稿がデータベースから取得された直後にthe_postsが実行されます。以下が動作するはずです。

add_filter('the_posts', 'rutwick_shortcode_exec');

function rutwick_shortcode_exec($posts) {
    $post_count = count($posts);
    for ($i = 0; $i < $post_count; ++$i) {
        do_shortcode($posts[$i]->post_content);
    }
    return $posts;
}

優先順位を下げるだけで十分です。

add_filter('the_content', 'do_shortcode', 9);

私は上記をテストしていないと私は何も保証していないことに注意してください。また、 wpautop と衝突する可能性があります。これは、上記が適用された場合、コンテンツをフィルタリングする前にショートコード(すべてのショートコード!)が解決されるためです。

EDIT:早めに独自の置換関数を実行する方が安全な場合があります(以下ではショートコードが[next]と呼ばれると仮定します)。

function do_rutwick_shortcode($content) {
    $content = preg_replace('{\[next\]}','<!--nextpage-->',$content);
    return $content;
}

そして、上記の2つの方法のどちらかを使用してそれを呼び出します(すなわち、より低い優先順位番号を持つthe_contentにフックするか、または上記のforループでdo_shortcode(...)do_rutwick_shortcode(...)に置き換える)。そうすることを選択した場合、add_shortcodeの使用は不要になります。また、the_postsにフックすることを選択した場合、 preg_replace を直接この関数で実行できれば、2つは必要ないでしょう。

$posts[$i]->post_content =
    preg_replace('{\[next\]}','<!--nextpage-->',$posts[$i]->post_content);

あなたは関数呼び出しを節約するでしょう。

4
Johannes Pille