我不想在帖子的源代码中包含图像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;
}
最合适的回答,由SO网友:Mark Kaplun 整理而成
它返回10,因为这通常是在站点“读取”设置(IIRC)中指定的默认值,显然用于前端,但也作为默认值用于wp_query
. 你要找的是number_of_posts
(不要相信我,检查docs)参数。
顺便说一句,不知道你想做什么,但LIKE
将使您的查询变慢。无论您想做什么,都必须有更好的方法(除非此代码只运行一次,否则性能可能不是问题)