我正在开发一个 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; ?>
尝试以下替换 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);
应该可以。