A
A
Alex-Broudy2019-01-29 13:05:26
User navigation
Alex-Broudy, 2019-01-29 13:05:26

How to display the values ​​of custom fields in breadcrumbs at all levels of nesting?

Здравствуйте!
Использовал на сайте хлебные крошки от 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;
  }

Буду рад любой помощи и подсказкам!

Answer the question

In order to leave comments, you need to log in

1 answer(s)
Николай, 2019-01-29
@Alex-Broudy

_add_title only processes the last element of crumbs. The _page_crumbs function is responsible for the hierarchy.
Here is the code adapted to your needs.

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;
  }

Sorry, there may be errors, no time to check.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question