Tôi tò mò về cách SQL tìm tất cả các bài đăng mà không có bất kỳ tệp đính kèm nào.
Phương pháp # 1 - Truy vấn phụ với NOT IN
Đây là nỗ lực đầu tiên của tôi để xây dựng một truy vấn như vậy:
global $wpdb;
$sql = "
SELECT p1.ID, p1.post_title
FROM {$wpdb->posts} p1
WHERE p1.post_type = 'post'
AND p1.post_status = 'publish'
AND p1.ID NOT IN (
SELECT DISTINCT p2.post_parent
FROM {$wpdb->posts} p2
WHERE p2.post_type = 'attachment' AND p2.post_parent > 0
)
ORDER BY p1.post_date DESC
";
// Fetch posts without attachments:
$posts_without_attachments = $wpdb->get_results( $sql );
// Display posts without attachments:
foreach( $posts_without_attachments as $post )
{
echo $post->post_title . '<br/>';
}
Điều này xảy ra rất giống với truy vấn của @ toscho, nhưng ít được sắp xếp hợp lý trong cú pháp ;-)
Phương pháp # 2 - LEFT JOIN
vớiIS NULL
Truy vấn này dường như cũng hoạt động:
global $wpdb;
$sql = "
SELECT p1.ID, p1.post_title
FROM {$wpdb->posts} p1
LEFT JOIN {$wpdb->posts} p2
ON ( p2.post_parent = p1.ID AND p2.post_type = 'attachment' )
WHERE p1.post_type = 'post'
AND p1.post_status = 'publish'
AND p2.post_parent IS NULL
ORDER BY p1.post_date DESC
";
// Fetch posts without attachments:
$posts_without_attachments = $wpdb->get_results( $sql );
nơi chúng ta tham gia bảng bài viết với chính nó và sau đó chọn các NULL
hàng trong cột cha của tệp đính kèm.
Phương thức # 3 - WP_Query với bộ lọc tests_where aka phương thức # 1
Chúng tôi cũng có thể sửa đổi WP_Query()
với posts_where
bộ lọc:
// Filter all posts without attachments:
add_filter( 'posts_where', 'wpse_no_attachments' );
// Query:
$q = new WP_Query( array( 'post_type' => 'post', 'posts_per_page' => -1 ) );
// Remove the filter:
remove_filter( 'posts_where', 'wpse_no_attachments' );
Ở đâu:
function wpse_no_attachments( $where )
{
global $wpdb;
$where .= " AND {$wpdb->posts}.ID NOT IN (
SELECT DISTINCT wpse.post_parent
FROM {$wpdb->posts} wpse
WHERE wpse.post_type = 'attachment' AND wpse.post_parent > 0 ) ";
return $where;
}