微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WordPress的WP_List_Table排序数据查询问题

如何解决WordPress的WP_List_Table排序数据查询问题

我正在使用wordpress 5.5,PHP 7.4和MysqL 5.7.30 我正在为我的电子商务系统使用woocomerce订阅插件。 我想要的是能够在管理面板显示paginatd订阅的列表 并(重要部分)根据管理面板中的“ next_payment_schedule”,“ first_payment_schedule”日期对其进行排序。 woocommerce订阅插件将所有订阅保留为自定义帖子类型,其类型为“ shop_subscription”,并且还将其所有特定字段保留在postMeta表中。

问题是,正如我所说的,该插件将这些日期保留在postMeta表中。 我如何同时支持分页和排序?

这是我当前的查询

SELECT p.id AS post_id,p.post_status,u.id AS user_id,u.user_login,u.user_email,GROUP_CONCAT(pm.Meta_value)
FROM posts AS p
INNER JOIN users AS u ON p.post_author = u.id
INNER JOIN postMeta AS pm ON pm.post_id = p.id 
WHERE post_type = 'shop_subscription'
AND pm.Meta_key in ('_schedule_start','_schedule_next_payment')
GROUP BY p.id
ORDER BY user_login ASC

当我想处理分页时,此查询很好。

,当我想处理排序时,以下查询很好用

SELECT p.id AS post_id,p.post_title,p.post_name,pm.Meta_key,pm.Meta_value from posts AS p
INNER JOIN postMeta AS pm ON pm.post_id = p.id 
INNER JOIN users AS u ON p.post_author = u.id 
WHERE post_type = 'shop_subscription' 
AND pm.Meta_key in ('_schedule_start','_schedule_next_payment') 
ORDER BY CASE WHEN pm.Meta_key IN('_schedule_next_payment') THEN pm.Meta_value END desc

我应该如何处理这种情况?

解决方法

最后,我使用以下查询解决了我的问题:

        $sql = "SELECT p.id AS post_id,p.post_status,u.id AS user_id,u.user_login,u.user_email,pm2.schedule_start,pm2.schedule_next_payment
                FROM `$wpdb->posts` AS p
                INNER JOIN `$wpdb->users` AS u ON p.post_author = u.id
                INNER JOIN (
                    SELECT t.post_id,MAX(t.schedule_start) AS schedule_start,MAX(t.schedule_next_payment) AS schedule_next_payment
                    FROM (
                
                    SELECT 
                            post_id,case when pm.meta_key = '_schedule_start' then pm.meta_value else 0 end AS schedule_start,case when pm.meta_key = '_schedule_next_payment' then pm.meta_value else 0 end AS schedule_next_payment
                            FROM (SELECT * FROM `$wpdb->postmeta` pm where pm.meta_key IN ('_schedule_next_payment','_schedule_start')) AS pm
                    ) AS t
                    GROUP BY t.post_id
                ) 
                
                AS pm2 ON pm2.post_id = p.id
                WHERE post_type = '".self::POST_TYPE."'"

如果您仔细查看以下子查询:

                    SELECT t.post_id,MAX(t.schedule_next_payment) AS schedule_next_payment
                    FROM (
                        SELECT 
                                post_id,case when pm.meta_key = '_schedule_next_payment' then pm.meta_value else 0 end AS schedule_next_payment
                                FROM (SELECT * FROM `$wpdb->postmeta` pm where pm.meta_key IN ('_schedule_next_payment','_schedule_start')) AS pm
                        ) AS t
                    GROUP BY t.post_id

您可以看到我更改了postmeta表的列和行(旋转表) ,我可以根据这两个日期字段轻松地将其与我的posts表和订单加入。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。