Я создал запрос для выбора сообщений в категории. Работает отлично. Но когда я выбираю добавить вторичный фильтр для исключения категории, запрос возвращает тот же набор результатов, как если бы фильтр вторичной категории игнорируется.
Далее запрос должен выбрать все сообщения в категории 7 и исключить сообщения в категории 10:
$querystr = "SELECT * FROM $wpdb->posts
LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
WHERE ($wpdb->term_taxonomy.term_id = 7
AND $wpdb->term_taxonomy.term_id <> 10
AND $wpdb->term_taxonomy.taxonomy = 'category'
AND $wpdb->posts.post_type = 'post'
AND $wpdb->posts.post_status = 'publish')";
Кто-нибудь может помочь?
По какой-то конкретной причине вам нужно сделать это с помощью необработанного SQL вместо использования функций API?
Принято, однако кажется медленнее, чем использование необработанного запроса…. в любом случае спасибо
Я подтверждаю, что использование WP_Query замедляет выполнение запроса, чистый оператор SELECT работает быстрее…. Есть ли способ ускорить WP_query?
Что действительно замедляет розыгрыш банка, так это подход IN. Гораздо быстрее выбрать сообщения, принадлежащие к ОДНОЙ категории, и исключить нежелательные из них позже в цикле….
Это не обязательно медленнее. Если вы используете обычные API-интерфейсы WordPress, вы можете использовать методы кэширования, которые плагины могут использовать для повышения скорости этих API, так что это намного быстрее, чем прямой запрос к базе данных. Другое преимущество использования WP_Query вместо прямого SQL-запроса заключается в том, что он автоматически может создавать цикл WordPress, экономя ваше время на настройке всех глобальных переменных и позволяя использовать теги шаблона.
Истинный. В моем случае я разработал тему с нуля, поэтому это не было серьезной проблемой. Что определенно может препятствовать подходу SELECT, так это структура таблиц; это означает дополнительное тестирование каждый раз, когда выпускаются основные выпуски WP.
Я бы использовал встроенный API, как упоминал Рарст. Вы можете сделать что-то вроде этого:
Тогда у вас будут эти элементы в
$just_seven->posts
.Однако, если вы ДОЛЖНЫ использовать прямую инструкцию SQL, я бы предложил использовать
INNER JOIN
вместоLEFT JOIN
.