title-tagとdocument_title_partsに関する問題


12

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、実際のサイトタイトルはまだソースに表示されています。


なぜこの行をコメントアウトしたの//add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });ですか?テーマのサポートを追加する正しい使い方です。
Sumit

@Sumitコメントアウトされたバージョンとアクティブなバージョンの両方を試しました。
hookedonwinter 2016年

initフックにadd_theme_support()関数を追加してみてください。もう1つは、HTML タグを持たないようにファイルを上書きすることです。header.php<title>
Howdy_McGee

@Howdy_McGee試してみましたが、まだ何もありません。gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4
hookedonwinter

@hookedonwinterそして<title>、あなたの中にタグがないと確信していますheader.phpか?多分に置き換え10てみてくださいPHP_MAX_INT。また、渡されたパラメータは文字列値ではなく配列です。
Howdy_McGee

回答:


13

私の開発領域でフィルターを実行しました。うまくいきませんでした。次に、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 );

1
了解しました!私は同じことを見つけ、Yoastを無効にしました。私は再アクティブ化してあなたの優先順位を使用しましたが、うまくいきました ありがとうございました!
hookedonwinter 2016

もう少しここにフック上:wordpress.stackexchange.com/questions/109869/...
cjbj

私のサイトでは、pre_get_document_title優先度15で十分です。
VEE

7

いくつかの実験をした後、次の提案に行きました。<title>タグが親テーマ内に「ハードコード」されているのではheader.phpないでしょうか。その場合は、<title>子テーマからタグを削除しheader.php(親をheader.php子テーマフォルダーにコピー)、次にを介してテーマサポートを追加してみてfunctions.phpください。

add_theme_support( 'title-tag' );

私がこの提案につながった理由を説明しようと思います。私はあなたや他の人が提案したように試しましたが、ソースコードに2つの<title>タグが見つかったことがわかりました。最初のものは標準のタイトルで、2番目のものは変更されたタイトルでした。しかし、(もちろん)ブラウザのタイトルバーには、デフォルトのタイトルしか表示されませんでした。

次に、header.php使用した親テーマ(twentyfourteen)のを確認しました。<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>、テンプレートからタグを削除する前にも基本的に機能しました。ただし、2つの <title>タグがあり、そのうちの2つは無視されました。これはあなたのテーマと同じ問題でしょうか?

wp 4.4.0以降、ただし、<title>タグは_wp_render_title_tag()基本的に別の関数wp_get_document_title()を呼び出し、結果の周りにhtmlタグをラップする関数によって動的に作成されます。簡単に言うと、テーマheader.php<title>タグがない場合は、次のように、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');
}

3

上から下へ、下から上への投稿を読んだら、すべての確率でフィルターにタイトルを渡すフィルターがあり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フィルタについてフォルダ全体を検索することです。そのフィルターを見つけたら、そこから取り出してフィルターを取り外し、独自のフィルターと交換できます。


答えてくれてありがとう!残念ながら、ためのwp-すべてのコンテンツを検索document_title_partsまたはpre_get_document_title0の結果を返します。私はすべてのwpコンテンツを検索するためにSublimeText 2を使用しています...
hookedonwinter

これは本当に私を打ち負かします。関数内の1つのフィルターが正しく起動し、その後のフィルターが起動しないのは、本当に奇妙です。プラグインやテーマではないことが確実な場合は、すべてのキャッシュをクリアしてWordPressを再インストールしてください。バンドルされたテーマを使ったバニラインストールで何が起こるか、親テーマを直接変更するとどうなるか。これは残念ながら私が与えられた情報を手助けできる限りです。追加情報がある場合は、編集してファイルを提出してください。問題の解決を
お手伝いし

@PieterGoosen最初のフィルターが空以外を返す場合、関数は短絡され、2番目のフィルターは評価されません。
cjbj

@cjbjはい、そうです、それが私の答えで私が言ったことです、問題は何ですか。OPが言ったように、彼はでフィルターを見つけることができませんpre_get_document_title。2番目のフィルターが作動しない理由を完全に説明していたでしょう。これにより、pre_get_document_titleフィルターは空のままになります。つまり、関数内の他の2つのフィルターは起動する必要がありますが、起動しません。破損したWordpressコアを結論づけるのは私に任されています。
Pieter Goosen

ただし、そのフィルターは簡単に機能します。
cjbj

2

親テーマがサポートを宣言していない場合は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つの機能を試すことができますか?


答えてくれてありがとう。私は試してみましたが、ifステートメントを削除してより広範にし、エラーログを追加して結果を確認しました。これがコードです。。のみadd_theme_support_childが記録されます。
hookedonwinter 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.