Вопрос

Я пытаюсь создать пользовательский запрос Post для сортировки постов, которые были признаны «Thumbs Up».

Я присоединяюсь к своей пользовательской таблице "WP_POST_VOTES" (в которой хранится количество голосов, полученных в каждом сообщении) с таблицей по умолчанию "WP_POSTS" и отображаю сообщения WHERE votes > 1.

Причина вызывает ошибку SQL. Когда я удаляю posts_where Фильтр У меня нет ошибок, но все мои сообщения отображаются независимо от их номера голосования.

    add_filter('posts_join', 'vote_join' );
    add_filter('posts_where', 'vote_where' );

    function vp_join( $join )
    {

      global $wpdb;

      if (isset($_GET['vote_sort'])) { //when visitor browses voted posts
        $join .= " LEFT JOIN wp_post_votes ON " . 
           $wpdb->posts . ".ID = wp_vote_posts.vote_post_id ";
      }

      return $join;
    }

    function vp_where( $where )
    {
      if (isset($_GET['vp_sort'])) {
        $where = "voted > 1";
       }

      return $where;
    }

//custom permalinks code follows...

Ошибка SQL, которую я получаю в индексе ...

Ошибка базы данных WordPress: [] Выберите t., тт От wp_terms как tnner quint wp_termersomony as tt на tt.term_id = t.term_id inner gin gin wp_term_relationships как tr на tr.term_taxonomy_id = tt.termer_taxonomy_id, где tt.taxonomy в ('категория') и tr.object_id в (0) по заказу t.name asc

.. и в моей боковой панели у меня есть недавний виджет постов. В этом я получаю $wpdb->show_errors();

Ошибка базы данных WordPress: [у вас есть ошибка в вашем синтаксисе SQL; Проверьте руководство, которое соответствует вашей версии MySQL Server для правого синтаксиса для использования почти «Голосовал> 1 Заказ по WP_POSTS.POST_DATE DECS LILM = wp_vote_posts.vote_post_id, где 1 = 1 проголосовал> 1 заказ по WP_POSTS.POST_DATE DECS LIMIT 0, 5

я отметил WHERE 1=1 voted > 1.. не уверен, что это вызывает ошибку и как ее исправить.

Это было полезно?

Решение

Должно быть:

$where .= " AND voted > 1";

Другие примечания:

  • Вместо имен таблиц в твердом кодировании вы должны использовать $wpdb->prefix . 'post_votes';

  • Вместо того, чтобы проверять в глобальном $_GET Вы должны объявить свои фильтры как принятие двух аргументов и кодовых функций соответственно, эти фильтры проходят как второй объект аргумента, который содержит все данные запроса.

Нравиться:

add_filter('posts_where', 'vote_where', 10, 2 );

function vote_where( $where, $query ) {

    if( isset( $query->query_vars['vp_sort'] ) );
        $where .= ' AND voted > 1';

    return $where;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top