按带有附件的自定义帖子排序

时间:2012-02-26 作者:Jonathan Wold

我想我已经弄明白了,我想确保我没有遗漏任何明显的东西。

我的目标是按带有附件的自定义帖子对结果列表进行优先级排序。所以,我有一个查询,返回60个结果,其中40个有附件。我希望这些先显示出来,然后继续没有任何附件的帖子。

鉴于“orderby”参数的局限性,我的攻击方法如下:

创建一个自定义字段(“has\\u attachment”),如果帖子有任何附件,该字段将更新为“true”。将更新绑定到一个操作中(例如,“attachment\\u fields\\u to\\u save”)。

运行查询,将已经有附件的帖子的值设置为true。

如果帖子的所有附件都被删除了,我想让这篇文章防弹,甚至清空字段。不过,在我的用例中,这是不必要的,因为可能性很小。

无论如何,我想看看你们是否有人对改进我的方法有什么建议,或者有没有其他方法来解决这个问题的想法。否则,我就去工作!

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

令人惊讶的是,Wordpress并没有让它变得非常简单。尽管很多人在wordpress上都有类似的问题。org论坛,我相信你的论坛是独一无二的,因为你想保持秩序和排序。

这绝不是高质量的代码,但它完全符合您的要求。

class WP_Query_Custom extends WP_Query {
    static $filters = array( \'join\', \'groupby\', \'fields\', \'results\' );

    function get_posts() {
        $this->enable_filters();
        $posts = parent::get_posts();
        $this->disable_filters();
        return $posts;
    }

    function enable_filters() {
        foreach( self::$filters as $filter ) {
            add_filter( \'posts_\' . $filter, array( __CLASS__, \'filter_\' . $filter ), 10, 1 );
        }
    }

    function disable_filters() {
        foreach( self::$filters as $filter ) {
            remove_filter( \'posts_\' . $filter, array( __CLASS__, \'filter_\' . $filter ), 10, 1 );
        }
    }

    function filter_join($join) {
        global $wpdb;
        return "{$join} LEFT JOIN {$wpdb->posts} AS post_attachment ON {$wpdb->posts}.ID=post_attachment.post_parent AND post_attachment.post_type=\'attachment\' ";
    }

    function filter_groupby($groupby) {
        global $wpdb;
        if ( ! empty($groupby) ) {
            $groupby = ",$groupby";
        }
        return "{$wpdb->posts}.ID{$groupby}";
    }

    function filter_fields($fields) {
        $fields = "GROUP_CONCAT(post_attachment.ID) AS post_attachments, ".$fields;
        return $fields;
    }

    function filter_results($posts) {
        $num_posts = count($posts);
        $offset = 0;
        $new_posts = array();
        for ( $i = 0; $i < $num_posts; $i++ ) {
            if ( ! empty($posts[$i]->post_attachments) ) {
                array_push( $new_posts, $posts[$i] );
                unset( $posts[$i] );
            }
        }
        return array_merge( $new_posts, $posts );
    }
}

$query = new WP_Query_Custom(\'post_type=post\');

结束