Извлеките все термины для массива сообщений
Мне нужно получить все термины, связанные с массивом сообщений. Я могу перебирать каждое сообщение и выполнять отдельный запрос get_terms
или wp_get_post_terms
для каждого сообщения, но это кажется очень медленным способом сделать это. (С точки зрения времени выполнения БД).
Есть ли какой-нибудь хитрый трюк, который я использую для оптимизации своего кода? Я заглядывал в новый WP_Term_query
представлен в WordPress 4.6, но, похоже, это тоже не ответ.
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