根据循环中的变量设置,对wp_query进行排序。

问题描述 投票:2回答:1

我有一个自定义的循环,可以拉出当前页面的所有子页面,并显示它们。然而,我需要按照这个查询的对象的 $first_row_image 变量,并将其拉入循环内部。

这是通过抓取 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; 

}
php wordpress sorting advanced-custom-fields
1个回答
1
投票

根据我的经验,通常最好在查询之后进行复杂的排序,而不是作为查询的一部分。

首先,你定义了 '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;

}
© www.soinside.com 2019 - 2024. All rights reserved.