Сортировка таблиц в плагине wp не работает, чего не хватает?

#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<
}