Проблеми з тегом title та document_title_parts


12

Wordpress version 4.5.1

Я намагаюся динамічно оновлювати заголовки сторінок для певного шаблону. Після багатьох копань та дізнання про wp_title()зміни я намагаюся використовувати document_title_parts. Однак я не можу змусити фільтра працювати.

Я в дитячій темі 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 );

Я спробував обидві варіанти додавання підтримки теми, як показано вище, але переглядаючи мій журнал, при перезавантаженні сторінки нічого не з’являється. Це error_logпрацювало з іншими функціями (такими як wp_title), тому реєстрація помилок працює.

Я також спробував pre_get_document_title, що спрацьовує при завантаженні сторінки, хоча я не можу змусити її фактично змінити назву.

Тому! Я або неправильно використовую фільтр, неправильно налаштував свою тему, або щось інше, про що я не знаю. Будь-яка допомога буде дуже вдячна!

редагуйте, щоб додати більше деталей

Спроба функції init, але вона також не працює: https://gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4

Крім того , в той час як я видалив всі посилання на <title>з header.php, фактичну назву сайту по - , як і раніше з'являється в джерелі.


Чому ви прокоментували цей рядок //add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });? Правильне використання додавання підтримки для теми.
Суміт

@Sumit Я спробував як коментовану версію, так і активну версію.
причепився зимою

Можливо, спробуйте додати add_theme_support()функцію в гачок init . Інша справа - переконатися, що ви перезаписуєте свій header.phpфайл, щоб не було <title>тегів HTML .
Howdy_McGee

@Howdy_McGee Просто спробував це, все ще нічого. gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4
причепився до зими

@hookedonwinter І ви впевнені, що у вас немає <title>тегів header.php? Можливо, спробуйте замінити 10на PHP_MAX_INT. Також переданий параметр - це масив замість значення рядка.
Howdy_McGee

Відповіді:


13

Я запустив ваш фільтр у моїй області розвитку. Це не спрацювало. Тоді я вимкнув плагін Yoast SEO, який я знав, що також псується з назвою сторінки. Тоді це спрацювало. Тож моя пропозиція буде ще одним плагіном з цим возитися.

У випадку з Yoast це був заклик фільтру до pre_get_document_titleповернення не порожнього. У цьому випадку wp_get_document_titleкоротке замикання, а решта функції, включаючи documents_title_partsфільтр, не оцінюється, як видно з перших рядків коду:

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

Отже, я взяв ваш фільтр і змінив гачок на pre_get_document_title. Це не спрацювало. Тоді я змінив пріоритет на більш високий рівень, ніж той самий фільтр в Yoast. Тоді це спрацювало. Тож я не знаю про ваше налаштування, але пропоную вам спробувати:

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

1
Ти маєш це! Я знайшов те саме і відключив Йоаст. Я просто активізував і використав ваш пріоритет, і це спрацювало. ДЯКУЮ!
причепився зимовий

Трохи більше про гачки тут: wordpress.stackexchange.com/questions/109869/…
cjbj

З мого сайту достатньо pre_get_document_titleпріоритету 15 .
ві

7

Після деяких експериментів я прийшов до такої пропозиції: чи може <title>тег бути "жорстко закодованим" всередині вашої батьківської теми header.php? Якщо це так, ви можете спробувати видалити <title>тег із дочірньої теми header.php(скопіюйте батьків header.phpу тему дочірньої теми), а потім додайте підтримку теми через functions.php:

add_theme_support( 'title-tag' );

Я спробую пояснити, що призвело мене до цієї пропозиції: я спробував так, як ви та інші запропонували - але виявилося, що я знайшов два <title>теги у вихідному коді. Перший мав стандартний заголовок , другий - модифікований заголовок . Але (звичайно) у заголовку рядка браузера я міг бачити лише заголовок за замовчуванням.

Потім я перевірив header.phpтему батьківської теми, яку я використав (двадцять чотирнадцять), і <title>тег був дійсно важко закодований всередині цього шаблону, як цей:

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

Після того як я його видалив, я додав наступний код до дочірньої теми, functions.phpі він спрацював:

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

Таким чином, він в основному також працював перед видаленням <title> тег із шаблону - лише те, що тоді були два <title> теги, пізніші з яких були проігноровані. Чи може це бути однаковою проблемою з вашою темою?

Оскільки wp 4.4.0, проте <title>тег створюється динамічно функцією, _wp_render_title_tag()яка в основному викликає іншу функцію wp_get_document_title()і обертає теги HTML навколо результату. Довга коротка історія: якщо у вашій темі header.phpнемає<title> тег, є ймовірність, що ви можете змінити назву безпосередньо через pre_get_document_titleабо document_title_partsяк описано тут :

1) змінити назву безпосередньо:

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

2) фільтрування заголовних частин:

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

3

Прочитавши свою публікацію зверху до botom та знизу вгору, ви, напевно, маєте фільтр, який передає заголовок через pre_get_document_title фільтр. Тут є наступне твердження:

Я також спробував pre_get_document_title, що спрацьовує при завантаженні сторінки,

Переглядаючи код soure дляwp_get_document_title() , ми бачимо такий код:

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

Це означає, що щоразу, коли не пусте значення проходить через pre_get_document_titleфільтр, wp_get_document_title()функція повертає будь-яке значення, яке було передано через pre_get_document_titleфільтр. У цьому випадку document_title_separatorфільтр і document_title_partsфільтр ніколи не будуть виконані, оскільки вони виконуються лише післяpre_get_document_title фільтра.

Дивлячись на те, що ви сказали трохи далі:

... хоча я не можу домогтися того, щоб фактично змінити назву.

у вас, безумовно, є pre_get_document_titleфільтр з повноваженнями, який перекриває ваш екземпляр того ж фільтра, і завдяки цьому фільтру функція повертає все, що передано йому, що призводить до вашогоdocument_title_parts фільтр не виконується.

Що вам потрібно зробити - це скористатись grepабо хорошим редактором, і виконати пошук у всій wp-contentпапці для цього pre_get_document_titleфільтра. Коли ви знайдете цей фільтр, ви можете взяти його звідти, щоб вийняти його та замінити його власним


Дякую за відповідь! На жаль, пошук усього wp-контенту для document_title_partsабо pre_get_document_titleповернення 0 результатів. Я використовую SublimeText 2 для пошуку всього wp-контенту ...
причепився зимовий

Це мене справді б'є. Дійсно дивно, що один фільтр у функції функціонує правильно, а фільтр після цього - ні. Спробуйте очистити всі кеші та встановіть WordPress, якщо ви впевнені, що це не плагін чи ваша тема. Що відбувається при встановленні ванілі зі зв’язаною темою, що станеться, якщо ви безпосередньо змінити батьківську тему. На жаль, наскільки я можу допомогти з наданою інформацією. Якщо у вас є додаткова інформація, подайте правки, щоб ми могли допомогти вам у вирішенні цього питання
Пітер Гузен

@PieterGoosen Коли перший фільтр повертається не порожнім, функція короткого замикання, а другий фільтр не оцінюється.
cjbj

@cjbj так, правильно, це те, про що я сказав у своїй відповіді, питання в чому. За словами ОП, він не може знайти фільтр pre_get_document_title, що б повністю пояснило, чому другий фільтр не запуститься. Це залишає pre_get_document_titleфільтр порожнім, а значить, інші два фільтри у функції повинні спрацювати, але вони не роблять. Залишає мене укласти корумповане ядро ​​Wordpress.
Пітер Гусен

За винятком того, що я змусив цей фільтр легко працювати.
cjbj

2

Якщо батьківська тема не декларує підтримку, title-tagви можете зробити це так у дочірній темі

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

Фільтруйте document_title_partsмасив очікуваного типу повернення, наприклад, не забудьте змінити умову if відповідно до ваших вимог або видалити її повністю, щоб змінити заголовок на всьому сайті лише для тестування, якщо він працює.

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

Чи можете ви спробувати дві функції?


Дякую за відповідь. Я спробував це, видаливши оператор if, щоб зробити його більш широким, і я додав деякий журнал помилок, щоб побачити, що відбувається. Ось код. . Лише add_theme_support_childреєструється.
причепився до зими
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.