Wordpress: итеративная родительская страница, если настраиваемое поле содержит идентификатор страницы - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь отобразить список на основе страницы.Список строится на основе данных в настраиваемом поле ACF, которое находится в сериализованном массиве.

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

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

Соответствующий код (отображается дополнительный контент, некоторые включены, если он полезен в вашем ответе):

$postid = get_the_ID();
$staffList = get_posts(array(
'post_type' => 'staff',
'meta_key' => 'position_order',
'orderby' => 'meta_value_num',
'order' => 'ASC',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'ministries', // name of custom field
'value' => $postid,
'compare' => 'LIKE',
),
array(
'key' => 'administration', // name of custom field
'value' => $postid,
'compare' => 'LIKE',
)
)
));

if(( $staffList ) != '') { 
foreach ( $staffList as $staff ) : setup_postdata( $people );
$pid =  $staff->ID;
$featured_img_url = get_the_post_thumbnail_url($pid, 'full');
$highres = get_field('high_res', $pid);
$normal = get_field('normal', $pid);
$biofile = get_field('bio_file', $pid);
$scontent = $staff->post_content;
$contact = apply_filters('the_content',$scontent);  
?>
<div class="profile">
<div class="text-center">
<img src="<?php echo $featured_img_url; ?>" width="130"
alt="<?php echo $staff->post_title; ?>">
</div>
<div class="profile__name"><?php echo $staff->post_title; ?></div>
<?php echo $contact; ?>
<?php if ( $biofile != "" ) { ?>
<a href="<?php echo $biofile; ?>" class="btn" target="_blank"><span class="icon-file"></span> <?php echo $people->post_title; ?> Bio</a>
<?php } ?>
</div>
<?php 
endforeach;
wp_reset_postdata();
?>

<?php } endif; ?>

Я думаю, что запрос должен быть помещен в функцию, но возникла проблема с тем, чтобы он работал правильно, а затем перебирает родительские записи, пока не найдет результат.Концепция такова:

, если для текущего $ pageid нет сотрудников, тогда получите $ parent_pageid и выполните запрос.если сотрудники не найдены, найдите grandparent_pageid и выполните запрос и т. д., пока не будут найдены сотрудники или не осталось родительских страниц.

Я обнаружил следующее: Рекурсивная функция для получения описания родительского кэгори. это хороший способ итерации, просто проблема с модификацией для моих нужд.

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 04 октября 2018

Эта функция будет перебирать родительские записи, пока не вернет результаты:

function get_staff_posts($post) {

    $staffList = new WP_Query( array(
        'post_type' => 'staff',
        'meta_key' => 'position_order',
        'orderby' => 'meta_value_num',
        'order' => 'ASC',
        'meta_query' => array(
            'relation' => 'OR',
            array(
                'key' => 'ministries', // name of custom field
                'value' => $post->ID,
                'compare' => 'LIKE',
            ),
            array(
                'key' => 'administration', // name of custom field
                'value' => $post->ID,
                'compare' => 'LIKE',
            ),
        ),
    ));

    $parent = $post->post_parent;

    if( !$staffList->have_posts() && $parent != 0 )
        get_staff_posts($parent);

    return $staffList;
}

Функция вернет запрос, поэтому вы можете использовать его в своей теме следующим образом:

$staffList = get_staff_posts($post);
if( $staffList->have_posts() ): 
while( $staffList->have_posts() ): $staffList->the_post();

// output

endwhile; wp_reset_postdata();
endif;
...