Intereting Posts
Как я могу заставить Netbeans использовать операторы импорта вместо полных имен классов в автозаполнении? вызов неопределенного метода DateTime :: add method в php Получить из ассоциативного массива только те элементы, которые указаны Использовать PHP для создания задания cron Удаление последней запятой из цикла foreach Можно ли обновить Lifetime или Daily Statistics в magento с помощью cron? Как вы разрешаете клиентам использовать свой openid на вашем веб-сайте, как и stackoverflow? Пользовательский мягкий столбец удаления и значение для Eloquent ORM Что-то не так с моим кодом, и я не знаю, что, Laravel – принудительный выход определенного пользователя по идентификатору пользователя Начальная перезагрузка сервера на Ajax-вызов Два оператора mysql_fetch_array в Кто-нибудь когда-либо использовал PayPal Website Payments Standard с переменными SESSION? Как показать php-файлы как обычный текст в Apache Загрузка с php с заголовками не работает на IE8

wordpress posts_orderby фильтр с пользовательской таблицей в плагине

Я разрабатываю плагин 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) если вы хотите просмотреть пользовательский запрос только на лицевой стороне.