Почему не выводится название заголовка родительской страницы верхнего уровня в шорткоде?
Реализовал задачу - как получить и вывести в тексте название заголовка страницы самого верхнего уровня, проверить совпадает ли оно со значением в массиве и если совпадает заменить его на нужное значение.
Цель была найти заголовок даже если бы открывалась страница 3, 5 или 8-го уровня вложенности.
Полученный результат:
// находим заголовок родительской страницы самого верхнего уровня // этот заголовок равен названию города if ( 0 == $post->post_parent ) { the_title(); } else { $parents = get_post_ancestors( $post->ID ); } // проверяю название полученного города на совпадение в массиве $custom_cities = [ 'Москва'=>'Москве', 'Архангельск'=>'Архангельске', 'Балахна'=>'Балахне', 'Домодедово'=>'Домодедово', 'Узловая'=>'Узловой', 'Ростов-на-Дону'=>'Ростове-на-Дону' ]; // выводим название полученного заголовка и заменяем значение в array_keys // на значение в array_values $text = apply_filters( "the_title", get_the_title( end ( $parents ) ) ); echo ( str_replace(array_keys($custom_cities), array_values($custom_cities), $text) );
Этот код работает, но при попытке зарегистрировать шорткод в functions.php и описать этот код в функции при регистрации шорткода и выводе шорткода в тексте страницы возникает проблема - показывается заголовок только родительской страницы, а не родительской страницы самого верхнего уровня и значит замены значений не просиходит.
Регистрировал функцию так:
function to_prepositional_predlojniy( $atts ){ if ( 0 == $post->post_parent ) { the_title(); } else { $parents = get_post_ancestors( $post->ID ); } $custom_cities = [ 'Москва'=>'Москве', 'Архангельск'=>'Архангельске', 'Балахна'=>'Балахне', 'Домодедово'=>'Домодедово', 'Узловая'=>'Узловой', 'Ростов-на-Дону'=>'Ростове-на-Дону' ]; $text = apply_filters( "the_title", get_the_title( end ( $parents ) ) ); echo ( str_replace(array_keys($custom_cities), array_values($custom_cities), $text) ); } add_shortcode( 'city_predlojniy', 'to_prepositional_predlojniy' );
Шорткод в тексте вывожу так: [city_predlojniy]
В шаблоне страницы вывожу шорткод так:
echo do_shortcode('[city_predlojniy]');
Вопрос: Почему не выводится заголовок родительской страницы самого верхнего уровня при регистрации шорткода? Что делаю не так?
Явно ответ кроется здесь:
if ( 0 == $post->post_parent ) { the_title(); } else { $parents = get_post_ancestors( $post->ID ); }
или здесь:
$text = apply_filters( "the_title", get_the_title( end ( $parents ) ) );
Но не могу понять что не так..
У меня правильно выводится:
При условии, что я в функции указал global $post:
Отличное решение! Теперь все заработало ) Спасибо большое за помощь ))
Пожалуйста, подскажите, где в моем коде это применить?
Можете вместо global $post, сделать так
$post = get_queried_object();
Это одно и то же.
спасибо за совет!