在wp_query中分别列出每种自定义帖子类型,而无需重复循环

时间:2019-08-29 21:51:45

标签: php jquery wordpress

我正在使用AJAX搜索从wordpress中提取3种自定义帖子类型(帖子,指南,建议)。正如您在我的if while循环中所看到的那样,结果显示了哪些结果,但是我试图将它们分开,以便显示如下内容:

第1部分

博客帖子

第2部分

指南

问题似乎是我需要编辑if while循环,因为在该循环中添加任何内容只会使它进入该循环。有谁知道修改if while循环实现此目标的最佳方法?

function data_fetch(){
$the_query = new WP_Query( 
  array( 
    'posts_per_page' => 6, 
    's' => esc_attr( $_POST['keyword'] ), 
    'post_type' => array('post' , 'guides', 'advice'),
    'post_status' => 'publish'
  ) 
);


global $post;

if( $the_query->have_posts()) :
    while( $the_query->have_posts() ): $the_query->the_post(); ?>
    <?php $type = get_post_type();
    $term =  $_POST['keyword'];
    $i++;
    $total = $the_query->found_posts;
    ?>
        <span class="search-title">
            <?php if ($type == 'post'):?>
                <?php echo 'Article: ';?>
                <?php elseif($type == 'guide' ):?>
                <?php echo 'Guide: ';?>
                <?php elseif($type == 'advice' ):?>
                <?php echo 'advice: ';?>
            <?php endif;?>

            <a href="<?php echo esc_url( post_permalink() ); ?>"><?php the_title();?></a><br>
        </span>


    <?php endwhile; ?>


    <?php 
  wp_reset_postdata();  
 else: 
  echo '<h3>No Results Found</h3>';
endif;
die();
}

3 个答案:

答案 0 :(得分:1)

如果我是你,我可能只会做三个单独的查询。它们看起来很简单,根本不会引起任何问题。否则,您必须对WP_Query结果进行排序或以某种方式对其重新排序。

但是,如果您对单个查询进行设置-由于这些字符串太短了,我可能只用Output Buffer控制输出。

基本上,您可以创建一个关联数组,并将HTML字符串添加到适当的键中。您可能会更复杂一些,并将它们作为嵌套数组使用,但是由于您的输出非常轻巧,因此可以通过将HTML字符串作为键的值来实现。

我有一些清理代码的自由,并删除了一些未使用的变量,等等。

function data_fetch(){
    // Build the Query Arguments
    $the_query = new WP_Query( array( 
        's'              => esc_attr($_POST['keyword']),
        'posts_per_page' => 6,
        'post_type'      => array('post' , 'guides', 'advice'),
        'post_status'    => 'publish'
    ) );

    // Do we have posts?
    if( $the_query->have_posts()){
        // We do. Start an array that will fill with HTML from the output buffer
        $output = array(
            'post' => '',
            'guides' => '',
            'advice' => '',
        );

        // Loop through the posts
        while( $the_query->have_posts() ){
            $the_query->the_post();
            ob_start(); // Turn on the output buffer
            $type = get_post_type(); ?>

            <span class="search-title">
                <?php echo ($type == 'post') ? 'Article: ' : ucwords($type).': '; // Output "Articles: " for posts, or just capitalize the other post type names ?>
                <a href="<?php echo esc_url( post_permalink() ); ?>"><?php the_title();?></a><br>
            </span>
            <?php $output[$type] .= ob_get_clean(); // Add the HTML output from the buffer to our array
        }
        wp_reset_postdata();

        // Here we have an array with 3 HTML strings that we can output wherever
        echo $output['post'];
        echo $output['guides'];
        echo $output['advice'];
    } else {
        echo '<h3>No Results Found</h3>';
    }
}

答案 1 :(得分:0)

如果我理解您的担心,我建议通过创建一个通用类来划分您的代码。 然后您呼叫其他邮政类型:

class Custom_Query {

public $post_type;
public $key_word;

public function __construct($post_type, $keyword) {
    $this->post_type = $post_type;
    $this->key_word = $keyword;
}

public function getResult() {
    echo '<h1>Article : ' . $this->post_type . '</h1>';
    $the_query = new WP_Query(
            array(
        'posts_per_page' => 6,
        's' => esc_attr($this->key_word),
        'post_type' => array($this->post_type),
        'post_status' => 'publish'
            )
    );
    if ($the_query->have_posts()):
        while ($the_query->have_posts()): $the_query->the_post();

            echo '<span class="search-title">';
            echo '<a href=" ' . esc_url(post_permalink()) . '">' . the_title() . '</a><br>';
            echo '</span>';

        endwhile;
    else:
        echo '<h3>No Results Found</h3>';

    endif;
    wp_reset_postdata();
}

}
global $post;
$type = get_post_type();
$term = $_POST['keyword'];
$article = new Custom_Query($type, $term);
$article->getResult();

答案 2 :(得分:0)

您最初处在正确的轨道上。您可以只使用标准的发布对象来检查发布类型。您可以根据自己的需要进行调整,但是可以尝试以下方法:

<?php

query = new WP_Query( array( 
        's'              => esc_attr($_POST['keyword']),
        'posts_per_page' => 6,
        'post_type'      => array('post' , 'guides', 'advice'),
        'post_status'    => 'publish'
    ) );

    if ($query->have_posts()) {
       while ($query->have_posts()):
          $query->the_post(); 
?>


    <div class="posts">

<?php
        if ($query->post->post_type === 'post') {
            // add your content
        } else if ($query->post->post_type === 'guides' {
            // add your content
        } else {
            // add your content

        }

?>
    </div>

<?php endwhile;

    } else {

    // no posts found

     }