我使用WP类型/视图工具集处理Wordpress查询对象。 http://wp-types.com
我们构建了参数搜索,允许用户使用各种分类法搜索帖子。它工作正常,它根据需要显示搜索结果。但..
大多数帖子都没有精选图片,我们希望在顶部显示带有精选图片的帖子,而精选的无图像帖子会显示在下方。
就逻辑而言,我有一个良好的开端,只需要一些帮助。
下面的代码允许我在将查询呈现给用户之前对其进行操作。
add_filter( 'wpv_filter_query_post_process', 'prefix_rearrange_by_thumbnail', 10, 3 );
function prefix_rearrange_by_thumbnail( $query, $view_settings, $view_id ) {
// sort posts by thumbnail
return $query;
}
如何对查询>帖子进行排序并对其进行重新排列,以便那些具有特色图片的帖子显示在没有这些内容的帖子之前。
答案 0 :(得分:0)
所有WP_Post
个对象都在$query->posts
下的数组中找到。您可以根据所需的条件使用usort()
对数组进行排序。请记住,这只会对每个结果页面进行排序,因为它是返回的结果。
add_filter( 'wpv_filter_query_post_process', 'prefix_rearrange_by_thumbnail' );
function prefix_rearrange_by_thumbnail( $query ) {
$posts = $query->posts;
usort( $posts, 'sort_by_thumbnail' );
return $query;
}
// function used to sort the posts array
function sort_by_thumbnail( $a, $b ){
// the the featured image id so we can sort by it
$a_thumb = get_post_meta( $a->ID, '_thumbnail_id', true );
$b_thumb = get_post_meta( $b->ID, '_thumbnail_id', true );
if ( empty( $a_thumb ) && ! empty( $b_thumb ) ) return 1;
if ( ! empty( $a_thumb ) && empty( $b_thumb ) ) return -1;
return 0;
}
要对结果的所有页面进行排序,您需要使用WP_Query
过滤器修改传递给wpv_filter_query
的参数。有一个名为" _thumbnail_id"的meta_key。为具有特色图像的每个帖子/页面设置,但问题是没有特色图像的帖子/页面根本没有设置此meta_key,因此如果您使用它,结果将按特色图像的ID排序,但如果缺少它们将被省略。一种选择是根据您在排序中使用的meta_key
设置另一个标记。需要一次清理,然后你可以使用save_post
一次性SQL(调整你的数据库前缀):
INSERT INTO wp_postmeta( post_id, meta_key, meta_value )
SELECT p.ID, '_has_featured_image', IF ( meta_value IS NULL, 0, 1 ) AS _has_featured_image
FROM wp_posts p
LEFT JOIN wp_postmeta m ON p.ID = m.post_id AND meta_key = '_thumbnail_id'
WHERE p.post_status = 'publish'
AND p.post_type IN ('post','page')
挂钩save_post
以保持" _has_featured_image"干净的前进:
add_action( 'save_post', 'set_has_featured_image' );
function set_has_featured_image( $post_id ){
$post = get_post( $post_id );
switch ( $post->post_type ){
case 'post': case 'page':
$thumbnail_id = get_post_meta( $post_id, '_thumbnail_id', true );
update_post_meta( $post_id, '_has_featured_image', ! empty( $thumbnail_id ) );
break;
}
}
现在你可以过滤" _has_featured_image" meta_key
:
add_filter( 'wpv_filter_query', 'prefix_rearrange_by_thumbnail' );
function prefix_rearrange_by_thumbnail( $args ){
$args['orderby'] = 'meta_value';
$args['meta_key'] = '_has_featured_image';
return $args;
}
答案 1 :(得分:0)
我设法以更简单的方式做到了......
add_filter( 'wpv_filter_query_post_process', 'prefix_rearrange_by_thumbnail', 10, 3 );
function prefix_rearrange_by_thumbnail( $query, $view_settings, $view_id ) {
if ( !empty( $query->posts ) ) {
$sorted_posts_top = array();
$sorted_posts_bottom = array();
$all_posts = $query->posts;
foreach ($all_posts as $post) {
if ( has_post_thumbnail($post->ID) ) {
$sorted_posts_top[] = $post;
}
else {
$sorted_posts_bottom[] = $post;
}
$query->posts = array_merge((array)$sorted_posts_top, (array)$sorted_posts_bottom);
}
}
return $query;
}
但是,您的答案仍然非常有用。非常感谢您分享!!!!!!!!!!!!!!!!