Title-tag ve document_title_parts ile ilgili sorunlar


12

Wordpress version 4.5.1

Dinamik olarak belirli bir şablondaki sayfa başlıklarını güncellemeye çalışıyorum. wp_title()Değişiklikleri araştırıp öğrendikten sonra kullanmaya çalışıyorum document_title_parts. Ancak, filtrenin hiç çalışmasını sağlayamıyorum.

Bir çocuk temasındayım functions.php:

add_theme_support( 'title-tag' );
//add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });

add_filter( 'document_title_parts', function( $title )
{
    error_log('here');
    return $title;

}, 10, 1 );

Yukarıda gösterildiği gibi tema desteği eklemenin her iki varyasyonunu denedim, ancak günlüğümü izlerken, sayfa yeniden yüklemesinde hiçbir şey görünmüyor. Bu error_log, diğer işlevlerle (örneğin wp_title) çalışıyordu, bu nedenle hata günlüğü çalışıyor.

Ayrıca pre_get_document_title, aslında başlığı değiştirmek için alamıyorum rağmen, sayfa yükleme ateş ediyor denedim .

Yani! Filtreyi yanlış kullanıyorum, temamı doğru bir şekilde ayarlamıyorum veya farkında olmadığım başka bir şey. Herhangi bir yardım büyük mutluluk duyacağız!

daha fazla ayrıntı eklemek için düzenle

Bir başlatma işlevini denemek, ancak bu da çalışmıyor: https://gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4

Ben herhangi bir göndermede kaldırdık Ayrıca, süre <title>gelen header.php, gerçek site başlığı hala kaynağında kendini göstermesidir.


Neden bu çizgiyi yorumladınız //add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });? Tema desteği eklemenin doğru kullanımı.
Zirve

@Sumit Yorumlanan sürümü ve etkin sürümü denedim.
hookedonwinter

Belki add_theme_support()bir başlangıç ​​kancasına işlev eklemeyi deneyin . Başka bir şey, html etiketine sahip olmamak için header.phpdosyanızın üzerine yazdığınızdan emin olmaktır . <title>
Howdy_McGee

@Howdy_McGee Sadece denedim, hala hiçbir şey. gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4
hookedonwinter

@hookedonwinter Ve <title>etiketinizde etiket olmadığından emin misiniz header.php? Belki değiştirmeyi deneyin 10ile PHP_MAX_INT. Ayrıca, iletilen parametre dize değeri yerine bir dizidir.
Howdy_McGee

Yanıtlar:


13

Filtrenizi geliştirme alanımda çalıştırdım. İşe yaramadı. Sonra da sayfa başlığı ile karışıklık olduğunu biliyordum Yoast SEO eklentisini kapattı. Sonra işe yaradı. Yani benim önerim başka bir eklenti onunla uğraşmak olacaktır.

Yoast örneğinde, pre_get_document_titleboş olmayan dönmeye yapılan bir filtre çağrısıydı . Bu durumda wp_get_document_titlekısa devre yapılır ve documents_title_partsfiltre dahil olmak üzere işlevin geri kalanı , ilk kod satırlarından görebileceğiniz gibi değerlendirilmez:

$title = apply_filters( 'pre_get_document_title', '' );
if ( ! empty( $title ) ) {
    return $title;
    }

Filtreni aldım ve kancayı değiştirdim pre_get_document_title. İşe yaramadı. Sonra önceliği Yoast'taki aynı filtreden daha yüksek bir seviyeye değiştirdim. Sonra işe yaradı. Yani, kurulumunuzu bilmiyorum, ama bunu denemenizi öneririz:

add_filter( 'pre_get_document_title', function( $title )
  {
    error_log('here');
    return $title;
  }, 999, 1 );

1
Anladın! Aynı şeyi buldum ve Yoast'ı devre dışı bıraktım. Az önce yeniden etkinleştirdim ve önceliğinizi kullandım ve işe yaradı. TEŞEKKÜR EDERİM!
hookedonwinter

Burada kancalar hakkında biraz daha: wordpress.stackexchange.com/questions/109869/…
cjbj

Sitemden pre_get_document_titleöncelik 15 yeterlidir.
vee

7

Biraz deneme yaptıktan sonra şu öneriye geldim: <title>etiketi ana temanızın içinde "sabit kodlanmış" olabilir header.phpmi? Bu durumda, <title>etiketi alt temanızdan kaldırmayı header.php(ebeveyninizin header.phpalt tema klasörünüze kopyalamasını ) ve ardından tema desteğini aşağıdakiler aracılığıyla geri ekleyebilirsiniz functions.php:

add_theme_support( 'title-tag' );

Beni bu öneriye yönlendiren şeyi açıklamaya çalışacağım: Siz ve diğerlerinin önerdiği gibi denedim - ancak kaynak kodunda iki <title>etiket bulduğum ortaya çıktı . Birincisinin standart başlığı , ikincisinin değiştirilmiş başlığı vardı . Ancak (elbette) tarayıcı başlık çubuğunda yalnızca varsayılan başlığı görebiliyordum.

Daha sonra header.phpkullandığım ana temayı (yirmi dört) kontrol ettim ve <title>etiket gerçekten bu şablonun içinde böyle kodlandı:

<title><?php wp_title( '|', true, 'right' ); ?></title>

Ben kaldırdıktan sonra, alt tema için aşağıdaki kodu ekledim functions.phpve çalıştı:

/**
 * Theme support added
 */

function add_theme_support_child() {

    add_theme_support( 'title-tag' );

}

add_action( 'after_setup_theme', 'add_theme_support_child', 11 );


/**
 * Change the title of a page
 * 
 */

function change_title_for_a_template( $title ) {

// Check if current page template is 'template-homepage.php'
// if ( is_page_template( 'template-homepage.php' ) ) {

    // change title parts here
    $title['title'] = 'My Title'; 
    $title['tagline'] = 'My fancy tagline'; // optional
    $title['site'] = 'example.org'; //optional

// }

return $title; 

}

add_filter( 'document_title_parts', 'change_title_for_a_template', 10, 1 );

Bu nedenle, <title>etiketi şablondan kaldırmadan önce de işe yaradı - ancak daha sonra göz ardı edilen iki <title> etiket vardı . Bu, temanızla aynı sorun olabilir mi?

Ancak wp 4.4.0'dan beri <title>etiket_wp_render_title_tag() temel olarak başka bir işlevi çağıran wp_get_document_title()ve html etiketlerini sonucun etrafına saran işlev tarafından dinamik olarak oluşturulur . Uzun lafın kısası: Temanızın etiketi header.phpeksikse <title>, başlığı doğrudan buradanpre_get_document_title veya document_title_partsaçıklandığı gibi geçersiz kılabilirsiniz :

1) başlığı doğrudan değiştirin:

add_filter('pre_get_document_title', 'change_the_title');
function change_the_title() {
    return 'The expected title';
}

2) başlık parçalarının filtrelenmesi:

add_filter('document_title_parts', 'filter_title_part');
function filter_title_part($title) {
    return array('a', 'b', 'c');
}

3

Gönderinizi üstten botom'a ve aşağıdan yukarıya okuduktan sonra, muhtemelen bir başlık pre_get_document_titlefiltreden geçen bir filtreye sahipsiniz . Buradaki ipucu aşağıdaki ifade:

Ben de denedim pre_get_document_title, hangi sayfa yükleme ateş ediyor,

İçin soure kodunawp_get_document_title() baktığımızda şu kodu görüyoruz:

$title = apply_filters( 'pre_get_document_title', '' );
if ( ! empty( $title ) ) {
    return $title;
}

Bunun anlamı, pre_get_document_titlefiltreden boş olmayan bir değer geçtiğinde , wp_get_document_title()işlev pre_get_document_titlefiltreden geçen değeri döndürür . Bu durumda, document_title_separatorfiltre ve document_title_partsfiltre hiçbir zaman yürütülmez çünkü bunlar sadece pre_get_document_titlefiltreden sonra çalışır .

Söylediklerinize biraz daha bakarak:

... ancak başlığı değiştirmesini sağlayamıyorum.

kesinlikle pre_get_document_titleaynı filtrenin örneğini geçersiz kılan bir otoriteye sahip bir filtreniz var ve bu filtre nedeniyle, kendisine iletilen her ne olursa olsun, işlev, document_title_partsfiltrenizin yürütülmemesine neden oluyor.

Yapmanız gereken şey, ya grepiyi bir düzenleyici kullanmak ve wp-contentbu pre_get_document_titlefiltreyi tüm klasörünüzde aramaktır. Bu filtreyi bulduktan sonra, filtreyi kaldırmak ve kendi filtrenizle değiştirmek için o filtreyi oradan alabilir


Cevap için teşekkürler! Ne yazık ki, tüm wp içeriğinin aranması document_title_partsveya pre_get_document_title0 sonuç döndürmesi. Tüm wp-içerik aramak için SublimeText 2 kullanıyorum ...
hookedonwinter

Bu beni gerçekten yeniyor. Bir fonksiyondaki bir filtrenin doğru şekilde patlaması ve bundan sonra filtrenin patlamaması gerçekten garip. Tüm önbellekleri temizlemeyi deneyin ve bir eklenti veya temanız olmadığından eminseniz WordPress'i yeniden yükleyin. Birlikte verilen bir tema ile vanilya kurulumunda ne olur, ana temayı doğrudan değiştirirseniz ne olur. Bu ne yazık ki verilen bilgi ile yardımcı olabilir kadarıyla. Ekstra bilginiz varsa, bunu
çözmenize

@PieterGoosen İlk filtre boş olmadığında işlev kısa devre yapar ve ikinci filtre değerlendirilmez.
cjbj

@cjbj evet, doğru, cevabımda söylediğim bu, sorun ne. OP'nin dediği gibi, bir filtre bulamıyor pre_get_document_title, ikinci filtrenin neden ateşlemeyeceğini tamamen açıklayacaktı. Bu pre_get_document_titlefiltreyi boş bırakır , yani işlevdeki diğer iki filtrenin çalışması gerekir, ancak açılmaz. Beni bozuk bir Wordpress çekirdeği sonuçlandırıyor.
Pieter Goosen

Sadece o filtreyi rahatlıkla kullanabilmem için
cjbj

2

Üst tema title-tagsizin için destek beyan etmezse, alt temada bunu yapabilirsiniz

/**
 * Theme support should be added on `after_setup_theme`
 */
function add_theme_support_child() {

    add_theme_support( 'title-tag' );

}

add_action( 'after_setup_theme', 'add_theme_support_child', 11 );

Bunun document_title_partsgibi beklenen dönüş türü dizisini filtreleyin , if koşulunu gereksinimlerinize göre değiştirdiğinizden emin olun veya yalnızca çalışıp çalışmadığını test etmek için sitedeki başlığı değiştirmek için tamamen kaldırın.

/**
 * Change title of a page conditionally
 * 
 * @return $title - type array
 * $title['title'] - Page Title
 * $title['tagline'] - Site Tagline
 */
function change_title_for_a_template( $title ) {

    // Check if current page template is 'template-homepage.php'
    if ( is_page_template( 'template-homepage.php' ) ) {
        $title['title'] = 'Changed title for a template';
    }

    return $title;

}

add_filter( 'document_title_parts', 'change_title_for_a_template' );

Bu iki işlevi deneyebilir misiniz?


Cevap için teşekkürler. Ben denedim, daha geniş hale getirmek için if deyimi kaldırarak, ve ne olduğunu görmek için bazı hata günlüğü ekledi. İşte kod. . Sadece add_theme_support_childgünlüğe kaydedilir.
hookedonwinter
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.