Упорядочить wp_query по переменной, установленной внутри цикла - PullRequest
2 голосов
/ 17 апреля 2020

У меня есть пользовательский l oop, который извлекает все дочерние страницы текущей страницы и отображает их. Однако мне нужно упорядочить этот запрос по переменной $first_row_image, которая извлекается из l oop.

. Это делается путем захвата строки title в end() массива ( массив является полем повторителя в расширенных настраиваемых полях).

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

<?php function flo_add_child_pages() { 

global $post;
$args = array(
    'post_type' => 'page',
    'post_parent' => $post->ID,
    'cat' => '3368',
    'posts_per_page' => -1,
    'meta_key'          => $first_row_image,
    'orderby'           => 'meta_value',
    'order'             => 'ASC'
);

$the_query = new WP_Query( $args );
?>

<?php if ( $the_query->have_posts() ) : ?>
<div class="child-flex">
    <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
        <?php
            $rows = get_field('breadcrumbs' ); // get all the rows
            $first_row = end($rows); // get the first row
            $first_row_image = $first_row['title' ]; // get the sub field value 
        ?>
        <?php if($first_row_image) : ?>
            <a href="<?php the_permalink(); ?>" rel="post-<?php the_ID(); ?>" class="one-half">
                <?php echo $first_row_image; ?><i class="fa fa-angle-right rotate-icon" style="float: right; margin-top: 5px;"></i>
            </a>
        <?php endif;?>
    <?php endwhile; ?>
</div><?php wp_reset_postdata(); ?>
<?php endif; 

}

1 Ответ

1 голос
/ 23 апреля 2020

По моему опыту, обычно лучше выполнять сложную сортировку после запроса, а не как часть запроса.

С одной стороны, вы определили 'meta_key' => $first_row_image, но $first_row_image не определено в этой точке поэтому запрос не может быть выполнен на нем. С другой стороны, учитывая то, как ACF хранит значения повторителей, было бы практически невозможно запросить их.

Я бы сделал это следующим образом:

  1. Выполнить запрос
  2. Проверьте, есть ли у вас сообщения
  3. Используйте usort, чтобы написать пользовательскую функцию сортировки в массиве $query->posts.
<?php
function reorder_by_last_title($page1, $page2) {
    $page1_rows = get_field('breadcrumbs', $page1['ID']); // get all the rows
    $page1_first_row = end($page1_rows); // get the first row
    $page1_first_row_image = $page1_first_row['title']; // get the sub field value

    $page2_rows = get_field('breadcrumbs', $page2['ID']);
    $page2_first_row = end($page2_rows);
    $page2_first_row_image = $page2_first_row['title'];

    return $page1_first_row_image > $page2_first_row_image;
}

function flo_add_child_pages() {

    global $post;
    $args = array(
        'post_type'      => 'page',
        'post_parent'    => $post->ID,
        'cat'            => '3368', // Not sure why this is needed-- did you enable categories for pages?
        'posts_per_page' => 500, // Use a big number instead of -1
    );

    $child_pages_query = new WP_Query($args);

    if ($child_pages_query->have_posts()) :

        // Reorder child pages by last breadcrumbs title.
        usort($child_pages_query->posts, 'reorder_by_last_title' );
        ?>
    <div class="child-flex">
    <?php while ($child_pages_query->have_posts()) : $child_pages_query->the_post(); ?>
        <?php
        $rows = get_field('breadcrumbs'); // get all the rows
        $first_row = end($rows); // get the first row
        $first_row_image = $first_row['title']; // get the sub field value
        ?>
        <?php if ($first_row_image) : ?>
            <a href="<?php the_permalink(); ?>" rel="post-<?php the_ID(); ?>" class="one-half">
                <?php echo $first_row_image; ?><i class="fa fa-angle-right rotate-icon"
                        style="float: right; margin-top: 5px;"></i>
            </a>
        <?php endif; ?>
    <?php endwhile; ?>
    </div><?php wp_reset_postdata(); ?>
<?php endif;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...