web-dev-qa-db-ja.com

プラグインからページタイトルを変更

プラグインからその場でページタイトルを変更することは可能ですか?

私はグローバル$ postを試してみましたが、プラグインはあとで実行されるようです。

何か案は?

編集:同じページ/投稿に基づいて、その場でいくつかのページを書いているので、すべてのページが同じタイトルを表示します。ショートコードでやる方法を探したり、自分のプラグインや関数を書いたりする

2
greenbandit

そのためのフィルタがあります:

function wpse_alter_title( $title, $id )
{
    // $id = $post->ID;
    // alter the title here
    return $title;
}

「保護」と「非公開」のタイトルを変更したい場合は、他のフィルタが必要です。

// Preserve the "%s" - else the title will be removed.
function wpse_alter_protected_title_format( $title )
{
    return __( 'Protected: %s' );
}

function wpse_alter_private_title_format( $title )
{
    return __( 'Private: %s' );
}

大事なことを言い忘れましたが、あなたは十分に早くあなたのフィルタコールバックを追加しなければなりません。

function wpse_load_alter_title()
{
    add_filter( 'the_title', 'wpse_alter_title', 20, 2 );
    add_filter( 'protected_title_format', 'wpse_alter_protected_title_format' );
    add_filter( 'private_title_format', 'wpse_alter_private_title_format' );
}
add_action( 'init', 'wpse_load_alter_title' );
3
kaiser

これはあなたのページタイトルがレンダリングされている文脈とデータがそれにどのように供給されているかに依存します。

次の点を考慮してください。

<h2><?php the_title(); ?></h2>

解決策は the_title フィルタにフックしてそれを簡単に変更することを含みます。

これはどう?

<h2><?php echo $post->post_title; ?></h2> // not Nice!

そしてそれを変えることの問題のためにそれはいいことではありません。 $postが最初からどのように移入されたのかを知るのは難しいです。検討してください:

foreach( get_posts( ... ) as $post ):
    ...

一見するとそこに引っ掛かる場所はありません。しかし、それは実際の投稿クエリの中で行うことができます。 found_posts フィルターを調べてください。

ただし、次の点を考慮してください。

$post = $wpdb->get_row( "SELECT .... " );
echo "<h2>$post->post_title</h2>"

それはめちゃくちゃです。

ポイントは、あなたの状況に応じておそらく良い解決策があるということです。テンプレートファイルを確認し、タイトルのレンダリング方法を確認してください。快適になるように修正するか、プラグインをもう少し難しくしてください。

そして mysql_query() が直接タイトルを取得するために使用されている場合は、プラグインを介してタイトルを変更することはできません。はい、私は実際にこれが行われたのを見ました。何人かの人々はそれをハードコードすることさえテンプレートで行っています。 front-page.phpのように<h2>Home</h2>が含まれ、$post->post_titleを使用したりデータベースに問い合わせたりすることはありません。

だから、状況や状況に依存します。

1
soulseekah