非常低效的WordPress循环!

时间:2011-03-03 作者:Richard Sweeney

我目前正在为一个管弦乐队的一个网站工作。需要根据其文书列出各个成员。成员有一个自定义的帖子类型的传记,我通过一个自定义字段捕获工具值。

我能弄清楚如何在相关部分显示相关人员的唯一方法是通过自定义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个循环!!)

这显然是完全低效的,但很简单,我不知道如何编写更好的代码,这需要一些帮助!

3 个回复
最合适的回答,由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对象-对于每个仪器

结束

相关推荐

Paging in a sidebar mini loop

我切换到了另一个主题,并决定用其中的一些默认代码制作一个小部件,在自定义循环中显示我的美味帖子、推特帖子、su帖子和youtube视频(不包括主循环中的这些类别)。但是现在。。。分页不再工作。我制作了这个小部件:// =============================== EDL Sidebar Posts Widget ====================================== class SidebarPosts extends WP_Widget { &#x