如何使用多个循环来提高WordPress函数的速度?

时间:2012-04-25 作者:HandiworkNYC.com

enter image description here

我是PHP新手,写了这个函数。这是一个按字母顺序排列的导航,只显示在该字母和当前过滤的“慷慨”分类术语中都有帖子的字母。

我使用多种分类查询来查找“artistas”帖子,例如,这些帖子被标记为“rock”和“funk”。

这个函数工作得很好,输出的正是我想要的,但是。。。

多个回路确实滞后于加载时间,而且作为n00b,我不确定如何优化功能。

任何指示或指导都是VERY 非常感谢。如果你愿意,我可以用时间来换取时间(我写了一些刻薄的CSS):)

非常感谢。

<?php
    function bam_artist_alfa() {
            $taxonomy = \'alfa\';  
            $uri = my_url();
            $home = \'http://buenosairesmusic.com/\';

            // save the terms that have posts in an array as a transient
            if ( false === ( $alphabet = get_transient( \'bam_archive_alphabet\' ) ) ) {
                // It wasn\'t there, so regenerate the data and save the transient
                $terms = get_terms($taxonomy);

                $alphabet = array();
                if($terms){
                    foreach ($terms as $term){
                        $alphabet[] = $term->slug;
                    }
                }
                set_transient( \'bam_archive_alphabet\', $alphabet );
            } 

            if(strstr($uri, \'/artista/\') ) {
                $uri = str_replace(\'/artista/\',\'/?alfa=\', $uri);
                $uri = substr_replace($uri ,"",-1);
            }

            $all_link = removeqsvar($uri, \'alfa\');
            $last = $all_link[strlen($all_link)-1]; 

            if($last == \'?\') $all_link = substr_replace($all_link ,"",-1);

            if($all_link == $home) 
                $all_link = $home.\'artistas\';

            if( isset($_GET) && isset($_GET[\'alfa\']) ) {
                $is_alfa = (!is_tax(\'alfa\') && !$_GET[\'alfa\'] ? false : true );
            } else {
                $is_alfa = (!is_tax(\'alfa\') ? false : true );
            }

            $all_current = ($is_alfa == true ? null : \' bg1 round-res\' );


        ?>

                    <ul class="bbw bo alfa-nav c2">
                        <li class="all-link<?php echo $all_current; ?>">
                        <?php if(!$is_alfa) { echo \'A&ndash;Z\'; } else { ?>

                            <a href="<?php echo $all_link; ?>">A&ndash;Z</a>
                        <?php }?>

                        </li>
    <?php
        $query = $_SERVER[\'QUERY_STRING\'];
        $genre = null;
        $orden = (isset($_GET) && isset($_GET[\'orden\']) ? \'&orden=fecha\' : null);

        if( strstr($uri,\'/genero/\') ) {
            $genre = str_replace(\'/genero/\',\'/?genero=\', $uri);
            $genre = substr_replace($uri ,"",-1);
            $genre = explode(\'/\',$genre);
            $genre = end($genre);
        } elseif( isset($_GET) && isset($_GET[\'genero\']) ) {
            $genre = $_GET[\'genero\'];
        }

        if(!empty($genre)) {
            $spaces = strpos($genre,\' \');
            $genre = ($spaces === false ? $genre : explode(\' \', $genre) );
        }

        function has_artists($i, $genre) {

            if(empty($genre)) {
                $termquery[\'tax_query\'] = array(
                    array(
                        \'taxonomy\' => \'alfa\',
                        \'terms\' => $i,
                        \'field\' => \'slug\',
                    ),
                );

                $termquery[\'post_type\'] = \'artistas\';
            } else {
                $alfaquery[] = array(
                    \'taxonomy\' => \'alfa\',
                    \'terms\' => $i,
                    \'field\' => \'slug\',
                );

                if(is_array($genre)) {
                    $genres[] = array(
                        \'taxonomy\' => \'genero\',
                        \'terms\' => $genre,
                        \'field\' => \'slug\',
                        \'operator\' => \'AND\'
                    );      
                } else {
                    $genres[] = array(
                        \'taxonomy\' => \'genero\',
                        \'terms\' => $genre,
                        \'field\' => \'slug\',      
                    );
                }
                $termquery[\'tax_query\'] = array_merge($genres, $alfaquery);
                $termquery[\'tax_query\'][\'relation\'] = "AND";
                $termquery[\'post_type\'] = \'artistas\';
            }

            $has_artists = get_posts($termquery);

            if($has_artists) {
                return true;
            } else {
                return false;
            }
        }

        foreach(range(\'a\', \'z\') as $i) : 

            $current = ($i == get_query_var($taxonomy)) ? "bg1 round-res" : "menu-item";

            if(empty($genre)) {
                $link = $home.\'?alfa=\'.$i.$orden;
            } else {
                $genrestring = (is_array($genre) ? implode(\'+\',$genre) : $genrestring = $genre );
                $link = $home.\'?alfa=\'.$i.\'&genero=\'.$genrestring.$orden;
            }

            if ( has_artists($i,$genre) && $i != get_query_var($taxonomy) ){ 
    ?>

                        <li class="<?php echo $current; ?>">
                            <?php printf(\'<a href="%s">%s</a>\', $link, strtoupper($i) ) ?>
                        </li>
        <?php } else { ?>

                        <li class="<?php echo $current;  if($i != get_query_var($taxonomy)) {echo \' empty\';} ?>">
                            <?php echo strtoupper($i); ?>
                        </li>
        <?php 
            }
            endforeach;
        ?>

                     </ul>
    <?php } ?>

2 个回复
SO网友:Stephen Harris

我只需要检索一个包含帖子的字母表/分类术语数组。你这样做,但实际上并不使用它。此函数将返回非空(字母)术语数组:

(Transient? - 除非您有多个使用这种分类法的帖子类型,(请参见下文),否则我不确定是否从使用瞬变中获得了很多好处-您可以调用get_terms 和使用wp_list_pluck 如图所示)。以下功能使用瞬态。

 wpse50148_get_used_alpha(){

     if ( false === ( $alphabet = get_transient( \'bam_archive_alphabet\' ) ) ) {
            //It wasn\'t there, so regenerate the data and save the transient
            $terms = get_terms(\'alfa\');
            $alphabet =array();
            if($terms){
                $alphabet = wp_list_pluck($terms,\'slug\');
            }
            set_transient( \'bam_archive_alphabet\', $alphabet );
        } 

      return $alphabet;
 }
Don\'t forget to update the transient when a post is updated.

此方法假设使用此分类法的唯一帖子类型是“artistas”,如果它是共享的,那么一封信可能会声称有artistas与之关联(在您的菜单中),而实际上没有。

共享分类法解决了这个问题,您必须查询帖子,然后循环浏览并收集它们的术语。无论哪种方式-仅执行1次而不是26次查询来获取“已使用”的字母表。在这种情况下,过渡会更明显地节省时间。

用法:

  $alphabet = wpse50148_get_used_alpha();

   foreach(range(\'a\', \'z\') as $i) : 
      if( in_array($i,$alphabet) ){
           //Letter has terms
      }else{
           //Letter does not have terms
      }
   endif;

SO网友:offroff

我还没有使用transients API,但在这种情况下,我认为这是一个很好的选择。您可以使用它,但仅用于一小部分数据。

要根据阿尔法和流派缓存艺术家,您可以这样做(我假设):

if ( false === ( $has_artists = get_transient( "bam_artist_$i_$genre" ) ) ) {
    $has_artists = get_posts($termquery);
    set_transient( "bam_artist_$i_$genre", $has_artists );
} 

结束

相关推荐

将外部php库集成到WordPress-正确的方式

如果我要将自定义库加载到wordpress中,那么添加它的最佳位置是什么?由于在库的顶部定义了一组全局变量,因此我不希望通过一个钩子来完成这项工作,在钩子中,我被迫使用包装函数,从而将我的库全局变量视为该函数的本地变量。我的库开始于ob_start() // I\'m not sure how this would effect WP. So I\'m not too big on this. session_start(); // I do need this thoug