我不想在帖子的源代码中包含图像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;
}