Intereting Posts
Как вызвать функцию только один раз (глобальная область переменных) Почему простые обновления для «_edit_lock» wp_postmeta настолько медленны? Excerpt получает выдержку страницы, а не самую последнюю опубликованную выдержку Пользовательские поля & Гравитационные формы Автоматизация абзацев на странице сообщений с уникальной привязной ссылкой Можно ли создавать настраиваемые роли в многопользовательском режиме, которые могут добавлять сайты? Геокодирование раздельного настраиваемого массива полей Изменение таблицы wp_post и производительности / скорости post_meta Почтовый ранг на странице единой страницы на основе настраиваемого поля Регистрация типа сообщения не добавляется в меню администратора Google индексирует страницы вложения WordPress разрешить пользователю создавать виджеты для виджета в виджетах Область виджета внутри виджета Установите фоновое изображение по умолчанию, если нет указанного «признака», Переадресация слишком много раз htacces, переключение на https

ORDER BY wp_post пользовательское имя столбца в wp_query

Я alreday сделал много исследований и разработок по этому вопросу, но не получил подходящего ответа в любом месте. Для меня это очень маленькая задача, если мне нужно сделать запрос mysql. Но, хотя я не очень хорошо разбираюсь в опыте работы в WP, так что я очень разочарован решением вопроса.

Как отсортировать wp_query по настраиваемому столбцу, который я добавил в таблице wp_posts.

$args = array( /*'base' => '%_%', 'format' => '?paged=%#%', 'total' => 1, 'current' => 0, 'show_all' => false, 'end_size' => 1, 'mid_size' => 2, 'prev_next' => true, 'prev_text' => __('« Previous'), 'next_text' => __('Next »'), 'type' => 'plain', 'add_args' => false, 'add_fragment' => '', 'before_page_number' => '', 'after_page_number' => ''*/ 'posts_per_page' => 10, 'post_type' => array('food', 'buffets'), 'meta_key' => 'post_priority', 'orderby' => 'meta_value_num', 'order' => 'ASC' ); 

Когда я пытаюсь с этим на самом деле заказать таблицу wp_postmeta wp_postmeta.meta_value + 0 Средство вместо таблицы wp_post упорядочивает по таблице postmeta. Post_priority – это мой пользовательский столбец в таблице wp_post.

Вот результат запроса, который я получил:

 "SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND ( \n wp_postmeta.meta_key = 'post_priority'\n) AND wp_posts.post_type IN ('food', 'buffets') AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 2 AND wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_postmeta.meta_value+0 ASC LIMIT 0, 10","posts" 

Solutions Collecting From Web of "ORDER BY wp_post пользовательское имя столбца в wp_query"

Вы сказали ему заказать meta_value, поэтому он заказывает мета значение. В таблице wp-posts нет столбца post_priority, поэтому он не может его заказать. Разрешенные значения для «orderby» не являются неограниченными, они являются фиксированным набором.

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

Удалите дополнительный столбец и вместо этого сохраните свои данные в качестве постмета. Установите meta_key в «priority» и meta_value в значение приоритета. Тогда ваш запрос будет работать.

Я немного исследовал, и ваша проблема – это WP_Query::parse_orderby() . Все, что вам нравится использовать в качестве заказа, дезинфицируется там, которое любил отметить Отто. К сожалению, у него нет фильтра, чтобы подключиться. И да, лучше использовать некоторые meta_fields, если вы можете позволить себе дорогостоящий JOIN в каждом get_posts. Если вы не помните, что для этого также может использоваться поле menu_order , если вы не nav_menu_item типы сообщений nav_menu_item .

Во всяком случае, я нашел два решения для этого и хочу поделиться ими здесь. Для более подробной информации читайте https://wp-includes.org/296/custom-wp_posts-column-sortable/

Расширить WP_Query

Самый чистый способ – написать собственный класс запросов:

 <?php class Enhanced_Post_Table_Query extends \WP_Query { /** * Extend order clause with own columns. * * @param string $order_by * * @return bool|false|string */ protected function parse_orderby( $order_by ) { $parent_orderby = parent::parse_orderby( $order_by ); if ( $parent_orderby ) { // WordPress knew what to do => keep it like that return $parent_orderby; } // whitelist some fields we extended $additional_allowed = array( 'something', ); if ( ! in_array( $order_by, $additional_allowed, true ) ) { // not allowed column => early exit here return false; } // Default: order by post field. global $wpdb; return $wpdb->posts . '.post_' . sanitize_key( $order_by ); } } 

Теперь вы можете запускать запросы и сортировать их с помощью настраиваемого поля:

 $get_posts = new Enhanced_Post_Table_Query; $get_posts->query( array( 'orderby' => 'something' ) ); 

Поздний фильтр для перезаписывания вещей

Немного грязно, но он работает. Поскольку для этого нет прямого фильтра, вы можете выбрать более поздний и манипулировать запросом (чем позже это будет грязно):

 <?php /** * Add custom wp_posts column for sorting. * * @param string $order_clause SQL-Clause for ordering. * @param WP_Query $query Query object. * * @return string Order clause like "wp_posts.post_foo DESC" or similar. */ function custom_column_sort_filter( $order_clause, $query ) { // whitelist some fields we extended $additional_allowed = array( 'something', ); if ( ! in_array( $query->get('orderby'), $additional_allowed, true ) ) { // unknown column => keep it as before return $order_clause; } global $wpdb; return $wpdb->posts . '.post_' . sanitize_key( $query->get('orderby') ) . ' ' . $query->get( 'order' ); } add_filter( 'posts_orderby', 'custom_column_sort_filter', 10, 2 ); 

Теперь почти каждый вызов get_posts сообщается о вашем настраиваемом столбце:

 get_posts( [ 'orderby' => 'something', // IMPORTANT: 'suppress_filters' => false, ] ); 

Но только если установлено «suppress_filters». Это должно использоваться каждым плагином. Есть больше решений через preg_replace, но они очень запоздали и замена REGEXP всегда грязная и опасная.

Надеюсь, вы с этим справитесь!