WordPress 自定义搜索查询,用于查找具有特定插入媒体的所有帖子

问题描述 投票:0回答:1

我正在尝试修改 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变量但没有成功......

php wordpress search advanced-custom-fields custom-wordpress-pages
1个回答
0
投票

解决方案是:

    foreach($posts_to_display as $post){
           global($post);
           setup_postdata($post);
           get_template_part( 'search', 'results' );
           wp_reset_postdata();
         }

不知道为什么它第一次不起作用,但重要的是它现在按预期工作了。

© www.soinside.com 2019 - 2024. All rights reserved.