我想显示按帖子类型分组的搜索结果。我有常规的帖子、页面, 以及自定义帖子类型的产品。我如何通过编辑以下代码来完成此任务。 下面的代码仅显示当前所有帖子和页面。
<?php
while (have_posts()) : the_post();
echo "<h1>";
echo $post->post_type;
echo $post->post_title;
echo "</h1>";
endwhile;
?>
此代码会更改原始搜索查询,以按照您选择的顺序按帖子类型对结果进行排序。还有其他解决方案,但这是我发现的唯一一个不会破坏分页或需要多个查询的解决方案。
add_filter('posts_orderby', 'my_custom_orderby', 10, 2);
function my_custom_orderby($orderby_statement, $object) {
global $wpdb;
if (!is_search())
return $orderby_statement;
// Disable this filter for future queries (only use this filter for the main query in a search page)
remove_filter(current_filter(), __FUNCTION__);
$orderby_statement = "FIELD(".$wpdb - > prefix.
"posts.post_type, 'post-type-c', 'post-type-example-a', 'custom-post-type-b') ASC";
return $orderby_statement;
}
就你而言,我会做两件事:
WP_Query
电话对于(1),这将放入您的functions.php中:
<?php
function SearchFilter($query) {
if ($query->is_search && !is_admin()) {
if (isset($query->query["post_type"])) {
$query->set('post_type', $query->query["post_type"]);
} else {
$query->set('post_type', 'product');
}
}
return $query;
}
add_filter('pre_get_posts','SearchFilter');
?>
对于 (2),调整您从模板文件中提供的代码:
<?php
$s = isset($_GET["s"]) ? $_GET["s"] : "";
$posts = new WP_Query("s=$s&post_type=post");
if ( $posts->have_posts() ) :
while ( $posts->have_posts() ) : $posts->the_post();
echo "<h1>";
echo $post->post_type;
echo $post->post_title;
echo "</h1>";
endwhile;
wp_reset_postdata();
endif;
?>
您可以为其他帖子类型重复使用此代码。
query_posts
...请参阅在没有query_posts的情况下查询帖子(甚至WordPress开发人员也同意)。
您需要更改帖子查询才能重新排序。您可以在进入循环之前执行此操作。您可以在 WordPress 代码库中阅读有关 query_posts 的更多信息。
http://codex.wordpress.org/Function_Reference/query_posts
global $wp_query;
$args = array_merge( $wp_query->query, array( 'post_type' => array('type1', 'type2') ) );
query_posts( $args );
//the loop