如何使用PHP在wordpress中按特色图片(底部没有图片帖子)对帖子进行排序?

如何使用PHP在wordpress中按特色图片(底部没有图片帖子)对帖子进行排序?,php,wordpress,Php,Wordpress,我正在使用WP类型/视图工具集处理Wordpress查询对象。 我们构建了参数化搜索,允许用户使用各种分类法搜索帖子。它工作正常,可以根据需要显示搜索结果。但是 大多数帖子都没有特色图片,我们想在顶部显示特色图片,而没有特色图片的帖子则放在下面 就逻辑而言,我在这方面有一个良好的开端,只是需要一些帮助 下面的代码允许我在将查询呈现给用户之前对其进行操作 add_filter( 'wpv_filter_query_post_process', 'prefix_rearrange_by_thumb

我正在使用WP类型/视图工具集处理Wordpress查询对象。

我们构建了参数化搜索,允许用户使用各种分类法搜索帖子。它工作正常,可以根据需要显示搜索结果。但是

大多数帖子都没有特色图片,我们想在顶部显示特色图片,而没有特色图片的帖子则放在下面

就逻辑而言,我在这方面有一个良好的开端,只是需要一些帮助

下面的代码允许我在将查询呈现给用户之前对其进行操作

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;
}
如何对查询->帖子进行排序并重新排列,使那些有特色图片的帖子显示在没有特色图片的帖子之前。

所有WP\u Post对象都位于$query->posts下的数组中。可以根据需要的任何条件对数组进行排序。请记住,这只会对结果的每一页进行排序,因为这是返回的结果

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;
}
要对结果的所有页面进行排序,需要修改使用筛选器传递给的参数。有一个称为_thumbnail_id的meta_键,用于每个具有特征图像的帖子/页面,但问题是,对于没有特征图像的帖子/页面,根本没有设置此meta_键,因此如果使用它,结果将按特征图像的id排序,但如果缺少,则将忽略它们。一个选项是基于要在排序中使用的meta_键设置另一个标志。一次清洁将需要,然后你可以使用一个钩保存_后

为数据库前缀进行一次性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以保持_特色的_图像干净:

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_键进行筛选:


我设法以一种更简单的方式做了这件事

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;
}

不过,你的回答仍然很有帮助。非常感谢您的分享

事实上,我想我必须实现这个方法。。。我敢肯定,这会占用更少的内存。我曾试图为此想出一个更好的打包解决方案,并提出:。如果对你有效,我可以更新答案。
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;
}