2012-09-25 40 views
0

我有一个CMS设置客户端与三个元框相关的内容。客户所要做的就是发送一个页面(每个页面一个),网站将返回三个相关产品。WordPress获取页面通过ID返回奇怪的结果

一切工作正常,直到我的客户不小心拼错了其中一个slu。。 WordPress不返回任何内容,而是返回6个随机项目。

IN的functions.php:

function get_ID_by_page_name($page_name) { 
global $wpdb; 
$page_name_id = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_name = '".$page_name."' AND post_type = 'page'"); 
return $page_name_id; 

}

在模板文件:

$goesWith = get_post_meta($post->ID, 'goes_with', true); 

if (($goesWith) or ($goesWith2) or ($goesWith3)) { 

      echo "<div class='goes-with'>"; 

      echo "<h2>Goes Great With:</h2>";      

      // OPTION ONE 

       $pageID = get_ID_by_page_name($goesWith); 

        if ($goesWith) { 

         $args = array(
          'post_type'  => 'page', 
          'page_id'  => $pageID, 
          'post_status' => 'publish' 
         ); 
         query_posts($args); 

         while(have_posts()) { 

          the_post(); // vital               

          echo "<div class='post-product'>"; 
          echo "<a href="; 
          the_permalink(); 
          echo ">"; 
          thumbPath(140, 140); 
          echo "</a><a href="; 
          the_permalink(); 
          echo "><p>"; 
          the_title(); 
          echo "</p></a></div><!--end post-product-->"; 

         } 



        } 

        else { 

         echo ""; 

        } 


      wp_reset_query(); 

回答

0

首先,你不需要任何自定义代码做你”重新做:

$goes_with = get_post_meta(get_the_ID(), 'goes_with'); //Returns array when 3rd parameter is left empty or false 
foreach($goes_with as $slug){ 
    $args = array(
     'post_type' => 'page', 
     'post_status' => 'publish', 
     'pagename' => $slug 
    ); 
    query_posts($args); //Bad way 
    while(have_posts()){ the_post(); //Bad way 

    //$query = new WP_Query($args); //Good way 
    //while($query->have_posts()){ $query->the_post(); //Good way               

     echo "<div class='post-product'>"; 
     echo "<a href='".get_permalink()."'>"; 
     thumbPath(140, 140); 
     echo "</a><a href='".get_permalink()."'><p>".get_the_title()."</p></a></div><!--end post-product-->"; 
    } 
    wp_reset_query(); //Bad way 
    //wp_reset_postdata(); //Good way 
} 

其次,你应该绝对避免使用query_posts()。这可能太晚了,因为你的主题已经发送到你的客户端了,但是如果把额外的时间加入你的主题中,你应该考虑把所有从query_posts切换到WP Query

使用WP_Query可以显着提高性能,以及它不会更改任何Wordpress全局变量。

如果您想了解它的实现方式,请随时注释掉所有标记为“Bad way”的行,并取消注释所有标记为“Good way”的行。

此外,通过使用上述代码,您可以在自定义元字段中重复使用相同的'goes_with'键,以便根据需要链接至给定页面查询的许多其他页面。由于您使用pagename而不是ID运行查询,因此必须从循环内部完成此特定方法。

然而,这对你原来的好处是你依靠Wordpress的内置功能来为你做查询,而不是额外调用数据库来返回你已有的结果给你。

此代码未经测试,可能需要进行一些重构才能使其与您的设置一起工作,但应该让您开始。

希望这可以帮助你,并祝你好运。

+0

有关[query_posts vs WP_Query here]的更多信息(http://wordpress.stackexchange.com/questions/1753/when-should-you-use-wp-query-vs-query-posts-vs-get-posts ) – maiorano84