Intereting Posts
Как обратить порядок таксономии Как изменить язык для запланированных событий? <link rel = "icon" href = ""> Приведение моих функций WordPress в выполнение дважды Как создать шаблоны сообщений, которые могут выбрать пользователи? Отображать пользовательские сообщения с использованием идентификатора Как предотвратить кодирование HTML-кода плагина для сущностей? Изменить язык WordPress Более гибкое управление боковой панелью и виджетами Как получить страницу пользовательских 500 ошибок для показа? Как я могу переделать постоянную ссылку для поиска страницы? Примечание. Неопределенный индекс: host в /var/www/html/wp-includes/canonical.php в строке 445 Можно ли фильтровать get_adjacent_post () с помощью тегов? Возможно ли активировать пользовательское поле «текстовое описание» при активации флажка customfield? Добавление настраиваемой опции на страницу в бэкэнд Получить список всех ссылок на странице?

Post Ancestor и Child Post в пользовательском типе сообщения

введите описание изображения здесь

Иерархическая структура персонализированного типа сообщения «Книга» (например).

Когда мы находимся на Post 2-95 , я хочу знать:

  • Имеет ли почта этот пост предка ( Post 1-31 )?
  • Есть ли у него детские должности ( Post 3-19 , Post 3-10 )?

Затем, если он имеет:

  • ancestor post: retrieve (object) этого сообщения.
  • дочерние сообщения: извлекать (объекты) этих сообщений.

Учитывая сообщение, представленное объектом post $p , вы можете узнать, является ли post 31 родителем через:

 if($p->post_parent == 31){ // it is! } else { // it isn't } 

Чтобы выяснить родителей, что-то вроде:

 $posts = get_posts(array( 'post_parent' => $p->ID, 'post_type' => $p->post_type )); // if there are children, they will be contained in `$posts` 

Наконец, чтобы определить, сколько уровней в глубине иерархии вы находитесь, вам нужно будет пересчитать иерархию $p->parent_post == 0 , а затем подсчитать, сколько раз вам нужно было это сделать.

например

 $level = 1; while($parent->parent_post != 0){ $level++; $parent = get_post($parent->parent_post); } 

Проверьте, находится ли текущее сообщение в диапазоне

Мы проверяем с помощью функции, если мы …

  • в петле?
  • в заданном диапазоне?

Вставьте все функции в файл functions.php.

 function wpse52285_is_post_in_range( $post, int $range_from, int $range_to ) { // If we're IN the LOOP @link http://codex.wordpress.org/Function_Reference/in_the_loop if ( ! in_the_loop() ) return false; // Abort if not in the allowed range if ( ! in_array( $post->ID, range( $range_from, $range_to ) ) ) return false; return true; } 

Проверьте, есть ли у нас дети в радиусе действия

Мы проверяем, если мы …

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

Если ничего не найдено, мы возвращаем false , поэтому мы можем сделать наш чек легче.

 function wpse52285_get_children_in_range( $post, int $range_from, int $range_to, $post_type = 'post' ) { if ( ! in_the_loop() ) return false; // get_children() @link http://codex.wordpress.org/Function_Reference/get_children $children = get_children( "post_parent={$post->ID}&post_type={$post_type}" ); if ( 0 < count( $children ) ) { foreach ( $children as $child ) { in_array( $id, range( $range_from, $range_to ) ) AND $in_range[] = $child; } if ( 0 < count( $in_range ) ) return $in_range; } return false; } 

Проверьте, есть ли у нас предки

Мы проверяем, если …

  • мы в цикле?
  • у нас есть предки?
  • предки находятся в радиусе?

В случае, если ничего не встречается, мы снова возвращаем false .

 function wpse52285_get_ancestors_in_range( $post, int $range_from, int $range_to ) { if ( ! in_the_loop() ) return false; // get_post_ancestors @link http://codex.wordpress.org/Function_Reference/get_post_ancestors $ancestors = get_post_ancestors( $post->ID ); foreach ( $ancestors as $ancestor ) { in_array( $ancestor->ID, range( $range_from, $range_to ) ) AND $in_range[] = $ancestor; } if ( 0 < count( $in_range ) ) return $in_range; return false; } 

шаблон

Теперь мы можем использовать его в любом шаблоне:

 // The loop if have_posts() : while( have_posts() ): the_post(); global $post; // Is our current post in range? if ( wpse52285_is_post_in_range( $post, 2, 95 ) ) { // Are any child posts in range? $children = wpse52285_get_children_in_range( $post, 3, 19 ); if ( $children ) { // Do stuff with the children } // Are any ancestors in range? $ancestors = wpse52285_get_ancestors_in_range( $post, 1, 31 ); if ( $ancestors ) { // Do stuff with the ancestors } } endwhile; endif;