2012-09-25 92 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