Извлеките все термины для массива сообщений


Мне нужно получить все термины, связанные с массивом сообщений. Я могу перебирать каждое сообщение и выполнять отдельный запрос get_terms или wp_get_post_terms для каждого сообщения, но это кажется очень медленным способом сделать это. (С точки зрения времени выполнения БД).

Есть ли какой-нибудь хитрый трюк, который я использую для оптимизации своего кода? Я заглядывал в новый WP_Term_query представлен в WordPress 4.6, но, похоже, это тоже не ответ.

Author: Ahrengot, 2016-10-20

1 answers

Вы можете создать SQL-запрос, используя $wpdb, содержащий все ваши идентификаторы записей из массива, в котором будут перечислены все термины. Или еще лучше получить идентификаторы записей в том же запросе, а не получать их из массива, который вы упомянули.

Вот пример:

global $wpdb;    
$query = $wpdb->get_results( $wpdb->prepare( "select * from `$wpdb->term_relationships` where object_id IN (select ID from $wpdb->posts where post_type = '%s' AND post_author = %d)", 'some_custom_post_type', get_current_user_id() ), ARRAY_A);

Print_r($запрос); и посмотрите на возвращаемое значение. Поскольку get_results используется с ARRAY_A, он вернет ассоциативный массив с результатами SQL.

Я не использовал СОЕДИНЕНИЕ в примере SQL-запроса, чтобы сделать запрос проще для понимания, но использование СОЕДИНЕНИЯ будет еще более эффективным на стороне БД.

ПОСЛЕДУЮЩЕЕ РЕДАКТИРОВАНИЕ: Примером запроса соединения SQL, который выполняет то же самое, что и в приведенном выше ответе, может быть: SELECT wp_posts.ID, wp_term_relationships.term_taxonomy_id, wp_term_relationships.term_order FROM wp_posts INNER JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id AND wp_posts.post_type = 'some_custom_post_type' AND wp_posts.post_author = 1

Чтобы выполнить SQL-запрос через $wpdb, вам нужно изменить префикс таблицы "wp", чтобы таблицы адресовались с помощью $wpdb->имя_таблицы, Wordpress позаботится об изменении префикса после этого. Затем запрос становится: SELECT $wpdb->posts.ID, $wpdb->term_relationships.term_taxonomy_id, $wpdb->term_relationships.term_order FROM $wpdb->posts INNER JOIN $wpdb->term_relationships ON $wpdb->posts.ID = $wpdb->term_relationships.object_id AND $wpdb->posts.post_type = 'some_custom_post_type' AND $wpdb->posts.post_author = 1

Затем вы включаете SQL-запрос в метод $wpdb->get_results также использует метод "подготовить", и в итоге вы получите: global $wpdb;
$query = $wpdb->get_results( $wpdb->prepare( "SELECT $wpdb->posts.ID, $wpdb->term_relationships.term_taxonomy_id, $wpdb->term_relationships.term_order FROM $wpdb->posts INNER JOIN $wpdb->term_relationships ON $wpdb->posts.ID = $wpdb->term_relationships.object_id AND $wpdb->posts.post_type = %s AND $wpdb->posts.post_author = %d", 'some_custom_post_type', get_current_user_id() ), ARRAY_A);

Поэкспериментируйте с тем, что я предложил в ответе, а затем продолжайте и попробуйте присоединиться. Пожалуйста, не забудьте принять ответ, если это помогло вам! Для получения дополнительной информации о соединениях SQL перейдите сюда http://www.w3schools.com/sql/sql_join.asp Для получения дополнительной информации об использовании экземпляра и методов класса wpdb перейдите сюда: https://codex.wordpress.org/Class_Reference/wpdb

 2
Author: Alex Protopopescu, 2016-10-23 12:40:35