2013-03-04 25 views
5

Tôi có phân loại tùy chỉnh mà tôi sử dụng để nhóm các bài đăng theo chuỗi (một chuỗi là thuật ngữ trong phân loại đó). Những gì tôi muốn là để điều trị những bài viết kèm theo như các trường hợp đặc biệt khi thực hiện vòng lặp WordPress.Hiển thị bài đăng cuối cùng theo ngày từ phân loại tùy chỉnh trong vòng lặp WordPress

Chỉ bài đăng đầu tiên trong chuỗi (bài có ngày gần đây nhất) sẽ hiển thị và tất cả các bài đăng khác không thuộc một thuật ngữ trong phân loại tùy chỉnh sẽ được coi là bài đăng bình thường. Ngoài phân loại loạt tùy chỉnh, các bài đăng cũng có thể được gắn thẻ hoặc phân loại (do đó tối đa ba phân loại, bao gồm cả phân loại tùy chỉnh). Vòng lặp phải chứa một số lượng bài đăng cố định (ví dụ: số bài đăng trên trang đầu được đặt trong chương trình phụ trợ WordPress).

Tôi đang thua lỗ về cách nhóm các bài đăng này, một phần vì tất cả dữ liệu nằm trong các bảng khác nhau và vì mỗi mục có thể thuộc về nhiều phân loại. Tất nhiên lặp qua mảng bài viết, loại bỏ các bài viết cũ trong chuỗi sau khi cuộc gọi MySQL là một khả năng, nhưng trong trường hợp đó, số lượng bài đăng cố định khó duy trì mà không cần thêm truy vấn vào cơ sở dữ liệu.

Vì vậy, tôi muốn triển khai giải pháp SQL thuần túy. Tôi đã thử nghiệm bằng cách sử dụng móc posts_clauses. Truy vấn này dưới đây trả về bài đăng có ID cao nhất, chứ không phải ngày, trong một chuỗi và thay vào đó là đánh thuế trên cơ sở dữ liệu, tôi tin.

$clauses['fields'] .= ", $wpdb->posts.ID AS postID, (SELECT $wpdb->terms.term_id 
    FROM $wpdb->posts, $wpdb->term_taxonomy, $wpdb->term_relationships, $wpdb->terms  
    WHERE $wpdb->posts.ID=postID 
    AND $wpdb->term_taxonomy.taxonomy='post-series' 
    AND $wpdb->term_relationships.term_taxonomy_id=$wpdb->term_taxonomy.term_taxonomy_id 
    AND $wpdb->posts.ID=$wpdb->term_relationships.object_id 
    AND $wpdb->terms.term_id=$wpdb->term_taxonomy.term_id 
    ORDER BY $wpdb->posts.post_date DESC 
    LIMIT 0,1) AS uniqueID"; 

$clauses['groupby'] = "IFNULL(uniqueID,$wpdb->posts.ID)"; 

Dựa trên các điều khoản trên WordPress xây dựng các truy vấn SQL sau:

SELECT SQL_CALC_FOUND_ROWS wp_posts.*, wp_posts.ID AS postID, 
    (SELECT wp_terms.term_id FROM wp_posts, wp_term_taxonomy, wp_term_relationships, wp_terms 
    WHERE wp_posts.ID=postID 
     AND wp_term_taxonomy.taxonomy='post-bundles' 
     AND wp_term_relationships.term_taxonomy_id=wp_term_taxonomy.term_taxonomy_id 
     AND wp_posts.ID=wp_term_relationships.object_id 
     AND wp_terms.term_id=wp_term_taxonomy.term_id 
    ORDER BY wp_posts.post_date DESC LIMIT 0,1) 
    AS uniqueID FROM wp_posts 
WHERE 1=1 
AND wp_posts.post_type = 'post' 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') 
GROUP BY IFNULL(uniqueID,wp_posts.ID) 
ORDER BY wp_posts.post_date DESC 
LIMIT 0, 10 

Tôi cũng đã đọc this tutorial, nhưng tôi không chắc chắn nó được áp dụng trong trường hợp này.

Vì vậy, để tóm tắt: Trong vòng lặp, tôi chỉ muốn hiển thị bài đăng mới nhất (được sắp xếp theo post_date) thuộc một thuật ngữ từ phân loại tùy chỉnh và loại trừ các bài đăng khác trong phân loại đó trong vòng lặp. Vòng lặp cũng chứa các bài đăng thông thường không phải là một phần của phân loại tùy chỉnh và cả hai loại có thể thuộc về nhiều danh mục và có thẻ.

+0

là có bất kỳ sử dụng cho bạn nếu tôi đăng truy vấn sql mà nên làm các trick. như tôi không biết bất cứ điều gì về cách wordpress xây dựng các truy vấn? – Miguelo

+0

Tôi nghĩ rằng đó sẽ là một trợ giúp tuyệt vời! Xây dựng truy vấn trong WordPress không phải là vấn đề đối với tôi. – mensch

+0

sẽ tốt hơn nếu bạn có thể thêm bản ghi mẫu cùng với câu hỏi của mình và kết quả mong muốn. Cảm ơn. –

Trả lời

2

Ok đây là câu trả lời của tôi (đó là hơn một gợi ý)

aproach của tôi sẽ là người đầu tiên chọn mỗi id từ bài viết đó là gần đây nhất trong nhiệm kỳ của họ và thuộc về phân loại sau loạt.

select * from wp_posts where ID in(
select ID from 
(
select wp_posts.ID , wp_posts.post_date, d.name from wp_posts as a 
join wp_term_relationships as b on (a.ID = b.object_id) 
join wp_term_taxonomy as c on (b.term_taxonomy_id = c.term_taxonomy_id) 
join wp_terms as d on (c.term_id = d.term_id) 
where c.taxonomy = 'post-series' 
group by d.name 
having (wp_posts.post_date = max(wp_posts.post_date)) 
)tmp) 

i nhóm lại theo d.name bởi vì bạn muốn một mục nhập cho tên đó và sử dụng có bởi vì bạn muốn một mục nhập mà có POST_DATE max

sau đó tôi chọn tất cả các id mà đi lên từ đó truy vấn và sử dụng chúng trong mệnh đề where ID in()

Tôi không thể kiểm tra điều này nhưng đây là cách tôi sẽ giải quyết nó trong mysql.

+0

Xin cảm ơn, nhưng tiếc là điều này dường như không hoạt động. MySQL đưa ra một lỗi liên quan đến các cột không xác định trong câu lệnh SELECT thứ ba (wp_posts). Và trong phần HAVING.Thay đổi chúng thành 'a.ID' và' a.post_date' cho phép truy vấn chạy mà không có lỗi, nhưng nó không trả về bất kỳ hàng nào. Có vẻ như do truy vấn phụ thứ hai gây ra, điều này không trả về bất kỳ kết quả nào. – mensch

+0

Xóa 'HAVING' trả về một hàng, nằm trong phân loại chuỗi, nhưng không phải là các bài viết khác trong phân loại danh mục. – mensch

+0

ok một điều tôi không biết chắc chắn là nếu 'a.ID = b.object_id' bạn có thể xác nhận rằng object_id là id bài viết và bạn có thể thay đổi nhóm theo 'nhóm bởi d.name, a.post_date 'để bạn nhận được nhiều hơn một hàng. – Miguelo

Các vấn đề liên quan