Ubah the_title () dari suatu halaman secara dinamis

9

Saya sedang mengembangkan plugin yang tidak menggunakan jenis posting khusus, tetapi memisahkan tabel database. Ini adalah plugin yang menampilkan daftar program dengan tautan yang mengarah ke halaman detail kursus yang berbeda, di mana pengguna kemudian dapat berlangganan kursus.

Dalam kondisi saat ini, saya menggunakan kode pendek untuk memasukkan data plugin ke halaman dengan templat halaman khusus (page-courses.php).

Saya sekarang ingin mengubah the_title()secara dinamis, sesuai dengan halaman yang ditampilkan plugin (daftar kursus, halaman rincian kursus dengan formulir, halaman keberhasilan pengiriman formulir). Tetapi setiap kali saya melakukannya dengan filter berikut, tautan ke halaman lain di footer juga berubah:

<?php

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

Edit

Di footer.php saya memiliki fungsi yang menyertakan tautan footer wp_nav_menu()sehingga saya dapat mendefinisikannya di Appearance> Menus. Tetapi dengan filter di atas, semua tautan di footer juga berubah menjadi 'Judul Kustom'. Tapi saya hanya ingin mengubah judul halaman, tidak mempengaruhi tautan menu di footer.

Mencoba menambahkan tag kondisional in_the_loop(), tautan footer masih terpengaruh, meskipun tidak ada di 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';
}

Ini mirip dengan pertanyaan ini: filter masalah the_title di nav , hanya saja tautan yang terpengaruh ada di footer dan in_the_loop()tidak berfungsi.

Bagaimana saya bisa mengubah the_title()sementara hanya mempengaruhi judul halaman saat ini ditampilkan tidak mempengaruhi tautan di footer ?

Edit 2 - Solusi

Jadi saya akhirnya berhasil:

<?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;
}

File page-listcourses.php adalah Template Posting Kustom yang saya tetapkan untuk halaman statis bernama 'Kursus'.

Saya berasumsi itu tidak berfungsi sebelumnya karena nama halaman statis dan nama file Template Pos Kustom sama.

Gchtr
sumber
1
Mengapa Anda menggulir tabel database Anda sendiri? Hidup Anda akan jauh lebih sederhana jika Anda menerapkan konten khusus Anda sebagai Jenis Posting Kustom .
Chip Bennett
Saya sebenarnya berpikir bahwa pertanyaan ini akan datang. Saya mengembangkan plugin ini untuk mengenal Wordpress, jadi saya pertama kali tidak tahu tentang Jenis Posting Kustom. Saya memiliki dua tabel database, satu untuk kursus dan satu untuk kategori kursus. Satu kategori dapat memiliki beberapa kursus, sehingga dua tabel terhubung. Saya tidak berpikir itu mudah untuk mencapainya dengan Jenis Posting Kustom. Tentu saya bisa menggunakan Taksonomi Kustom untuk kursus, tetapi saya harus menambahkan lebih banyak bidang, karena kategori kursus tidak hanya memiliki nama. Hanya untuk sekarang ini jauh lebih mudah untuk melakukannya dengan tabel database khusus.
Gchtr
1
Kasus penggunaan Anda adalah kasus penggunaan yang tepat dan dimaksudkan untuk Jenis Pos Kustom dan Taksonomi Kustom. Anda mungkin salah mengartikan keanggunan, fleksibilitas, dan kekuatan CPT dan Taksonomi Kustom.
Chip Bennett
Memang mungkin saya lakukan. Saya mungkin harus mencoba. Terima kasih atas sarannya.
Gchtr
in_the_loop()diatur ke truesetiap kali the_post()dipecat. Tanpa menggali terlalu dalam ke inti, dan mengetahui bahwa menu nav sendiri loop , saya menduga bahwa di suatu tempat di sepanjang jalan, wp_nav_menu()instantiates loop, menyebabkan in_the_loop()untuk kembali true.
Chip Bennett

Jawaban:

5

Saya akan menggunakan is_page_template()syarat:

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

Edit

Anda akan menggunakan persyaratan ini di dalam panggilan balik filter Anda:

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' );

Sekarang, untuk mengisolasi hanya judul halaman yang menggunakan template halaman Anda, Anda dapat mengambil keuntungan dari parameter lainnya dilewatkan ke the_title: $id. Karena Anda tahu ID posting yang judulnya difilter, Anda dapat menanyakan _wp_page_templatemeta posting, dan memastikan bahwa itu sama dengan templat halaman Anda:

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 );

Edit 2

Jika Anda ingin menargetkan halaman "Kursus" secara khusus, gunakan is_page()dengan siput halaman 'courses', atau judul halaman 'Courses':

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

Meskipun demikian, saya akan merekomendasikan perubahan page-courses.phpmenjadi Templat Halaman Kustom , yang akan membuat seluruh proses ini jauh lebih kuat.

Chip Bennett
sumber
Itu tidak berhasil untuk saat ini. Tetapi saya memperbaiki pertanyaan saya, karena mungkin tidak cukup spesifik. Mungkin masalahnya ada di tempat lain.
Gchtr
Apa yang Anda maksud dengan " itu tidak berhasil untuk saat ini "? Apa sebenarnya yang Anda coba? Apa yang Anda harapkan terjadi, yang tidak, atau apa yang terjadi secara tak terduga?
Chip Bennett
Lihat jawaban yang diperbarui, yang seharusnya membahas judul item menu nav.
Chip Bennett
Saya mengatakan itu karena saya pikir jawaban Anda mungkin yang benar (mendorong ke arah yang benar), tetapi saya mungkin tidak menanyakan pertanyaan saya dengan cukup jelas. get_post_meta( $id, '_wp_page_template', true )kembali defaultdan saya tidak tahu apa yang harus dilakukan dengan ini. Ketika saya mengatur 'page-courses.php' ke 'default', semua tautan nav berubah, kecuali ketika saya mengaitkan the_titlefilter ke loop_start, maka hanya tautan footer yang berubah. Saya memeriksa file templat mana yang digunakan, dan itu adalah 'page-courses.php' dan bukan 'page.php' (yang saya pikir mungkin yang default).
Gchtr
Jadi, apakah "Kursus" nama halaman statis Anda?
Chip Bennett
1

Jika Anda hanya ingin mengedit judul halaman saat ini, gunakan in_the_loop()kondisional, seperti pada:

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;
}
Pixeline
sumber
0

Coba gunakan tag bersyarat untuk memastikan the_title()hanya dimodifikasi pada halaman yang Anda inginkan.

the Moo akan
sumber
0

Meskipun is_page_template()akan berfungsi, saya lebih suka menempatkan kode semacam ini di templat halaman itu sendiri untuk memiliki semua kode yang menghasilkan halaman semacam ini dalam satu file.

Mark Kaplun
sumber
1
Bagaimana cara kerjanya, dengan asumsi kode yang digunakan the_title()? Contoh kode?
Chip Bennett
@ChipBennett, saya tidak mengerti pertanyaannya. Jika dia membutuhkan filter untuk diterapkan hanya untuk halaman dengan template tertentu maka dia dapat menempatkan kode yang sama dalam template sebelum memanggil get_header().
Mark Kaplun
Ya, sebenarnya saya juga berpikir ini akan berhasil. Namun, saya pikir saya harus mengambil jalan memutar untuk mengatur variabel dalam plugin yang akan tersedia di query_vars? Jadi bagi saya, penyaringan the_titleadalah solusi yang lebih baik.
Gchtr