web-dev-qa-db-ja.com

プラグイン内から動的にページのタイトルを変更する

すべてのWordPressページは、2つのタイトルを持つものとして説明できます。

  1. the_title()関数呼び出しによってページ/投稿内に表示されるページ/投稿のタイトル

  2. ブラウザの上部にタイトルを表示するhtml <title></title>タグ

私はある時点でページのタイトルを動的に変更するプラグインを書いています(まあ、それは上で説明した両方のタイトルを変更するはずです)。

そのため、上記のステップ1では、Stack Overflowに複数の解決策( this または this など)が見つかりました。これらは上記のステップ1だけに最適です。

ステップ2のために、私は これ 解決策を見つけました。一言で言えば、これはそれがどのように動作するかです:

add_filter('wp_title', 'change_page_title');
function change_page_title ($title) {

    // Do some magic, and eventually modify $title then return it
    return $title;
}

しかし提案された解決策は私にはうまくいきません。そして動作していないということは、フィルタが関連する関数を呼んでいないということです。何が問題なのかわかりません。このフィルタはテーマではなくプラグインの中から呼び出されているのでしょうか。 (ちなみに、私はテーマファイルにアクセスできないので、プラグイン内から行う必要があります)。

どうすればこれを達成できますか?プラグイン内から動的にページのブラウザタイトルを変更するにはどうすればよいですか?

ありがとう。

5
Greeso

投稿またはページにはタイトルが1つだけあります。タイトルタグ<title>はドキュメントのタイトルです。

フィルタwp_titleは、ドキュメントのタイトルを出力するために以前使用されていたwp_title()関数の出力をフィルタします。 WordPress 4.1では、テーマにおけるタイトルタグのサポートが導入され、wp_get_document_title()の代わりに wp_title() が使用されます。そのため、テーマがtitle-tagをサポートしている場合、wp_titleフィルタは効果がありませんが、他のフィルタを使用することができます。

pre_get_document_title 新しいタイトルを設定する

add_filter( 'pre_get_document_title', 'cyb_change_page_title' );
function cyb_change_page_title () {

    return "Custom title";

}

document_title_separator タイトルセパレータをフィルタリングする

add_filter('document_title_separator', 'cyb_change_document_title_separator');
function cyb_change_document_title_separator ( $sep ) {

    return "|";

}

documente_title_parts タイトルのさまざまな部分(タイトル、ページ番号、タグライン、サイト名)をフィルタリングします。

add_filter( 'document_title_parts', 'cyb_change_document_title_parts' );
function cyb_change_document_title_parts ( $title_parts ) {

    $title_parts['title'] = 'Custom title';
    $title_parts['page'] = 54;
    $title_parts['tagline'] = "Custom tagline";
    $title_parts['site'] = "My Site"; // When not on home page

    return $title_parts;

}

PD:テーマがtitle-tagをサポートしているかどうかをチェックするために current_theme_supports( 'title-tag' ) を使うことができます。

8
cybmeta

あなたのpage.phpまたはあなたが変更したいページでこのコードを使う<pre> <title><?php wp_title(); ?> | <?php bloginfo(‘name’); ?></title> </pre>

0