自定义表中的WP REST API orderby字段

时间:2021-11-23 作者:Sadegh

我有一个名为views的表
此表有“;职位id“;和;“视图”
我已将每篇文章的视图添加到我的自定义文章类型rest API中
我想按视图排序rest API帖子
我发现了一个主题,它展示了如何按元值排序rest API帖子:
https://stackoverflow.com/questions/44783932/wp-rest-api-orderby-meta-value<但是我想按Posteta表中没有的字段排序<请告诉我怎么做。

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

这是mentioned link 如果我们想使用元值来订购rest API内容:

// Add meta your meta field to the allowed values of the REST API orderby parameter
add_filter(
    \'rest_\' . $post_type . \'_collection_params\',
    function( $params ) {
        $params[\'orderby\'][\'enum\'][] = \'YOUR_META_KEY\';
        return $params;
    },
    10,
    1
);

// Manipulate query
add_filter(
    \'rest_\' . $post_type . \'_query\',
    function ( $args, $request ) {
        $order_by = $request->get_param( \'orderby\' );
        if ( isset( $order_by ) && \'YOUR_META_KEY\' === $order_by ) {
            $args[\'meta_key\'] = $order_by;
            $args[\'orderby\']  = \'meta_value\'; // user \'meta_value_num\' for numerical fields
        }
        return $args;
    },
    10,
    2
);
但我想按元表中不包含的字段对rest API内容进行排序。

表格结构:

id views
-- -----
1   5
2   2
3   20
4   1
我想在此表中按视图降序排列rest API帖子
为此,我编辑了“操纵查询”部分,以便创建一个按视图排序ID的数组。(执行我在中使用的解决方案的排序this post)<那我就用post__in 在args中,使用我之前创建的数组作为其参数,然后使用post__inorderby 参数:

// Manipulate query

add_filter(
    \'rest_\' . $post_type . \'_query\',
    function ( $args, $request ) {
        //create an array that have ids that are sorted by views
        global $wpdb;   
        $post_views = $wpdb->get_results( $wpdb->prepare("SELECT id, views FROM " . $wpdb->prefix . "mytable") );
        $views = array_column($post_views, \'views\');
        array_multisort($views, SORT_DESC, $post_views);
        $most_viewd = array_column($post_views, \'id\');  
    
        $order_by = $request->get_param( \'orderby\' );
        if ( isset( $order_by ) && \'views\' === $order_by ) {
            $args[\'post__in\'] = $most_viewd;
            $args[\'orderby\']  = \'post__in\';
        }
        return $args;
    },
    10,
    2
);

相关推荐

‘Sort_Column’=>‘Menu_Order’不起作用

我们有一个简单的插件来显示一个树菜单,其中包括父页面,以及父页面的子页面(因此,当前页面的同级)。我们正在使用以下内容get_pages 代码:$pages = get_pages( [ \'child_of\' => $parent, \'sort_order\' => \'ASC\', \'sort_column\' => \'menu_order\', ]); 但是,页面是按创建日期的升序列出的(最旧的优先)。如何在编辑页