我目前正在为一个管弦乐队的一个网站工作。需要根据其文书列出各个成员。成员有一个自定义的帖子类型的传记,我通过一个自定义字段捕获工具值。
我能弄清楚如何在相关部分显示相关人员的唯一方法是通过自定义post类型一次又一次地循环,通过比较元值来显示演奏特定乐器的人员。
代码如下所示:
<?php $args = array( \'post_type\' => \'biographies\', \'posts_per_page\' => -1 ); ?>
<ul class="no-bull hijax">
<?php $biog = new WP_Query($args);
if( $biog->have_posts() ) : while( $biog->have_posts() ) : $biog->the_post();
$player = get_post_meta($post->ID, \'player\', true);
if ($player == \'yes\') :
$instrument = get_post_meta($post->ID, \'instrument\', true);
if ($instrument == \'violin\') :
?>
<li><a id="artist_id_<?php the_ID(); ?>" class="nb" href="<?php the_permalink(); ?>"><?php the_title(); ?></a> : <?php echo($instrument); ?></li>
<?php
endif;
endif;
endwhile; endif;
wp_reset_query();
$biog = new WP_Query($args);
if( $biog->have_posts() ) : while( $biog->have_posts() ) : $biog->the_post();
$player = get_post_meta($post->ID, \'player\', true);
if ($player == \'yes\') :
$instrument = get_post_meta($post->ID, \'instrument\', true);
if ($instrument == \'viola\') :
?>
<li><a id="artist_id_<?php the_ID(); ?>" class="nb" href="<?php the_permalink(); ?>"><?php the_title(); ?></a> : <?php echo($instrument); ?></li>
<?php
endif;
endif;
endwhile; endif;
wp_reset_query();
$biog = new WP_Query($args);
if( $biog->have_posts() ) : while( $biog->have_posts() ) : $biog->the_post();
$player = get_post_meta($post->ID, \'player\', true);
if ($player == \'yes\') :
$instrument = get_post_meta($post->ID, \'instrument\', true);
if ($instrument == \'cello\') :
?>
<li><a id="artist_id_<?php the_ID(); ?>" class="nb" href="<?php the_permalink(); ?>"><?php the_title(); ?></a> : <?php echo($instrument); ?></li>
<?php
endif;
endif;
endwhile; endif;
wp_reset_query();
等等,等等,等等,等等。(页面上当前有12个循环!!)
这显然是完全低效的,但很简单,我不知道如何编写更好的代码,这需要一些帮助!
最合适的回答,由SO网友:t31os 整理而成
你可以用一个循环来完成,你只需要一个有效的排序顺序,对吗?演奏者使用一种乐器,然后是下一种乐器,依此类推。。
UPDATE: 根据询问者的评论,您仍然可以使用一个查询并使用rewind_posts()
根据需要多次迭代循环,即执行类似操作以获得自定义排序
<?php
// Add the instruments into the array below, in the order you want them in.
$instruments = array( \'violin\', \'viola\', \'cello\' );
$args = array(
\'post_type\' => \'biographies\',
\'posts_per_page\' => -1,
\'nopaging\' => true,
\'surpress_filters\' => true,
\'meta_query\' => array(
array(
\'key\' => \'player\',
\'value\' => \'yes\',
\'compare\' => \'=\',
\'type\' => \'CHAR\'
),
array(
\'key\' => \'instruments\',
\'value\' => $instruments,
\'compare\' => \'IN\',
\'type\' => \'CHAR\'
)
),
);
$bios = new WP_Query( $args);
?>
<?php if( $bios->have_posts() ) : ?>
<ul class="no-bull hijax">
<?php
foreach( $instruments as $instrument ) :
while( $bios->have_posts() ) : $bios->the_post();
$player_instrument = get_post_meta( get_the_ID(), \'instrument\', true );
if( $instrument != $player_instrument )
continue;
?>
<li><a id="artist_id_<?php the_ID(); ?>" class="nb" href="<?php the_permalink(); ?>"><?php the_title(); ?></a> : <?php echo $player_instrument; ?></li>
<?php
endwhile;
rewind_posts();
endforeach;
wp_reset_query();
?>
</ul>
<?php endif; ?>
看看这是否有理想的效果:)
SO网友:Dougal Campbell
我还建议使用自定义分类法。“乐器”和“演奏者”分类法之间的交叉将使这方面的工作变得简单。但如果这不实际,也许这可能会奏效:
$args = array(
\'post_type\' => \'biographies\',
\'posts_per_page\' => -1,
\'meta_key\' => \'instrument\',
\'orderby\' => \'meta_value\'
);
query_posts($args);
while(have_posts()) : the_post();
$inst = get_post_meta($post_id, \'instrument\', true);
$player = get_post_meta($post_id, \'player\', true);
if (\'yes\' == $player) {
?>
<li><a id="artist_id_<?php the_ID(); ?>" class="nb" href="<?php the_permalink(); ?>"><?php the_title(); ?></a> : <?php echo $inst; ?></li>
<?php
}
endwhile;
SO网友:kaiser
嗯。。。您不需要一次又一次地编写循环。只在更换的零件上工作。无论如何,循环将通过所有数据集。顺便说一句:我不会为此自定义字段。以“小提琴”、“中提琴”等作为术语的“乐器”分类法会更容易,也会给你更多的可能性(namely template tags), 例如,制作“管乐器”、“打击乐器”等子轴。您还应该移动if
中的语句<li>
元素,因为它也不会更改。唯一的问题是if $instrument == \'\'
还有echo $instrument;
(无需周围环境即可书写()
).
if ($instrument == \'violin\') : // only $instrument changes, right?
?>
<li>
<a id="artist_id_<?php the_ID(); ?>" class="nb" href="<?php the_permalink(); ?>">
<?php the_title(); ?>
</a> : <?php echo($instrument); ?>
</li>
<?php
elseif ($instrument == \'violin\') :
// do stuff...
endif;
<小时>
Edit: 您可以使用名为“instruments”的自定义分类法,然后按照所需的顺序过滤查询:
// @link: http://codex.wordpress.org/Function_Reference/taxonomy_exists
if ( taxonomy_exists(\'instruments\') ) :
// @link: http://codex.wordpress.org/Function_Reference/has_term
if ( has_term( \'instruments\', \'viola\', get_post_ID() ) ):
# DO STUFF HERE, eg. echo term
endif;
endif;
只需做一个循环,在while循环中,只需询问术语和回声/显示内容。您可以,而不是使用
if ( has_term(
, 还可以使用开关以提高可读性。
使用此解决方案可避免使用get_post_meta()
- afaik这调用DB,而不是post对象-对于每个仪器