是否可以查询所有没有附件的帖子?

时间:2014-08-25 作者:Sudar

我想得到一个没有附件的所有帖子的列表并删除它们。

This question 需要获取所有有附件的帖子,但我想要相反的结果。

使用蛮力的方法是获取所有帖子,然后逐个遍历它们,然后检查它们是否有附件。但如果可能的话,我想避免。

2 个回复
最合适的回答,由SO网友:birgire 整理而成

我对SQL查找没有任何附件的所有帖子的方式感到好奇。

方法#1-子查询NOT IN

这是我第一次尝试构造这样的查询:

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/>\';
}
这恰好与@toscho的查询非常相似,但在语法上没有那么精简;-)

方法#2-LEFT JOIN 具有IS NULL

此查询似乎也能正常工作:

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 );
在这里,我们将posts表与其自身连接起来,然后选择NULL “附件”父列中的行。

方法#3-WP\\u查询posts\\u其中filter aka Method#1

我们还可以修改WP_Query() 使用posts_where 过滤器:

// 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\' );
其中:

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;
}

SO网友:David

如果您对与链接答案完全相反的答案感到满意,您只需使用此查询获取所有具有附件的帖子,然后使用其ID作为post__not_in 的参数\\WP_Query:

$attachment_args = array( 
  \'post_type\'      => \'attachment\',
  \'post_mime_type\' => \'image\',
  \'post_status\' => \'inherit\',
  \'posts_per_page\' => -1,
  \'post_parent__not_in\' => array(0),
  \'meta_query\' => array(
    array(
      \'key\' => \'_thumbnail_id\',
      \'value\' => \'x\',
      \'compare\' => \'NOT EXISTS\'
    )
  ),
  \'fields\' => \'post_parent\'
);
$atts = new WP_Query($args);
$parents = array_unique(wp_list_pluck($atts->posts,\'post_parent\'));

$post_args = array(
    \'post_type\'      => \'post\',
    \'posts_per_page\' => -1
    \'post__not_in\'   => $parent 
    \'post_status\'    => \'any\'
);
// Posts with no attachment:
$post_query = new WP_Query( $post_args );
Update 托肖指给我提了一个问题。当然,这可以通过一个简单的SQL查询来处理:

<?php 
$query = <<<SQL
    SELECT p.`ID` FROM {$wpdb->posts} p 
    WHERE p.`post_type` = \'post\'
    AND p.`post_status` = \'publish\'
    AND p.`ID` NOT IN (
        SELECT DISTINCT a.`post_parent` FROM {$wpdb->posts} a 
        WHERE a.`post_type` = \'attachment\'
        AND a.`post_parent` != 0
    )
SQL;

//posts with no attachment
$results = $GLOBALS[ \'wpdb\' ]->get_results( $query );
请注意,这与参考答案中的变体略有不同,因为此查询不会区分图像和帖子缩略图,也会查找任何类型的附件。

结束

相关推荐

watermarking gallery items

如何使用中的函数仅向要在库中发布的图像添加图像水印functions.php? 图像可以在.jpg, .png, .gif 总体安排我也found this snippet 它提供相同的服务,但对所有上传的图像进行水印处理。