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


9

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

現在の状態では、ショートコードを使用して、カスタムページテンプレート(page-courses.php)を含むページにプラグインデータを取得しています。

the_title()プラグインが表示するページ(コースのリスト、フォームのあるコース詳細ページ、フォーム送信の成功ページ)に応じて、動的に変更したいと思います。しかし、次のフィルターを使用してそれを行うと、フッター内の他のページへのリンクも変更されます。

<?php

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

編集する

footer.phpにフッターリンクを含む関数があるwp_nav_menu()ので、[外観]> [メニュー]でフッターリンクを定義できます。ただし、上記のフィルターを使用すると、フッター内のすべてのリンクも「カスタムタイトル」に変更されます。しかし、私はページのタイトルを変更したいだけで、フッターのメニューリンクには影響しません。

条件付きタグを追加しよう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は、「コース」という名前の静的ページに割り当てたカスタム投稿テンプレートです。

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


1
独自のデータベーステーブルをローリングするのはなぜですか?カスタムコンテンツカスタム投稿タイプとして実装した場合、あなたの生活ははるかに簡単になります。
チップベネット

私は実際にこの質問が来ると思っていました。私はこのプラグインを開発してWordpressを理解したので、最初はカスタム投稿タイプについて知りませんでした。2つのデータベーステーブルがあり、1つはコース用で、もう1つはコースカテゴリ用です。1つのカテゴリに複数のコースを含めることができるため、2つのテーブルがリンクされています。カスタム投稿タイプでそれを達成するのはそれほど簡単ではないと思います。もちろん、コースにカスタム分類法を使用することはできますが、コースカテゴリは名前だけではないため、フィールドを追加する必要があります。今のところ、カスタムデータベーステーブルを使用する方がはるかに簡単です。
Gchtr 2013年

1
あなたのユースケースは、カスタム投稿タイプとカスタム分類正確で意図されたユースケースです。あなたはできるmisunderestimating CPTSとカスタムタクソノミの優雅さ、柔軟性、およびパワーを。
チップベネット

私がそうすることは確かに可能です。たぶんやってみるべきだろう。アドバイスありがとうございます。
Gchtr 2013年

in_the_loop()が起動されるtrueたびに設定されthe_post()ます。コアを深く掘り下げて、ナビゲーションメニュー自体がループであることがわからない場合は、途中のどこかでwp_nav_menu()ループがインスタンス化されて、in_the_loop()が返されると思いますtrue
チップベネット

回答:


5

私はis_page_template()条件を使用します:

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

編集する

フィルターコールバック内でこの条件を使用します。

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

特に「コース」ページをターゲットにする場合is_page()は、ページslug 'courses'または次のページタイトルを使用します'Courses'

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にするカスタムページテンプレートに変更することをお勧めします。


それは今のところ機能しませんでした。しかし、質問が十分に具体的ではなかった可能性があるため、質問を絞り込みました。たぶん問題はどこかにあるのでしょう。
Gchtr 2013年

今はうまくいかなかった」とはどういう意味ですか?正確に何を試しましたか?何が起こると予想しましたか、それは起こりませんでしたか、または予期せず何が起こりましたか?
チップベネット

更新された回答を参照してください。これは、ナビゲーションメニュー項目のタイトルに対処する必要があります。
チップベネット

私はあなたの答えは正しいかもしれない(正しい方向に押す)と思うので、しかし私は私の質問を十分に明確にしていないかもしれないと言った。get_post_meta( $id, '_wp_page_template', true )戻るdefaultと私はこれで何をすべきかわかりません。「page-courses.php」を「デフォルト」に設定すると、すべてのナビゲーションリンクが変更されます。ただし、the_titleフィルターをにフックする場合を除きloop_start、フッターリンクのみが変更されます。使用されているテンプレートファイルを確認しました。これは、「page.php」ではなく「page-courses.php」です(これがデフォルトのファイルだと思いました)。
Gchtr 2013年

では、「コース」は静的ページの名前ですか?
チップベネット

1

現在のページタイトルのみを編集する場合は、次のように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;
}


0

一方でis_page_template()意志の仕事、私は1つのファイル内のページのこの種を生成し、すべてのコードを持っているページテンプレート自体にこの種のコードを置くことを好みます。


1
問題のコードが使用しているという仮定の下で、それはどのように機能しthe_title()ますか?コード例?
チップベネット

@ChipBennett、私は質問を理解していません。特定のテンプレートを含むページにのみフィルターを適用する必要がある場合は、を呼び出す前にテンプレートに同じコードを配置できget_header()ます。
Mark Kaplun、2013年

はい、実際私もこれでうまくいくと思います。ただし、query_varsで使用できる変数をプラグインに設定するには、迂回する必要があると思いますか?したがって、私にとって、フィルタリングthe_titleはより優れたソリューションです。
Gchtr 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.