Расширение 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 ?

Solutions Collecting From Web of "Расширение WP_Query – оптимизация SQL-запроса"

Вот идея, однако для этого потребуется возможность создавать пользовательские 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