web-dev-qa-db-ja.com

ページのthe_title()を動的に変更する

私はカスタムの投稿タイプを使用せず、別々のデータベーステーブルを使用するプラグインを開発しています。これは、コースのリストをさまざまなコース詳細ページにリンクするリンクとともに表示するプラグインです。ここで、ユーザーはコースを購読することができます。

現状では、カスタムページテンプレート(page-course.php)を使って、プラグインデータをページに入れるためのショートコードを使用しています。

プラグインが表示するページ(コースのリスト、フォームを含むコース詳細ページ、フォーム送信成功ページ)に従って、the_title()を動的に変更したいと思います。しかし、私が以下のフィルタでそれをするときはいつでも、フッターの他のページへのリンクも変わります:

<?php

add_filter('the_title', 'custom_page_title');
function custom_page_title() {
    return 'Custom Title';
}

編集する

Footer.phpにはwp_nav_menu()のフッターリンクを含む関数があるので、Appearance> Menusで定義できます。しかし、上記のフィルタを使用すると、フッター内のすべてのリンクも「カスタムタイトル」に変わります。しかし、フッターのメニューリンクには影響を与えずに、ページのタイトルを変更するだけです。

条件付きタグin_the_loop()を追加しようとしても、フッターリンクは影響を受けますが、ループ内にはありません。

<?php

add_action( 'loop_start', 'set_custom_title' );
function set_custom_title() {
    if ( in_the_loop() ) {
        add_filter( 'the_title', 'custom_page_title' );
    }
}

function custom_page_title() {
    return 'Custom Title';
}

これは、次の質問に似ています。 navでthe_title問題をフィルタリングする 、影響を受けるリンクがフッターにあり、in_the_loop()が機能しないことだけ。

表示されている現在のページのタイトルにのみ影響を与えながらthe_title()を変更するにはどうすればよいですか フッター内のリンクには影響しません

編集2 - ソリューション

それで私はついにそれを動かしました:

<?php

add_action( 'loop_start', 'set_custom_title' );
function set_custom_title() {
    add_filter( 'the_title', 'wpse83525_filter_the_title', 10, 2 );
}

function wpse83525_filter_the_title( $title, $id ) {
    if ( 'page-listcourses.php' == get_post_meta( $id, '_wp_page_template', true ) ) {
        return 'Custom Title';
    }
    return $title;
}

ファイルpage-listcourses.phpは、 'Courses'という名前の静的ページに割り当てたカスタム投稿テンプレートです。

静的ページの名前とカスタム投稿テンプレートのファイル名が同じであったため、以前はうまくいかなかったと思います。

9
Gchtr

is_page_template() 条件を使用します。

if ( is_page_template( 'page-courses.php' ) ) {
    // The current page uses your
    // custom page template;
    // do something
}

編集する

あなたはこの条件付きinsideあなたのフィルタコールバックを使うでしょう:

function wpse83525_filter_the_title( $title ) {
    if ( is_page_template( 'page-courses.php' ) ) {
        return 'Custom Title';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );

今、あなたのページテンプレートを使用するページのタイトルだけを分離するために、あなたはthe_titleに渡される他のパラメータを利用することができます:$id。タイトルが絞り込まれている投稿のIDがわかっているので、_wp_page_template投稿メタを照会して、それがあなたのページテンプレートと同じであることを確認することができます。

function wpse83525_filter_the_title( $title, $id ) {
    if ( 'page-courses.php' == get_post_meta( $id, '_wp_page_template', true ) ) {
        return 'Custom Title';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title', 10, 2 );

編集2

特に "Courses"ページをターゲットにしたい場合は、ページスラッグ'courses'、またはページタイトル'Courses'と共にis_page()を使用してください。

function wpse83525_filter_the_title( $title ) {
    if ( is_page( 'Courses' ) ) {
        return 'Custom Title';
    }
    return $title;
}
add_filter( 'the_title', 'wpse83525_filter_the_title' );

ただし、page-courses.php カスタムページテンプレート に変更することをお勧めします。これにより、このプロセス全体がはるかに堅牢になります。

5
Chip Bennett

現在のページタイトルのみを編集する場合は、次のようにin_the_loop()条件を使用します。

add_filter( 'the_title', 'modify_onpage_title', 10, 2);

function modify_onpage_title( $title , $id = null ) {

    if(!in_the_loop()){
        // returns early if not relevant (as in custom menu loops)
        return $title;
    }

    // Tweak your title
    $title = "Yolo! ". $title;
    return $title;
}
1
pixeline

コンディショナルタグ を使用して、the_title()が必要なページでのみ変更されるようにしてください。

0
theMojoWill

is_page_template()は機能しますが、この種のページを生成するすべてのコードを1つのファイルに含めるには、この種のコードをページテンプレート自体に含めることをお勧めします。

0
Mark Kaplun