WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Почему не выводится название заголовка родительской страницы верхнего уровня в шорткоде?

Реализовал задачу - как получить и вывести в тексте название заголовка страницы самого верхнего уровня, проверить совпадает ли оно со значением в массиве и если совпадает заменить его на нужное значение.

Цель была найти заголовок даже если бы открывалась страница 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 ) ) );

Но не могу понять что не так..

0
Alex-Broudy
3 месяца назад
  • 0

    У меня правильно выводится:

    При условии, что я в функции указал global $post:

    Alex-Broudy 2 мес назад

    Отличное решение! Теперь все заработало ) Спасибо большое за помощь ))

    Комментировать
  • 0
    el-lable200 cайт: el-lable.ru
    $page_id = get_queried_object()->ID;
    Alex-Broudy 3 мес назад

    Пожалуйста, подскажите, где в моем коде это применить?

    kaliyan 2 мес назад

    Можете вместо global $post, сделать так $post = get_queried_object();
    Это одно и то же.

    Alex-Broudy 2 мес назад

    спасибо за совет!

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация