如何使用 WordPress 通过多个自定义字段高效查询和排序自定义帖子类型?

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

我正在开发一个 WordPress 网站。我有一个名为“成员”的自定义帖子类型。每个成员包含以下自定义字段:

  • 姓名
  • 发货
  • 军衔(船长、中尉或海员)

我想要做的是返回给定船只的所有成员。然后我想按等级组织结果,船长在自己的行中(如果存在),然后所有中尉在自己的行中(如果存在),然后是所有海员。

然后,我想对所有后续船只重复此操作。

我不确定是否应该使用多个查询来执行此操作,或者是否有一种巧妙的方法来通过 CSS 处理格式。

我目前正在做的是获取所有船舶的数组,获取所有等级的数组,然后使用每个船舶/等级的新查询循环遍历该数组:

<?php foreach( $allships as $ship ): ?>
    <div class="shipname">
        <?php echo $ship; ?> <!-- Ship Name -->
    </div>
    <?php foreach($ranks as $rank): ?>

    <div class=members id=<?php echo $ship . '-' . $rank;?>>
        
        <!-- new query per ship -->
        <?php
        // Custom Query to retrieve members
            $args = array(
                'post_type' => 'member',
                'posts_per_page' => -1, // Display all members
                'meta_query'    => array(
                    'relation'      => 'AND',
                    array(
                        'key'       => 'ship',
                        'value'     => $ship,
                        'compare'   => '='
                    ),
                    array(
                        'key'       => 'rank',
                        'value'     => $rank,
                        'compare'   => '='
                    )
                ),
                'orderby' => 'title',
                'order' => 'ASC'
            );
            $shipquery = new WP_Query($args);
        ?>

            <?php 
            // Check that we have query results.
            if ( $shipquery->have_posts() ) {
                // Start looping over the query results.
                while ( $shipquery->have_posts() ) {
                    $shipquery->the_post();
                    // Contents of the queried post results go here.
                    ?>
                    <div class=member>
                        <?php $image = get_field('photo');
                            if( !empty( $image ) ): ?>
                                <img src="<?php echo esc_url($image['url']); ?>" alt="<?php echo esc_attr($image['alt']); ?>" />
                            <?php endif; ?>
                        <h1><?php the_title();?></h1>
                        <?php
                        if ($rank == 'firstmate' || $rank =='secondmate')
                          echo "<h2>" . $rank . "</h2>"
                        ?>
                    </div>
                    <?php
                }
            }
            // Restore original post data.
            wp_reset_postdata();
            ?>
    </div>
    <?php endforeach; ?>
    <hr>
<?php endforeach; ?>
php css wordpress advanced-custom-fields
1个回答
0
投票

尝试以下替换 WP_Query,对于给定的“ship”,它将首先按“rank”排序,然后按“name”排序:

$args = array(
    'post_type'      => 'member',
    'posts_per_page' => -1, // Display all members
    'meta_query'     => array( 
        'relation'    => 'AND',
        array(
            'key'     => 'ship',
            'value'   => $ship,
        ),
        'rank_clause' => array(
            'key'     => 'rank',
            'compare' => 'EXISTS',
        ),
        'name_clause' => array(
            'key'     => 'name',
            'compare' => 'EXISTS',
        ),
    ),
    'orderby' => array(
        'rank_clause' => 'ASC',
        'name_clause' => 'ASC',
    ),
);
$query = new WP_Query($args);

应该可以。

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