Wordpress version 4.5.1
特定のテンプレートのページタイトルを動的に更新しようとしています。 wp_title()
の変更について掘り下げて学んだ後、私はdocument_title_parts
を使用しようとしています。しかし、私はフィルタをまったく実行させることができません。
私は子供のテーマ、functions.php
にいます:
add_theme_support( 'title-tag' );
//add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });
add_filter( 'document_title_parts', function( $title )
{
error_log('here');
return $title;
}, 10, 1 );
私は上記のようにテーマサポートを追加することの両方のバリエーションを試しました、しかし私のログを見て、何もページリロードに現れません。 error_log
は他の関数(wp_title
など)と連携していたので、エラーロギングは機能しています。
私はpre_get_document_title
も試しました。これはページの読み込み時に発生しますが、実際にタイトルを変更することはできません。
そう!フィルタの使い方が間違っている、テーマが正しく設定されていない、または他に気づいていないことがあります。任意の助けは大歓迎です!
詳細を追加するために編集します
Init関数を実行しようとしましたが、それでもうまくいきません: https://Gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4
また、<title>
からheader.php
への参照を削除しましたが、実際のサイトのタイトルはまだソースに表示されています。
私の開発分野であなたのフィルタを実行しました。うまくいきませんでした。それから私はYoast SEOプラグインをオフにしました、それも私がページタイトルをいじっていたことを知っていました。それからそれは働いた。だから私の提案はそれを台無しにしている別のプラグインだろう。
Yoastの場合、それは空でないを返すpre_get_document_title
へのフィルタ呼び出しでした。その場合、コードの最初の行からわかるように、 wp_get_document_title
は短絡されており、documents_title_parts
フィルタを含む残りの関数は評価されません。
$title = apply_filters( 'pre_get_document_title', '' );
if ( ! empty( $title ) ) {
return $title;
}
だから、私はあなたのフィルタを取り、フックをpre_get_document_title
に変更しました。うまくいきませんでした。それから私はYoastの同じフィルターより高いレベルに優先順位を変更しました。それからそれは働いた。ですから、私はあなたの設定については知りませんが、試してみることをお勧めします。
add_filter( 'pre_get_document_title', function( $title )
{
error_log('here');
return $title;
}, 999, 1 );
いくつかの実験の後、私は次のような提案をしました。それは、<title>
タグがあなたの親テーマのheader.php
の中に「ハードコード」されているということでしょうか?その場合は、子テーマの<title>
からheader.php
タグを削除し(親のheader.php
を子テーマのフォルダにコピーして)、functions.php
を介してテーマサポートを追加してください。
add_theme_support( 'title-tag' );
私はこの提案に私を導いたものを説明しようとします:私はあなたと他の人が提案したように試みました - しかし、私は 2つの<title>
タグ をソースコードに見つけました。最初のものは標準タイトル、2番目のものは修正タイトルです。しかし(もちろん)ブラウザのタイトルバーには、デフォルトのタイトルしか表示されませんでした。
それから私は私が使った親テーマのheader.php
(14)をチェックしました、そして<title>
タグは本当にこのようにそのテンプレートの中にハードコードされていました:
<title><?php wp_title( '|', true, 'right' ); ?></title>
削除した後、子テーマのfunctions.php
に次のコードを追加しました。
/**
* Theme support added
*/
function add_theme_support_child() {
add_theme_support( 'title-tag' );
}
add_action( 'after_setup_theme', 'add_theme_support_child', 11 );
/**
* Change the title of a page
*
*/
function change_title_for_a_template( $title ) {
// Check if current page template is 'template-homepage.php'
// if ( is_page_template( 'template-homepage.php' ) ) {
// change title parts here
$title['title'] = 'My Title';
$title['tagline'] = 'My fancy tagline'; // optional
$title['site'] = 'example.org'; //optional
// }
return $title;
}
add_filter( 'document_title_parts', 'change_title_for_a_template', 10, 1 );
そのため、テンプレートから<title>
タグを削除する前にも、基本的にはうまくいきました。その場合、 two <title>
タグがあり、そのうちの後者は無視されました。これはあなたのテーマと同じ問題でしょうか?
wp 4.4.0以降、<title>
タグは動的に作成されます 関数_wp_render_title_tag()
は基本的に別の関数wp_get_document_title()
を呼び出し、結果をHTMLタグで囲みます。長い話を短くすると、テーマのheader.php
に<title>
タグがない場合は、 here のようにpre_get_document_title
またはdocument_title_parts
を使って直接タイトルを上書きすることができます。
1)タイトルを直接変更します。
add_filter('pre_get_document_title', 'change_the_title');
function change_the_title() {
return 'The expected title';
}
2)タイトル部分のフィルタリング
add_filter('document_title_parts', 'filter_title_part');
function filter_title_part($title) {
return array('a', 'b', 'c');
}
投稿を上から下、下から上に読んでいると、pre_get_document_title
フィルターを介してタイトルを渡すフィルターがすべての確率であります。ここでの手がかりは次のとおりです。
ページの読み込み時に起動する
pre_get_document_title
も試しました。
wp_get_document_title()
のソースコード を見ると、次のコードが表示されます。
$title = apply_filters( 'pre_get_document_title', '' );
if ( ! empty( $title ) ) {
return $title;
}
つまり、空でない値がpre_get_document_title
フィルターを通過するたびに、wp_get_document_title()
関数はpre_get_document_title
フィルターを介して渡された値を返します。この場合、document_title_separator
フィルターとdocument_title_parts
フィルターは実行されません。これらはpre_get_document_title
フィルターの後にのみ実行されるためです。
あなたがもう少し詳しく言ったことを見てください:
...実際にタイトルを変更することはできませんが。
同じフィルターのインスタンスをオーバーライドする権限を持つpre_get_document_title
フィルターは間違いなくあり、このフィルターのために、関数は渡されたものをすべて返し、document_title_parts
フィルターは実行されません。
必要なことは、grep
または優れたエディターのいずれかを使用して、wp-content
フォルダー全体でそのpre_get_document_title
フィルターを検索することです。そのフィルターを見つけたら、そこから取り出してそのフィルターを削除し、独自のフィルターに置き換えることができます
親テーマがtitle-tag
のサポートを宣言していない場合は、子テーマでこのようにすることができます。
/**
* Theme support should be added on `after_setup_theme`
*/
function add_theme_support_child() {
add_theme_support( 'title-tag' );
}
add_action( 'after_setup_theme', 'add_theme_support_child', 11 );
このように、document_title_parts
の期待される戻り値の型の配列をフィルタするか、あなたの要件に従ってif条件を変更するか、テストのためだけにサイト全体でタイトルを変更するためにそれを完全に削除してください。
/**
* Change title of a page conditionally
*
* @return $title - type array
* $title['title'] - Page Title
* $title['tagline'] - Site Tagline
*/
function change_title_for_a_template( $title ) {
// Check if current page template is 'template-homepage.php'
if ( is_page_template( 'template-homepage.php' ) ) {
$title['title'] = 'Changed title for a template';
}
return $title;
}
add_filter( 'document_title_parts', 'change_title_for_a_template' );
2つの機能を試すことができますか?