如何解决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 举报,一经查实,本站将立刻删除。