2014-10-31 119 views
0

我有一個博客,需要根據完全自定義表格中的值數量重新排序。我沒有使用元數據的原因有點複雜,但這正是我需要做的。WordPress帖子,按自定義表格結果排序

我只需要計數表wp_upvotes其中有WordPress的博客文章的ID匹配postID的行數,並通過最「upvotes」,以最小訂貨了。即使wp_upvotes表中沒有值,此結果也應包含WordPress帖子。

我想查詢是這樣的:

$post = $wpdb->get_results(" 
    SELECT wp_posts.*, COUNT(wp_upvotes.id) AS upvotes 
    FROM wp_posts 
    LEFT JOIN wp_upvotes 
       ON wp_posts.ID = wp_upvotes.postID 
       WHERE wp_posts.post_status = 'publish' 
       AND wp_posts.post_type = 'post' 
     ORDER BY upvotes DESC, wp_posts.date DESC 
     LIMIT $pageNum, $numToLoad 
    ", ARRAY_A); 

回答

1

如果你想確保有各表之間的匹配,你是正確的使用LEFT JOIN - 一個簡單的方法來思考它是「左側」(wp_posts)中的所有內容將包含在內,如果匹配則包含「右側」(wp_upvotes)的內容,否則爲空。只要使用JOIN將確保只有在匹配的情況下才會顯示兩個表中的行。

我的猜測是,您需要包含一個GROUP BY p.ID以使每個upvotes值都特定於特定的帖子。

請注意,使用wp_posts.date而不是wp_posts.post_date也會發生錯誤;

如果你想在某個地方使用不是wp_的數據庫前綴,那麼使用$wpdb-posts$wpdb-prefix屬性也是一個好主意。

如果你只是想看看數據的結果wp_posts你可以運行與ORDER BY數據庫查詢並返回列,或者如果你想使用WordPress的過濾器(上之類的東西the_title()the_content()你可以通過後的ID爲WP_Query與post_id__inorderby=post__in參數 - !你需要但被引用的ID後面的$upvotes

global $wpdb; 
$sql = <<<SQL; 
    SELECT p.*, COUNT(v.id) as upvotes 
    FROM {$wpdb->posts} p 
    JOIN {$wpdb->prefix}upvotes v 
     ON p.ID = v.postID 
    WHERE 
     p.posts_status = 'publish' 
     AND p.post_type = 'post' 
    GROUP BY p.ID 
    ORDER BY upvotes DESC, p.post_date DESC 
    LIMIT $pageNum, $numToLoad 
SQL; 

// use ARRAY_A to access as $row['column'] instead of $row->column 
$rows = $wpdb->get_results($sql); 
foreach ($rows as $row){ 
    $content = $row->post_content; 
    $upvotes = $row->upvotes; 
} 
+0

感謝您的信息和精力,但它似乎並不奏效,它不返回任何結果:( – 2014-10-31 18:20:55

+0

你可以在SQL工具中運行它嗎?我只是免費的forme d有可能出現語法錯誤,或者$ pageNum或$ numToLoad沒有被設置?嘗試刪除它們,看看它是否有效。 – doublesharp 2014-10-31 18:37:30

+0

它似乎是很好的SQL,並且這兩個值確實正在設置。 – 2014-10-31 18:43:53