Intereting Posts
Объединить коды с использованием структуры сокращения 500 Внутренняя ошибка сервера после регистрации, но с успешной регистрацией API настроек с примером массивов Как зарегистрировать / вставить собственный файл CSS? Проблема с переводом на язык Стандартная категория сообщений типа условного обозначения Создание страницы результатов поиска из пользовательского типа сообщения в плагине? Что вызывает этот файл parallax-slider.less, который отсутствует? Как добавить текущий пользовательский таксономии к телу Как получить список популярных плагинов с помощью WordPress.org Plugin API? получить WP-API по идентификатору страницы URL rewrite и пользовательские запросы vars Сервер разбился, пытаясь восстановить wordpress multisite, изображения не найдены. Скрыть виджет внутри div для определенного типа сообщения Возможности пользовательских таксономий

Расширение WP_Query – оптимизация SQL-запроса

Я сохраняю сообщения, пользователь следует в пользовательской таблице с id столбцов, post_id и user_id . Чтобы получить сообщения, которые следует за пользователем, я расширил WP_Query следующим образом:

 class WP_Query_Posts_User_Follows extends WP_Query { function __construct($args=array()) { if ( !empty($args['followed_by']) ) { $this->followed_by = $args['followed_by']; add_filter('posts_where', array($this, 'posts_where')); } parent::query($args); } function posts_where($where) { global $wpdb; $table = $wpdb->prefix . 'post_followed_by'; $where .= $wpdb->prepare(" AND ID IN (SELECT post_id FROM $table WHERE user_id = %d)", $this->followed_by); return $where; } } 

Если вы заметили, что в WHERE есть подзапрос. Я понимаю, что подзапросы являются плохими, поскольку они препятствуют производительности, и особенно в этом случае, когда подзапрос потенциально может вернуть сто или тысячи post_ids которые следует за пользователем. Каковы альтернативы, которые у меня есть, учитывая, что мне нужно работать с WP_Query и не удается запустить собственный SQL напрямую с помощью wpdb ?

Вот идея, однако для этого потребуется возможность создавать пользовательские SQL-запросы – с $ wpdb.

Поскольку вы хотите получать сообщения, за которыми следует пользователь, вы можете создать представление со следующей структурой:

 id user_id post_id post_title post_content ... (all other post fields) 

не беспокойтесь о дублировании сообщений.

Когда вы выберете, вам просто нужно сделать простой select * from the_view where...

Позже вы можете кэшировать результаты из этого представления, используя метод memcache или другого метода кэширования объектов, чтобы сделать его быстрее.

Вы используете лучший способ 🙂 Возможно, если вы хотите оптимизировать свой запрос, вы можете использовать сообщения 2 сообщения плагина. Вам не нужно будет фильтровать запрос. Ссылка – https://github.com/scribu/wp-posts-to-posts/wiki