比这更好的WordPress附件查询

时间:2013-04-07 作者:Goran Jakovljevic

我有一个拥有超过10000篇帖子和图片的网站,它是classipress网站。我需要以某种方式显示所有处于挂起状态且尚未过期的帖子的图像(post meta)。这是我想出的代码,它正在发挥作用:

function cb_dash_images(){
    $args = array(\'post_type\' => \'attachment\', \'numberposts\' => -1, \'post_status\' => null, \'post_parent\' => $post_id, \'order\' => \'ASC\', \'orderby\' => \'ID\');
    $images = get_children($args);

    foreach($images as $image){ 
        // Get post expire time in timestamp
        $post_time = strtotime(get_post_meta($image->post_parent,\'cp_sys_expire_date\',true));
        // If draft and not expired
        if(get_post_status($image->ID) == \'pending\' && current_time(\'timestamp\') < $post_time) {
        $slika = wp_get_attachment_image($image->ID, \'thumbnail\'); 
        edit_post_link( $slika, \'<div class="dash-image" style="float:left;margin-right:5px; min-height:50px;">\', \'</div>\', $image->post_parent ); 
        }   
    }
}
这是有效的。但它会检查所有35k个图像,并检查其中的每一个图像,是否其parrent-post状态处于挂起状态,以及其parrent-post元是否已过期。而且它真的很慢:)我如何首先检查post是否处于挂起状态和post meta value,然后进行循环,因为这样,它不会遍历35k个图像,而只遍历来自具有指定post meta value的挂起状态的post的图像。

非常感谢。

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

我没有要测试的数据,因此下面的代码可能是错误的。

add_filter(\'posts_search\', \'set_is_tax_to_true\' ,10,2);
function set_is_tax_to_true($search,$query){
    $query->is_tax = true;
}
$args = array(
    \'post_type\' => \'attachment\',
    \'posts_per_page\' => -1,
    \'post_status\' => \'pending\',
    \'post_parent\' => $post_id,
    \'order\' => \'ASC\',
    \'orderby\' => \'ID\',
    \'meta_query\'=> array(
       array(
           \'key\' => \'cp_sys_expire_date\',
           \'value\' => current_time(\'mysql\'),
           \'compare\' => \'>\',
           \'type\' =>  \'DATE\'
       )
   ));
$query = new WP_Query($args);
$images = $query->get_posts();
remove_filter(\'posts_search\',\'set_is_tax_to_true\',10);
它将生成类似SQL的SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts LEFT JOIN wp_posts AS p2 ON (wp_posts.post_parent = p2.ID) INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) WHERE 1=1 AND wp_posts.post_type = \'attachment\' AND ((wp_posts.post_status = \'pending\') OR (wp_posts.post_status = \'inherit\' AND (p2.post_status = \'pending\'))) AND ( (wp_postmeta.meta_key = \'cp_sys_expire_date\' AND CAST(wp_postmeta.meta_value AS DATE) > \'2013-04-08 10:11:09\') ) GROUP BY wp_posts.ID ORDER BY wp_posts.ID

嗯,很长的SQL。

这个set_is_tax_to_true hack是强制WP\\u Query生成此((wp_posts.post_status = \'pending\') OR (wp_posts.post_status = \'inherit\' AND (p2.post_status = \'pending\')))

注:我假设post meta中存储的日期格式为2012-12-12 12:12:12. 如果没有,请按此操作link 更改meta\\u查询参数

结束

相关推荐

使用本地回退加载javascript CDN(非jQuery)

我正在尝试修改this 使用本地回退从CDN注册jQuery插件并将其排队。然而,当URL失败时(或者如果我给它一个假URL),Firebug在加载本地回退之前会收到2个对URL的中止调用。使用类似于链接的jQuery回退,它只接收1个中止的调用。看起来它在使用回退之前尝试加载脚本两次。function gavsiu_scripts() { if (is_single() && comments_open() && get_option(\'thread_com