Как проверить, есть ли у поста WordPress дочерние и родственные элементы?

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

Чтобы скрыть код внутри дочерней страницы, я использую if ( get_post_field( 'post_parent' ) != 8194 ), но проблема в том, что есть несколько одноуровневых страниц, и этот код не работает на них, он работает только на дочерней странице.

Это моя иерархия страниц:

Parent page 1
- Child page 1
-- Sibling page 1
-- Sibling page 2
...
-- Sibling page 10

Как я могу скрыть код и на родственных страницах?

Спасибо


person leandroprz    schedule 02.01.2021    source источник


Ответы (3)


Если я правильно понимаю, вы хотите найти самого верхнего родителя.

Для этого я бы использовал get_post_ancestors(), который извлекает идентификаторы предков сообщения (и возвращает массив родителей): https://developer.wordpress.org/reference/functions/get_post_ancestors/

Попробуйте что-то вроде этого:

global $post;
$parents = get_post_ancestors($post->ID);
// Get the 'top most' parent page ID, or return 0 if there is no parent:
$top_parent_id = ($parents) ? $parents[count($parents)-1]: 0;

if ($top_parent_id != 8194) {
...
}
person Hillel    schedule 03.01.2021
comment
Да, мне нужно найти самого главного родителя. Ваш код работает, но он также скрывает мой фрагмент кода в родительском элементе. Мне просто нужно скрыть это в дочерних и родственных сообщениях. - person leandroprz; 05.01.2021
comment
О, это потому, что предлагаемый код возвращает текущий идентификатор сообщения, когда родителей нет, попробуйте использовать эту модифицированную версию (я отредактировал свой ответ). - person Hillel; 06.01.2021
comment
Круто, сработало отлично. Благодарю вас! - person leandroprz; 15.01.2021
comment
Я столкнулся с небольшой проблемой. Есть ли способ исключить одну дочернюю страницу из вашего кода, используя заданный идентификатор? Я попытался добавить исключение внутри условного выражения, но оно не работает, я думаю, что другая часть кода обходит его. - person leandroprz; 21.01.2021
comment
Когда вы говорите «исключить», вы имеете в виду, что хотите показать или скрыть код на этом идентификаторе страницы? - person Hillel; 21.01.2021
comment
Да, мне нужно показать код на этой конкретной странице. Прямо сейчас я скрываю код на всех других дочерних и одноуровневых страницах. - person leandroprz; 21.01.2021
comment
Я опубликовал отдельный ответ для этого - надеюсь, это поможет :) - person Hillel; 21.01.2021

** ОБНОВЛЕННЫЙ КОД ДЛЯ ВТОРОГО ВОПРОСА OP ИЗ КОММЕНТАРИЙ: **

global $post;

// Don't show the code by default:
$show_code = false;

// This is an array of post ids where you want to show the code regardless of the parents id
$always_show_the_code_on_these_posts = array(111, 222, 333);

// Check if current post id is on the list:
if ( in_array($post->ID, $always_show_the_code_on_these_posts) ) {
    $show_code = true;
} else {
    // ...and only if it's not on the list run the previous test:
    $parents = get_post_ancestors($post->ID);

    // Get the 'top most' parent page ID, or return 0 if there is no parent:
    $top_parent_id = ($parents) ? $parents[count($parents)-1]: 0;

    if ($top_parent_id != 8194) {
        $show_code = true;
    }
}

if ($show_code) {   
...
}
person Hillel    schedule 21.01.2021
comment
Большое спасибо! Он работает отлично. - person leandroprz; 24.01.2021

Вы можете использовать функцию wp_get_post_parent_id(), чтобы проверить, является ли текущая страница родительской или дочерней, сравнив ее с функцией get_the_ID(). is_page() здесь просто избыточность.

<?php
/**
* wp_get_post_parent_id
* Returns the ID of the post’s parent.
* @link https://developer.wordpress.org/reference/functions/wp_get_post_parent_id/
*
* get_the_ID
* Retrieve the ID of the current item in the WordPress Loop.
* @link https://developer.wordpress.org/reference/functions/get_the_ID/
*/
if( is_page() && wp_get_post_parent_id( get_the_ID() ) ):
  //child
  echo 'This is THE Child, Grogu';
else:
  //parent
  echo 'This is THE Mandalorian, Mando';
endif; ?>
person amarinediary    schedule 02.01.2021
comment
Я получаю те же результаты. Я могу скрыть свой код на дочерних страницах, но не на родственных страницах, так как не знаю, как это проверить. Может быть, добавить ID ребенка? Но у меня их тоже много, поэтому я пытаюсь это автоматизировать. - person leandroprz; 03.01.2021