如何仅提取已附加到帖子/页面的媒体?

时间:2012-03-20 作者:moraleida

情况:我的客户使用WP\\U查询构建了一个简单的库,显示添加到站点的最新媒体:

$cola = new WP_Query(
    array(
    \'post_type\' => \'attachment\',
    \'post_status\' => \'inherit\',
    \'posts_per_page\' => 15,
    \'post_mime_type\' => \'image/jpeg\',
    \'orderby\' => \'date\'
    ));
这很好用。除了现在,我们正在使用AdRotate并希望在网站上显示广告,但我们不希望将这些广告添加到上面的查询中。

一个简单的解决方案是只获取附加到帖子/页面的媒体,因为广告永远不会附加到任何内容。这可以通过使用post_parent: array(_of_all_post_ids) - 除了我们现在已经有了大约4k的帖子,所以这绝对不是一个好方法。

有什么办法吗?

注意:我的客户不是技术人员,所以这就是为什么我排除使用FTP来使用AdRotate在wp内容上创建的横幅文件夹。对于他们的计划用途,媒体画廊将是广告的完美之选

1 个回复
最合适的回答,由SO网友:Boone Gorges 整理而成

与您的post_parent 想法是在posts_where:

function bbg_filter_out_non_attachments( $sql ) {
    global $wpdb;

    // Maybe do some conditional logic to decide whether to filter this query, then...
    return $sql . " AND $wpdb->posts.post_parent != 0 ";
}
add_filter( \'posts_where\', \'bbg_filter_out_non_attachments\' );
另一种技术是手动查询没有post_parent, 然后把它传给post__not_in:

$ad_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_parent = 0 AND post_type = \'attachment\'" ) );
$query_args[\'post__not_in\'] = $ad_ids;
// etc
如果您不喜欢直接使用SQL,也可以将一些内容拼凑在一起,为通过媒体库(而不是新帖子)上传的每个项目添加一段postmeta,然后包括meta_query 中的参数WP_Query. 然而,请注意,这远不如简单地寻找post_parent (这是已经存在的数据,不需要表联接)。

结束