HEX
Server: nginx/1.28.1
System: Linux VM-0-12-opencloudos 6.6.117-45.oc9.x86_64 #1 SMP Thu Dec 4 10:26:39 CST 2025 x86_64
User: www (1000)
PHP: 7.4.33
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot/www.waciwang.com/wp-content/themes/miragev-main/api/star.php
<?php
/**
 * 收藏和点赞
 * 
 * @author: vtheme <mail@vtheme.cn>
 * @link: https://vtheme.cn
 * @date: 2024-11-24
 */

namespace api;

class Star
{
    public function index($request)
    {
        // 1.检查用户权限
        $user_id = get_current_user_id();
        if ($user_id == 0) {
            $response = new \WP_REST_Response(array("error" => __('401', 'f')));
            $response->set_status(401);
            return $response;
        }
        
        // 2.检查 type 是否存在
        $query_arr = $request->get_query_params();
        $type_arr = ['star','like'];
        if(!in_array($query_arr['type'], $type_arr)){
            $response = new \WP_REST_Response(array("error" => 'type 是 star 或者 like'));
            $response->set_status(404);
            return $response;
        }
        
        // 3.处理参数
        $per_page = ($query_arr['per_page'] > 1 && $query_arr['per_page'] < 50) ? $query_arr['per_page'] : 20;
        $page = $query_arr['page'] ? $query_arr['page'] : 1;
        $start = ($page - 1) * $per_page;
        
        // 4. 获取列表
        global $wpdb;
        $sql = "SELECT s.*, p.post_title FROM wp_vt_star AS s
                LEFT JOIN wp_posts AS p ON s.object_id=p.ID
                WHERE s.type=%s AND s.user_id=%d
                ORDER BY s.created_at DESC, s.id DESC
                LIMIT %d, %d";
        $data = [$query_arr['type'], $user_id, $start, $per_page];
        $res = $wpdb->get_results($wpdb->prepare($sql, $data), ARRAY_A);
        if($res){
            $response = new \WP_REST_Response($res);
            $response->set_status(200);
            return $response;
        } else {
            $response = new \WP_REST_Response($res);
            $response->set_status(404);
            return $response;
        }
    }
    
    
    public function store($request)
    {
        global $wpdb;
        
        // 1.验证请求json
        $request_data = $request->get_json_params();
        $v = new \Validator();
        $v->name('对象ID')->value($request_data['object_id'])->required();
        $v->name('类型')->value($request_data['type'])->required();
        if (!$v->isSuccess()) {
            $response = new \WP_REST_Response(array("error" => $v->getErrors()[0]));
            $response->set_status(400);
            return $response;
        }

        // 2.检查用户权限
        $user_id = get_current_user_id();
        if ($user_id == 0 && $request_data['type'] == 'like') {
            return $this->storeWithoutAuth($request, $request_data);
        }
        if ($user_id == 0) {
            $response = new \WP_REST_Response(array("error" => __('401', 'f')));
            $response->set_status(401);
            return $response;
        }
        
        // 3.检查文章是否存在
        $sql = "SELECT * FROM {$wpdb->prefix}posts WHERE ID=%s LIMIT 1";
        $res = $wpdb->get_row($wpdb->prepare($sql, [$request_data['object_id']]), ARRAY_A);
        if(!$res){
            $response = new \WP_REST_Response(array("error" => '对象ID不存在'));
            $response->set_status(404);
            return $response;
        }

        // 4.检查 type 是否存在
        $type_arr = ['star','like'];
        if(!in_array($request_data['type'], $type_arr)){
            $response = new \WP_REST_Response(array("error" => 'type 是 star 或者 like'));
            $response->set_status(404);
            return $response;
        }
        
        // 5.添加收藏
        $data = [$user_id, $request_data['object_id'], $request_data['type'], wp_date('Y-m-d H:i:s')];
        
        $sql = "SELECT * FROM {$wpdb->prefix}vt_star WHERE user_id=%d AND object_id=%s AND type=%s";
        $res = $wpdb->query($wpdb->prepare($sql, $data));
        if(!$res){
            $sql = "INSERT INTO {$wpdb->prefix}vt_star (user_id, object_id, type, created_at)
                    VALUES (%d, %s, %s, %s)";
            $res = $wpdb->query($wpdb->prepare($sql, $data));
        }

        // 6.组合返回数据
        $sql = "SELECT count(*) AS num FROM {$wpdb->prefix}vt_star WHERE object_id=%s AND type=%s";
        $res = $wpdb->get_row($wpdb->prepare($sql, [$request_data['object_id'], $request_data['type'] ]));
        $counter = $res->num;
        
        $response_data = [
            'user_id'   => $user_id,
            'object_id' => $request_data['object_id'],
            'type'      => $request_data['type'],
            'counter'   => $counter,
        ];
        
        $response = new \WP_REST_Response($response_data);
        $response->set_status(201);
        return $response;
    }


    /**
     * 未登录用户可以点赞
     */
    public function storeWithoutAuth($request, $request_data)
    {
        global $wpdb;

        // 添加收藏
        $data = [0, $request_data['object_id'], 'like', wp_date('Y-m-d H:i:s')];
        $sql = "INSERT INTO {$wpdb->prefix}vt_star (user_id, object_id, type, created_at)
                VALUES (%d, %s, %s, %s)";
        $res = $wpdb->query($wpdb->prepare($sql, $data));

        // 返回数据
        $sql = "SELECT count(*) AS num FROM {$wpdb->prefix}vt_star WHERE object_id=%s AND type=%s";
        $res = $wpdb->get_row($wpdb->prepare($sql, [$request_data['object_id'], $request_data['type'] ]));
        $counter = $res->num;
        
        $response_data = [
            'user_id'   => 0,
            'object_id' => $request_data['object_id'],
            'type'      => $request_data['type'],
            'counter'   => $counter,
        ];
        
        $response = new \WP_REST_Response($response_data);
        $response->set_status(201);
        return $response;
    }
    
    
    public function destory($request)
    {
        // 1. 检查用户权限
        $user_id = get_current_user_id();
        if ($user_id == 0) {
            $response = new \WP_REST_Response(array("error" => __('401', 'f')));
            $response->set_status(401);
            return $response;
        }
        
        // 2. 检查 type 是否存在
        $request_data = $request->get_json_params();
        $type_arr = ['star','like'];
        if(!in_array($request_data['type'], $type_arr)){
            $response = new \WP_REST_Response(array("error" => 'type 是 star 或者 like'));
            $response->set_status(404);
            return $response;
        }
        
        // 2. 删除记录
        global $wpdb;
        $object_id = $request->get_url_params()['id'];
        $sql = "DELETE FROM {$wpdb->prefix}vt_star WHERE object_id=%d AND user_id=%d AND type=%s";
        $data = [$object_id, $user_id, $request_data['type']];
        $res = $wpdb->query($wpdb->prepare($sql, $data));

        $sql = "SELECT count(id) as counter FROM {$wpdb->prefix}vt_star WHERE object_id=%d AND `type`=%s";
        $res = $wpdb->get_row($wpdb->prepare($sql, [$object_id, $request_data['type']]), ARRAY_A);
        header("X-VT-Counter:" . $res['counter']);

        $response = new \WP_REST_Response([]);
        $response->set_status(200);
        return $response;
    }
    
    
    public function update($request)
    {
        return "update";
    }
    

    public function show($request)
    {
        return "show";
    }
}