web-dev-qa-db-ja.com

Title-tagとdocument_title_partsに関する問題

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への参照を削除しましたが、実際のサイトのタイトルはまだソースに表示されています。

11
hookedonwinter

私の開発分野であなたのフィルタを実行しました。うまくいきませんでした。それから私は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 );
11
cjbj

いくつかの実験の後、私は次のような提案をしました。それは、<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');
}
6
tillinberlin

投稿を上から下、下から上に読んでいると、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フィルターを検索することです。そのフィルターを見つけたら、そこから取り出してそのフィルターを削除し、独自のフィルターに置き換えることができます

3
Pieter Goosen

親テーマが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つの機能を試すことができますか?

2
Nikhil Chavan