我正在尝试修改 WordPress 搜索以返回找到给定表达式的所有帖子。该表达式可以在帖子内容中或在内容中插入的文档中找到。我正在使用 searchWP 插件进行文档索引。
默认搜索的问题在于它仅返回从媒体库插入内容的文档的父帖子。我在 3 个不同的帖子中使用了一个特定的 pdf 文件。因此,为了在我的搜索结果中显示这些帖子,我使用了 ACF 字段,在其中附加了插入到帖子中的文档。
我写了一段代码,最后我得到了我需要的所有帖子ID,但是我在某个模板(主题默认)中显示帖子时遇到了问题。准确地说,即使我正在循环迭代,一篇文章也会显示 n 次。为了让事情变得更有趣,如果我只想显示帖子的元数据,这就像一个魅力。
这是运行不佳的代码(一遍又一遍地显示相同的代码):
$the_ids = array();
if ( have_posts() ) :
while ( have_posts() ) : the_post();
array_push($the_ids, get_the_ID());
endwhile;
if(!empty($the_ids)){
$attachment_ids = implode(',', $the_ids);
$query = "SELECT DISTINCT p.ID FROM {$wpdb->posts} p
JOIN {$wpdb->postmeta} pm ON (p.ID = pm.post_id AND pm.meta_key = 'linked_file')
WHERE p.post_type = 'post' and pm.meta_value IN ($attachment_ids )";
$results = $wpdb->get_results($query);
$acf_fields = array
if(!empty($results)){
foreach($results as $result){
array_push($acf_fields , $result->ID );
}
}
$merged = array_merge($the_ids, $acf_fields);
$posts_to_display = get_posts($merged);
foreach($posts_to_display as $post){
setup_postdata($post);
get_template_part( 'search', 'results' );
wp_reset_postdata();
}
}
?>
</div>
<?php else : ?>
<?php get_template_part( 'search', 'no_content' ); ?>
<?php endif; ?>
什么按预期工作:
$merged = array_merge($the_ids, $acf_fields);
$posts_to_display = get_posts($merged);
foreach($posts_to_display as $post){
print_r($post);
}
}
为了确定起见,我尝试在 while 循环结束时使用 wp_reset_postdata() ,但这没有帮助。有人知道如何解决这个问题吗?
search-result.php 的内容只是一个通用模板,没有使用任何特定参数。最初的代码只是标准的 WP 搜索代码:
while ( have_posts() ) : the_post();
get_template_part( 'content', 'search' );
endwhile;
我尝试过使用setup_postdata,wp_reset_postdata(),尝试使用GLOBAL变量但没有成功......
解决方案是:
foreach($posts_to_display as $post){
global($post);
setup_postdata($post);
get_template_part( 'search', 'results' );
wp_reset_postdata();
}
不知道为什么它第一次不起作用,但重要的是它现在按预期工作了。