Как я могу получить список пользовательских тегов, я получаю список всех тегов с этим:
<?php $tags = get_tags(); ?> <?php if (isset($tags)): ?> <ul> <?php foreach ($tags as $tag): ?> <li><?php echo $tag->name; ?></li> <?php endforeach ?> </ul> <?php endif ?>
Это вернет мне список всех используемых тегов на моей странице WordPress.
Мой вопрос: как я могу получить только теги, назначенные для сообщений, написанных зарегистрированным пользователем?
Объект / экземпляр \WP_User
может быть извлечен через:
$user = get_current_user();
Для получения идентификатора есть ярлык API-интерфейса ярлыка:
$user_id = get_current_user_id();
$wpdb
и WP "DBAL" WP в основном использует $wpdb
как DBAL / Database Abstraction Layer. Он получил множество публичных методов и некоторые более высокоуровневые обертки для удобного доступа. Один из них – get_posts_by_author_sql()
:
var_dump( get_posts_by_author_sql( 'post', true, get_current_user_id() ) ); # Result: string 'WHERE post_author = 1 AND post_type = 'post' AND (post_status = 'publish' OR post_status = 'private')' (length=101)
Если вы просто хотите публичные сообщения, используйте 4-й аргумент и установите для него значение true
.
Следующим шагом будет построение полного запроса:
$sql = "select {$wpdb->posts}.id from {$wpdb->posts} ".get_posts_by_author_sql( 'post', true, get_current_user_id() );
Теперь вы можете $wpdb
это на $wpdb
запросе. Не забудьте только условно включить режим отладки. Также не добавляйте отладочную ссылку на сайт в реальном времени, так как статически кэшированные сайты могут печатать ваши учетные данные БД для публики в течение некоторого времени.
/** @var \wpdb $wpdb */ global $wpdb; if ( defined( 'WP_DEBUG' ) and WP_DEBUG and defined( 'WP_DEBUG_DISPLAY' ) and WP_DEBUG_DISPLAY ) $wpdb->show_errors(); $posts = $wpdb->get_results( $sql ); // Filter out only the post IDs and build an array from the result: $posts = wp_list_pluck( $posts, 'id' );
Теперь нам нужно только получить теги. Затем мы создаем новый массив и собираем теги, упорядоченные по идентификаторам почтовых сообщений. Это может привести к дублированию тегов. Если вы этого не хотите, вам придется реализовать другой механизм сортировки и выборки. Это не так сложно, так как вы можете легко срывать термины на основе свойства object_id
которое на самом деле просто является идентификатором сообщения.
$tags = []; foreach ( $posts as $post_id ) $tags[ $post_id ] = get_the_tags( $post_id ); var_dump( $tags );
Имейте в виду, что до PHP v5.4 вам понадобится array()
вместо синтаксиса короткого массива []
.
Результат будет выглядеть следующим образом, и вы получите возвращаемые цели с полным сроком.
array (size=13) 167 => array (size=16) 50 => object(stdClass)[50] public 'term_id' => int 50 public 'name' => string '8BIT' (length=4) public 'slug' => string '8bit' (length=4) public 'term_group' => int 0 public 'term_taxonomy_id' => int 50 public 'taxonomy' => string 'post_tag' (length=8) public 'description' => string 'Tags posts about 8BIT.' (length=22) public 'parent' => int 0 public 'count' => int 1 public 'object_id' => int 167 public 'filter' => string 'raw' (length=3) 51 => object(stdClass)[10] public 'term_id' => int 51 public 'name' => string 'Articles' (length=8) public 'slug' => string 'articles' (length=8) public 'term_group' => int 0 ...
Чтобы получить количество сообщений, написанных в настоящее время пользователем, используйте:
$count = count_user_posts( get_current_user_id() ); // Will return an integer