为什么在WP_QUERY中有10个以上的子句会导致某些输出被丢弃?

时间:2017-09-28 作者:Yulia V

我不想在帖子的源代码中包含图像ID,所以我使用the_content 过滤器-执行查询的辅助函数如下所示。当我得到10个或11个ID时,它工作得很好,如果有更多的ID,它们将不会出现在查询结果中。按10个批次进行查询是可行的,但要长得多(700张图像大约需要30秒!)。如果我增加批处理的大小,而不更改函数中的任何其他内容,则数据库会开始删除一些结果。

有什么原因吗?我做错了什么?

我在php/WP编程方面只有几周的经验,请不要对代码的判断太苛刻。

查询基于this answer. 的(非常卷积的)结构示例wp_attachment_metadata, 这使得LIKE 不可避免,是here.

/* get images metas given their names and folders */
function get_images_meta_id( $filenames ) {
    error_log( \'metas started \' );

    $an_upload_dir = trailingslashit(wp_upload_dir()[\'url\']);
    $an_upload_dir_len = strlen($an_upload_dir);

    $filenames_as_params = array();
    sort($filenames);
    $prev_fn = \'\';
    foreach ( $filenames as $fn ) {
        if ((strpos($fn, $an_upload_dir) !== 0) or ($fn === $prev_fn)) {
            continue;
        }       
        $prev_fn = $fn;
        array_push($filenames_as_params, array(
                \'value\'   => \'"\' . substr($fn, $an_upload_dir_len) . \'"\',
                \'compare\' => \'LIKE\',
                \'key\'     => \'_wp_attachment_metadata\',
            ));
    }

    $metas = array();
    $counter = 0;
    while($counter < count($filenames_as_params)) {
        $meta_query_array = array_slice($filenames_as_params, $counter, 10);
        $counter += 10;
        $meta_query_array[\'relation\'] = \'OR\';
        $query_args = array(
            \'post_type\'   => \'attachment\',
            \'post_status\' => \'inherit\',
            \'fields\'      => \'ids\',
            \'meta_query\'  => $meta_query_array
        );

        $query = new WP_Query( $query_args ); 

        if ( $query->have_posts() ) {
            foreach ( $query->posts as $post_id ) {
                $meta = wp_get_attachment_metadata( $post_id );
                $meta[\'attachment_id\'] = $post_id;
                $metas[$meta[\'file\']] = $meta;
            }
        }
    }
    error_log( \'metas done \' );
    return $metas;
}

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

它返回10,因为这通常是在站点“读取”设置(IIRC)中指定的默认值,显然用于前端,但也作为默认值用于wp_query. 你要找的是number_of_posts (不要相信我,检查docs)参数。

顺便说一句,不知道你想做什么,但LIKE 将使您的查询变慢。无论您想做什么,都必须有更好的方法(除非此代码只运行一次,否则性能可能不是问题)

结束

相关推荐

SQL Database Lost

我丢失了我的数据库,当他们恢复文件时,我在数据库目录中有两个文件,我假设这是我数据库的数据。如何使用这两个文件恢复数据库。wp\\U选项。MYI和wp\\U选项。MYD公司谢谢