自定义搜索结果页面查询,链接固定链接到帖子标题,同时按帖子类型分开

时间:2020-08-14 作者:user13286

我正在使用Option 3 从…起this answer 作为我的来源。到目前为止,它工作得很好,它将我的搜索结果按帖子类型进行拆分,并将每种帖子类型的帖子列在各自的部分中。唯一的问题是,此解决方案似乎不允许使用the_permalink(); 如何调整此代码,以便也可以将帖子标题包装在指向帖子的锚定标记中?

<?php get_header(); ?>
<?php
    $search_query = new WP_Query(
    array(
      \'posts_per_page\'    => -1,
      \'s\'                 => esc_attr($_GET[\'s\']),
      \'post_status\'       => \'publish\'
    )
);

if ($search_query->have_posts()) : ?>
  <section id="search-results">
    <div class="container">
      <div class="row">
        <div class="col">
          <h2><?php echo $search_query->found_posts.\' Search results found\'; ?> for: "<?php echo get_search_query(); ?>"</h2>
        </div>
      </div>
      <div class="search-results-list">
        <?php
          $types = array( \'post\', \'page\', \'glossary\' );
          $posts_titles = [];
          while($search_query->have_posts()) {
            $search_query->the_post();
            $type = $search_query->post->post_type;
            if (!isset($posts_titles[$type]))
            $posts_titles[$type] = [];
            $posts_titles[$type][] = get_the_title();
          }
          rewind_posts();

          foreach($types as $type) : 
            if (!isset($posts_titles[$type]))
              continue;
            ?>
            <div class="row">
              <h3>
                <?php
                  $post_type_obj = get_post_type_object($type);
                  echo $post_type_obj->labels->name
                ?>
              </h3>
            </div>
            <div class="row">
              <div class="col">
                <ul>
                <?php foreach($posts_titles[$type] as $title) : ?>
                  <li class="search-item">
                    <a href="PERMALINK SHOULD GO HERE"><?php echo htmlspecialchars($title); ?></a>
                  </li>
                <?php endforeach; ?>
                </ul>
              </div>
            </div>
          <?php endforeach; ?>
        </div>
      </div>  
  </section>

<?php else:
  echo \'<div class="search-suggestions-no-results">
          <p>\' . __(\'Sorry, no results found\', \'text-domain\') . \'</p>
        </div>\';
endif; ?>
<?php get_footer(); ?>

4 个回复
最合适的回答,由SO网友:Trisha 整理而成

我会尝试一些不同的方法。

我会将帖子类型数组移动到新的WP\\U查询中(因为您使用的是有限的定义集),然后在第一个foreach语句中循环遍历每个帖子类型的下面,我会设置第二个查询,以获取每个$类型中找到的所有帖子。如果需要访问非标准postdata(即自定义元数据),请使用global$post,否则不需要它。

这样您就可以使用\\u permalink。

修改新的WP\\U查询,如下所示:

$search_query = new WP_Query(
array(
  \'posts_per_page\'    => -1,
  \'s\'                 => esc_attr($_GET[\'s\']),
  \'post_status\'       => \'publish\',
  \'post_type\'         => array( \'post\', \'page\', \'glossary\' )
  )
);
然后,您可以在搜索结果列表中直接删除开头div下方的所有内容,只需跳到以下内容:

foreach($types as $type) : 

echo \'<ul class="\' . $type . \'">\';
    while( have_posts() ) {
        the_post();
        if( $type == get_post_type() ){ ?>
        
        <div class="entry-content">
<?php if ( has_post_thumbnail() ) { ?>
<a href="<?php the_permalink(); ?>" title="<?php echo esc_attr( sprintf( esc_html__( \'Permalink to %s\', \'quark\' ), the_title_attribute( \'echo=0\' ) ) ); ?>">
<?php the_post_thumbnail( array(100,100) ); ?>
</a>
<?php } ?>
<?php the_excerpt(); ?>
        
  <?php           
        }   
     rewind_posts();        
    
    echo \'</ul>\';

endforeach; 
?>
或者,如果您想保持WP新的内容/模板组织方式,您可以为每种帖子类型提供单独的模板部分,并提供自己的样式选项等。

echo \'<ul class="\' . $type . \'">\';
    while( have_posts() ) {
        the_post();
        if( $type == get_post_type() ){
            get_template_part(\'content\', \'search\' . $type);
        }   
     rewind_posts();        
    
    echo \'</ul>\';

endforeach; 

SO网友:Jagruti Rakholiya

你可以用它来添加永久链接

echo get_permalink( get_page_by_title( $title, OBJECT, $type ) )

SO网友:t2pe

尝试以下操作:

代替

$posts_titles[$type][] = get_the_title();
使用

$posts_titles[$type][] = array(get_the_title(),get_the_permalink());
然后您的foreach输出链接变成

<?php foreach($posts_titles[$type] as $link) : ?>
  <li class="search-item">
    <a href="<?php _e($link[1]);?>"><?php echo htmlspecialchars($link[0]); ?></a>
  </li>
<?php endforeach; ?>

SO网友:drcrow

替换:

$posts_titles[$type][] = get_the_title();
使用:

$posts_titles[$type][get_the_ID()] = get_the_title();
因此,您将在foreach中拥有post ID:

foreach($posts_titles[$type] as $ID => $title)
最后,您可以执行以下操作:

get_permalink($ID);

相关推荐

How to make a search form?

我在wordpress上迈出了第一步,新手。我发现我想制作一个具有自己风格的搜索表单,并使用一点javascript来重新标注尺寸。因此,我不知道应该如何从几个方面着手。使用get\\u search\\u form()方法检查和更改其样式是否更好?比如搜索字段类或html5 searchform<如果我的表单将有(许多)更改,那么从头开始创建自己的表单更好吗?如果最好使用get\\u search\\u form(),我会直接检查和更改样式吗?或者我是否支持html5并更改其样式?或者有没有办法将