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_status, p.post_name, u.id AS user_id , u.user_login, u.user_email, 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

Как мне поступить в этой ситуации?


person mhndev    schedule 29.08.2020    source источник


Ответы (1)


В конце концов я решил свою проблему, используя этот запрос:

        $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_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

Вы можете видеть, что я изменил столбцы и строку таблицы postmeta (поворот таблицы), чтобы я мог легко соединить ее с моей таблицей сообщений и упорядочить на основе этих двух полей даты.

person mhndev    schedule 01.09.2020