Sayfanın the_title () yöntemini dinamik olarak değiştirme


9

Özel bir yazı türü, ancak ayrı veritabanı tabloları kullanmayan bir eklenti geliştiriyorum. Kullanıcının bir kursa abone olabileceği farklı kurs ayrıntı sayfalarına yönlendiren bağlantıları olan kursların bir listesini görüntüleyen bir eklentidir.

Mevcut durumda, eklenti verilerini özel sayfa şablonuyla (page-courses.php) bir sayfaya almak için bir kısa kod kullanıyorum.

Şimdi the_title()eklentinin gösterdiği sayfaya göre (derslerin listesi, formlarla ders ayrıntıları sayfası, form gönderme başarı sayfası) dinamik olarak değiştirmek istiyorum . Ancak bunu aşağıdaki filtreyle yaptığımda, altbilgideki diğer sayfalara olan bağlantılar da değişir:

<?php

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

Düzenle

Footer.php dosyasında wp_nav_menu(), Görünüm> Menüler'de tanımlayabilmem için altbilgi bağlantıları içeren bir işlevim var . Ancak yukarıdaki filtreyle, altbilgideki tüm bağlantılar da 'Özel Başlık' olarak değişir. Ancak, yalnızca altbilgideki menü bağlantılarını etkilemeden sayfanın başlığını değiştirmek istiyorum.

Koşullu bir etiket eklemeye çalışıldığında in_the_loop(), altbilgi bağlantıları döngüde olmamasına rağmen yine de etkilenir.

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

Bu soruya benzer: nav'daki the_title sorununu filtreleyin , sadece etkilenen bağlantılar altbilgide bulunur ve in_the_loop()çalışmaz.

Nasıl değiştirebilirim the_title()sadece gösterilmeden Mevcut sayfanın başlığını etkileyen ederken altbilgideki bağlantıları etkilemeyen ?

Düzenleme 2 - Çözüm

Sonunda işe koyuldum:

<?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 dosyası, 'Dersler' adlı statik sayfaya atadığım Özel Gönderi Şablonudur.

Statik sayfanın adı ve Özel Yazı Şablonu'nun dosya adı aynı olduğundan daha önce işe yaramadığını varsayıyorum.


1
Neden kendi veritabanı tablolarınızı hazırlıyorsunuz? Özel içeriğinizi Özel Gönderi Türü olarak uyguladıysanız hayatınız çok daha kolay olurdu .
Chip Bennett

Aslında bu sorunun geleceğini düşündüm. Wordpress'i tanımak için bu eklentiyi geliştirdim, bu yüzden ilk önce Özel Yazı Türlerini bilmiyordum. Biri kurslar, diğeri kurs kategorileri için olmak üzere iki veritabanı tablom var. Bir kategoride birkaç kurs olabilir, bu nedenle iki tablo birbirine bağlıdır. Özel Gönderi Türleriyle bunu başarmanın o kadar kolay olduğunu sanmıyorum. Elbette kurslar için Özel Taksonomiler kullanabilirim, ancak bir kurs kategorisinin sadece adı olmadığı için daha fazla alan eklemem gerekir. Şimdilik özel veritabanı tablolarıyla yapmak çok daha kolay.
Gchtr

1
Kullanım durumunuz, Özel Gönderi Türleri ve Özel Taksonomiler için tam, amaçlanan kullanım durumudur . CPT'lerin ve Özel Taksonomilerin zarafetini, esnekliğini ve gücünü yanlış tahmin ediyor olabilirsiniz .
Chip Bennett

Gerçekten yapmam mümkün. Muhtemelen denemeliyim. Tavsiye için teşekkürler.
Gchtr

in_the_loop()trueher the_post()tetiklendiğinde olarak ayarlanır . Çekirdeğe fazla derinlemesine bakmadan ve gezinme menülerinin kendilerinin döngüler olduğunu bilmeden , yol boyunca bir yerde wp_nav_menu()bir döngü oluşturduğunu in_the_loop()ve dönüşe neden olduğunu tahmin ediyorum true.
Chip Bennett

Yanıtlar:


5

is_page_template()Koşullu kullanırdım :

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

Düzenle

Bu koşullu kullanmak istiyorsunuz filtre callback'inde:

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

Şimdi, sayfa şablonu kullanan sayfalarda sadece başlıklarını izole etmek, sen geçirilen diğer parametrenin yararlanabilirsiniz the_title: $id. Başlığın filtrelendiği _wp_page_templategönderinin kimliğini bildiğiniz için gönderi metasını sorgulayabilir ve sayfanızın şablon şablonuna eşit olduğundan emin olabilirsiniz:

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

Düzenle 2

"Dersler" sayfasını özel olarak hedeflemek istiyorsanız is_page(), sayfa bilgi sayfasıyla 'courses'veya aşağıdakilerin sayfa başlığıyla kullanın 'Courses':

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

Yine de, tüm bu süreci çok daha sağlam hale getirecek page-courses.phpbir Özel Sayfa Şablonuna geçmenizi öneririm .


Şimdilik işe yaramadı. Ama sorumu rafine ettim, çünkü bu yeterince spesifik olmayabilir. Belki de sorun başka bir yerde yatıyor.
Gchtr

" Şimdilik işe yaramadı " ile ne demek istiyorsun ? Ne tam olarak sen denedin mi? Ne olmasını bekliyordun, olmadı ya da beklenmedik bir şekilde ne oldu?
Chip Bennett

Gezinme menüsü öğesi başlıklarını ele alması gereken güncellenmiş cevaba bakın.
Chip Bennett

Dedim ki, çünkü cevabınız doğru cevap olabilir (doğru yöne doğru iterek), ama belki de sorumu yeterince net bir şekilde sormadım. get_post_meta( $id, '_wp_page_template', true )döner defaultve bununla ne yapacağımı bilmiyorum. 'Page-courses.php' öğesini 'varsayılan' olarak ayarladığımda, the_titlefiltreyi bağladığım durumlar dışında tüm gezinme bağlantıları değişir, ancak loop_startyalnızca altbilgi bağlantıları değişir. Hangi şablon dosyasının kullanıldığını kontrol ettim ve 'page.php' değil, 'page-courses.php' (varsayılan dosya olabileceğini düşündüm) değil.
Gchtr

Peki, "Dersler" statik sayfanızın adı mı?
Chip Bennett

1

Yalnızca geçerli sayfa başlığını düzenlemek istiyorsanız, şu şekilde in_the_loop()koşullu kullanın :

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

Çalışacak olsa is_page_template()da, bu tür bir kodu tek bir dosyada üreten tüm kod sahip olması için bu tür kodu sayfa şablonunun içine koymayı tercih ederim.


1
Söz konusu kodun kullandığı varsayımı altında bu nasıl çalışır the_title()? Kod örnekleri?
Chip Bennett

@ChipBennett, soruyu anlamıyorum. Filtrenin yalnızca belirli bir şablona sahip sayfa için uygulanması gerekiyorsa, çağırmadan önce aynı kodu şablona yerleştirebilir get_header().
Mark Kaplun

Evet, aslında bunun da işe yarayacağını düşünüyorum. Ancak, ben sorgu_vars kullanılabilir eklentisi bir değişken ayarlamak için dolambaçlı yol almak zorunda olacağını düşünüyorum? Benim için filtreleme the_titledaha güzel bir çözüm.
Gchtr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.