通过WordPress API获取随机帖子

时间:2019-12-27 08:45:40

标签: php mysql wordpress wordpress-rest-api

我正在构建一个自测项目,该项目可以从一个问题列表一次给出10个问题。我希望每次开始测试时10个问题都应该有所不同。通过使用WordPress API,前端是React,后端是WordPress。

以前,我通过实现plug-in

在查询中使用了orderby=rand
<?php

/**

 * Plugin Name: REST API - Post list randomize

 * Description: Randomize the content list in REST API passing `orderby=rand` as parameter.

 * Version:     1.0.0

 * Author:      Felipe Elia | Codeable

 * Author URI:  https://codeable.io/developers/felipe-elia?ref=qGTOJ

 */



/**

 * Add `rand` as an option for orderby param in REST API.

 * Hook to `rest_{$this->post_type}_collection_params` filter.

 *

 * @param array $query_params Accepted parameters.

 * @return array

 */

function add_rand_orderby_rest_post_collection_params( $query_params ) {

    $query_params['orderby']['enum'][] = 'rand';

    return $query_params;

}

add_filter( 'rest_post_collection_params', 'add_rand_orderby_rest_post_collection_params' );

它运行良好直到2周前。不修改任何代码,它就被破坏了。我使用Postman进行测试,例如http://localhost/wp/wp-json/wp/v2/questions?per_page=10&orderby=rand。响应是

    "code": "rest_invalid_param",
        "message": "Invalid parameter(s): orderby",
        "data": {
            "status": 400,
            "params": {
                "orderby": "orderby is not one of author, date, id, include, modified, parent, relevance, slug, include_slugs, title."
            }
        }

两个星期前,如果我使用相同的查询,可能会给我10个随机问题。看起来插件无法像以前一样成功添加rand作为WordPress中orderby的参数。

顺便说一句,WP中orderby=rand的功能没有中断,因为如果我在WP核心代码中手动添加rand作为参数,则上述查询可以再次工作。

有人知道插件的问题或WP中的一些最新更新导致了问题吗?

另一件事是,我看到一些文章提到MySQL中的ORDERBY = RAND()会在数据库很大时严重影响性能。因此,我想知道是否应该在查询中使用orderby=rand来获得随机问题或考虑其他方法来完成这项工作。有人对此性能问题有任何建议吗?谢谢!

2 个答案:

答案 0 :(得分:0)

获取独特问题:

table: wp_question_filter_list

id  ip_address question_list
1   1.21.23    1,2,3,4,5
2   1.21.24    1,4,6,7,8    
3   1.21.25    4,5,6,8,9    



function get_unique_questions($ip_address){
global $wpdb;
$table_name = $wpdb->prefix . 'question_filter_list'; 


$unique_id_list=$wpdb->get_results($wpdb->prepare("SELECT * FROM $table_name WHERE  ip_address=%d",$ip_address), ARRAY_A);


    if (count($unique_id_list) > 0) {
    $question_data=$unique_id_list[0];

    $arr_question=array();
    if(isset($question_data['question_list']) && $question_data['question_list']!=''){
        $arr_old_question_id_list=explode(",",$question_data['question_list']);
    }

$excludes = implode(',', $arr_old_question_id_list);
$arr_question_id_list=$wpdb->get_results($wpdb->prepare("SELECT * FROM $table_name WHERE ip_address='".$ip_address."' AND id NOT IN('".$excludes."') "), ARRAY_A);
set_unique_questions($ip_address,$arr_question_id_list);
}

function set_unique_questions($ip_address,$arr_question_id_list){
    global $wpdb;
    $table_name = $wpdb->prefix . 'question_filter_list'; 
    $unique_id_list=$wpdb->get_results($wpdb->prepare("SELECT * FROM $table_name WHERE  ip_address=%d",$ip_address), ARRAY_A);


    if (count($unique_id_list) > 0) {
    $question_data=$unique_id_list[0];

    $arr_question=array();
    if(isset($question_data['question_list']) && $question_data['question_list']!=''){
        $arr_old_question_id_list=explode(",",$question_data['question_list']);
    }

      if(is_array($arr_question_id_list) && !empty($arr_question_id_list)){     
           foreach($arr_question_id_list as $single_question){
               array_push($arr_question,$single_question);
          }
      }
      $str_question_id_list=implode(",",$arr_question);


   $wpdb->update($table_name, array(
        'question_list' => $str_question_id_list
    ), array(
        'ip_address' => $ip_address
    ));


    }else{

     $str_question_id_list=implode(",",$arr_question_id_list);
     $data = array(
        'ip_address' => $ip_address,
        'question_list' => $str_question_id_list,
    );
     $wpdb->insert($table_name, $data);

   }



$result = $wpdb->insert($table_name, $item);
}

$ip_address=$_SERVER['REMOTE_ADDR'];


$arr_question_list=get_unique_questions($ip_address);

echo "<pre>";
print_r($arr_question_list);

答案 1 :(得分:0)

找到了答案。我需要使rest_post_collection_params的第一个参数add_filter成为对应的帖子类型。

原始rest_post_collection_params用于WP默认帖子类型。因为我使用ACF(高级自定义字段,另一个用于创建自定义帖子类型的插件)来创建自己的帖子类型,例如 books ,所以我需要将第一个参数更改为rest_books_collection_params 。如果您有更多的自定义帖子类型,则只需为每个帖子创建多达add_filter个函数。

根本不知道为什么我可以在三周前而不是现在为所有自定义帖子类型使用rest_post_collection_params。无论如何,既然解决了,就不要打扰。我的项目更面向前端。 WP只是存储。

顺便说一句,可能有人注意到rest_post_collection_params是WP默认帖子类型 posts 。在参数中,它对单数形式的 posts 使用单一形式的 post 。这仅适用于WP默认帖子类型。对于自定义类型,如果是 books ,则参数应为rest_ books _collection_param;如果是问题,则rest_ 问题 _collection_param。保持参数与帖子类型完全相同。