#php #wordpress #loops #sorting
Вопрос:
У меня есть некоторый код, который, как мне казалось, я помнил, работал раньше, но я не могу вспомнить, тестировал ли я его. Я думал, что знаю. В любом случае, сегодня я перевел сайт на новый домен и не имею доступа к исходному домену для тестирования.
Это отлично работает в первом столбце, но если я выберу любые другие столбцы, я получу ошибку ниже.
[28 июня 2021 21:39:46 UTC] Ошибка базы данных WordPress У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на наличие правильного синтаксиса для использования рядом с «Просмотренное ОГРАНИЧЕНИЕ ПО дескриптору 50 СМЕЩЕНИЕ 0» в строке 1 для запроса ВЫБЕРИТЕ * ИЗ wp_myrows ПОРЯДОК ПО дате Просмотрено ОГРАНИЧЕНИЕ ПО дескриптору 50 СМЕЩЕНИЕ 0, сделанное do_action (‘toplevel_page_wp_list_table_class’), WP_Hook->do_action, WP_Hook->>apply_filters, SP_Plugin->>>plugin_settings_page, Customers_List->>>>prepare_items, Customers_List::get_customers
Я должен иметь возможность нажимать на столбцы сортировки, но в этом разделе в журнале ошибок указано, что у меня проблема:
public static function get_rows( $per_page = 50, $page_number = 1 ) {
global $wpdb;
$sql = "SELECT * FROM {$wpdb->prefix}myrows";
if ( !empty( $_REQUEST['orderby'] ) ) {
$sql .= ' ORDER BY ' . esc_sql( $_REQUEST['orderby'] );
$sql .= !empty( $_REQUEST['order'] ) ? ' ' . esc_sql( $_REQUEST['order'] ) : ' ASC';
}
$sql .= " LIMIT $per_page";
$sql .= ' OFFSET ' . ( $page_number - 1 ) * $per_page;
$result = $wpdb->get_results( $sql, 'ARRAY_A' );
return $resu<
}
Я могу ошибаться, но похоже, что это зацикливается? Я потратил на это много времени и не могу найти ошибку. Как я могу решить эту проблему, чтобы столбцы таблицы могли правильно отсортироваться?
Ответ №1:
Проблема в том, что ваш order_by
параметр содержит значение, состоящее из нескольких слов.
Когда ваш скрипт создает запрос, он заканчивается SELECT * FROM wp_myrows ORDER BY Date Viewed desc LIMIT 50 OFFSET 0
. В этом случае Date Viewed
недопустимое имя столбца.
Чтобы сделать запрос действительным, вам придется добавить обратные ссылки вокруг имени столбца из нескольких слов. Таким образом, ваш результат должен быть:
SELECT * FROM wp_myrows ORDER BY `Date Viewed` desc LIMIT 50 OFFSET 0
Это означает, что ваш код должен быть примерно таким:
public static function get_rows( $per_page = 50, $page_number = 1 ) {
global $wpdb;
$sql = "SELECT * FROM {$wpdb->prefix}myrows";
if ( !empty( $_REQUEST['orderby'] ) ) {
$sql .= ' ORDER BY `' . esc_sql( $_REQUEST['orderby'] ) . '`';
$sql .= !empty( $_REQUEST['order'] ) ? ' ' . esc_sql( $_REQUEST['order'] ) : ' ASC';
}
$sql .= " LIMIT $per_page";
$sql .= ' OFFSET ' . ( $page_number - 1 ) * $per_page;
$result = $wpdb->get_results( $sql, 'ARRAY_A' );
return $resu<
}