@Alex-Broudy

Как в хлебных крошках выводить значения произвольных полей во всех уровнях вложенности?

Здравствуйте!

Использовал на сайте хлебные крошки от wp-kama.ru.

В крошках подставляются значения из заголовков страниц, что не очень удобно для меня, поскольку названия слишком длинные и иногда это не совсем красиво, да и цель в моей задаче было показать в крошках кратко и сжато содержание заголовков страниц.

Для этой задачи я использовал плагин Advanced Custom Fields. Создал группу полей, создал поле my_title_field и указал его в шаблонах страниц. Если поле заполнено, то в хлебных крошках на странице показывается его значение, но если не заполнено, то значение берется из заголовка страницы.

Примечание: задача реализовать эту возможность на статичных страницах - никаких рубрик, категорий, постов и т.д.

В коде хлебных крошек я прописал несколько строк для проверки заполненности поля и выводе соответствующего значения если поле заполнено или не заполнено:

$my_title_field = get_field('my_title_field');
$title = ($title != $my_title_field && !empty($my_title_field)) ? $my_title_field : $title;

Эти строчки помогли решить задачу и, в итоге, если я нахожусь на странице любой вложенности, то значение из произвольного поля подставляется в хлебные крошки по текущей странице, но не срабатывает для других страниц верхних уровней.

Допустим есть 3 страницы с заголовками:
- страница с заголовком "Москва" - в ней я не указываю значение произвольного поля
- страница с заголовком "Портреты ручной работы в Москве" - указываю значение поля "Портреты"
- страница с заголовком "Семейные портреты ручной работы" - указываю значение поля "Семейные"

Итак, цель, чтобы получилось следующее в хлебных крошках:

Главная > Москва > Портреты > Семейные

А получается так:

Главная > Москва > Портреты ручной работы в Москве > Семейные


т.е. на текущей странице показывается значение "Семейные", а на странице родительской верхнего уровня не показывается "Портреты", а выводится значение из заголовка, но если я перейду на страницу "Портреты", то значение поля будет выводится

Главная > Москва > Портреты

Вот и вопрос, как сделать так, чтобы значения произвольных полей подставлялись в хлебные крошки для всех страниц, даже, если я буду находиться на странице 5 или 6-го уровня вложенности?

Ниже фрагмент кода отвечающий за вывод хлебных крошек с моим произвольным полем get_field('my_title_field'):

function _add_title( $add_to, $obj, $term_title = '' ){
		$arg = & $this->arg; // упростим...
		$title = $term_title ? $term_title : esc_html($obj->post_title); // $term_title чиститься отдельно, теги моугт быть...
		$show_title = $term_title ? $arg->show_term_title : $arg->show_post_title;

    $my_title_field = get_field('my_title_field');
    $title = ($title != $my_title_field && !empty($my_title_field)) ? $my_title_field : $title;

		// пагинация
		if( $arg->pg_end ){
			$link = $term_title ? get_term_link($obj) : get_permalink($obj);
			$add_to .= ($add_to ? $arg->sep : '') . sprintf( $arg->linkpatt, $link, $title ) . $arg->pg_end;
		}
		// дополняем - ставим sep
		elseif( $add_to ){
			if( $show_title )
				$add_to .= $arg->sep . sprintf( $arg->title_patt, $title );
			elseif( $arg->last_sep )
				$add_to .= $arg->sep;
		}
		// sep будет потом...
		elseif( $show_title )
			$add_to = sprintf( $arg->title_patt, $title );

		return $add_to;
	}

Буду рад любой помощи и подсказкам!
  • Вопрос задан
  • 174 просмотра
Решения вопроса 1
kaliyan
@kaliyan
php-developer, wordpress-developer
_add_title обрабатывает только последний элемент крошек. За иерархию отвечает функция _page_crumbs.

Привожу код, адаптированный под ваши требования.

function _page_crumbs( $post ){
		$parent = $post->post_parent;

		$crumbs = array();
		while( $parent ){
			$page = get_post( $parent );

			$my_title = get_field('my_title_field', $page->ID);
			$post_title = esc_html($page->post_title);
			$title = ($post_title != $my_title  && !empty($my_title)) ? $my_title  :  $post_title;

			$crumbs[] = sprintf( $this->arg->linkpatt, get_permalink($page), esc_html($title) );
			$parent = $page->post_parent;
		}

		return implode( $this->arg->sep, array_reverse($crumbs) );
	}


function _add_title( $add_to, $obj, $term_title = '' ){
		$arg = & $this->arg; // упростим...
		$title = $term_title ? $term_title : esc_html($obj->post_title); 
		$show_title = $term_title ? $arg->show_term_title : $arg->show_post_title;
		
		$my_title_field = get_field('my_title_field');
		$title = ($title != $my_title_field && !empty($my_title_field)) ? $my_title_field : $title;

		// пагинация
		if( $arg->pg_end ){
			$link = $term_title ? get_term_link($obj) : get_permalink($obj);
			$add_to .= ($add_to ? $arg->sep : '') . sprintf( $arg->linkpatt, $link, $title ) . $arg->pg_end;
		}
		// дополняем - ставим sep
		elseif( $add_to ){
			if( $show_title )
				$add_to .= $arg->sep . sprintf( $arg->title_patt, $title );
			elseif( $arg->last_sep )
				$add_to .= $arg->sep;
		}
		// sep будет потом...
		elseif( $show_title )
			$add_to = sprintf( $arg->title_patt, $title );

		return $add_to;
	}


Сорри, могут быть ошибки, нет времени проверить.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы