Я разрабатываю плагин WordPress и должен заказывать сообщения сайта с помощью настраиваемой таблицы, которую я создал с моим плагином.
Я не хочу изменять код внутри темы, поэтому я нашел в кодекс фильтры posts_orderby
и posts_join
(здесь: https://codex.wordpress.org/Custom_Queries ).
Таможенная таблица имеет следующие значения:
ID slug price
и в файле плагина, где я добавил эти строки:
add_filter('posts_orderby','custom_orderby'); add_filter('posts_join','custom_join'); function custom_join($join){ global $wpdb; $customTable = $wpdb->prefix.'custom_table'; if(!is_admin()){ $join .= " LEFT JOIN $customTable ON $wpdb->postmeta.meta_value = $customTable.slug"; } return $join; } function custom_orderby($orderby_statement){ global $wpdb; $customTable = $wpdb->prefix.'custom_table'; if(!is_admin()){ $orderby_statement = "$customTable.price DESC"; } return $orderby_statement; }
Когда я обновляю индексную страницу, он дает мне это сообщение об ошибке:
No Results Found The page you requested could not be found. Try refining your search, or use the navigation above to locate the post.
Я попытался выполнить запрос непосредственно в моей базе данных с помощью этого кода:
SELECT * FROM wp_posts t1 LEFT JOIN wp_postmeta t2 ON t1.ID = t2.post_id LEFT JOIN wp_custom_table t3 ON t2.meta_value = t3.slug ORDER BY t3.price DESC
и это работает.
Так что в коде, написанном в моем файле плагина, что-то не так, но я не могу понять.
Хорошо, я решил.
Проблема заключается в том, что почтовый запрос не включает таблицу postmeta, поэтому я добавил его в функцию custom_join
, например:
add_filter('posts_join','custom_join'); add_filter('posts_orderby','custom_orderby'); function custom_join($join){ global $wpdb; $customTable = $wpdb->prefix."custom_table"; if(!is_admin){ $join .= "LEFT JOIN $wpdb->postmeta p1 ON $wpdb->posts.ID = p1.post_id"; $join .= "LEFT JOIN $customTable p2 ON p1.meta_value = p2.slug"; } return $join; } function custom_orderby($orderby_statement){ global $wpdb; if(!is_admin){ $orderby_statement = "p2.price DESC, $wpdb->posts.post_date DESC"; } return $orderby_statement; }
Я также posts_groupby
фильтр posts_groupby
потому что новый запрос дал мне дублированные сообщения (много дублированных сообщений).
Вот код:
add_filter('posts_groupby','custom_groupby'); function custom_groupby($groupby){ global $wpdb; if(!is_admin){ $groupby = "$wpdb->posts.ID"; } return $groupby; }
Все написано в файле плагина, но вы также можете написать в файле function.php
вашей темы.
Не забудьте включить оператор if(!is_admin)
если вы хотите просмотреть пользовательский запрос только на лицевой стороне.