Пользовательский SQL-запрос для пользовательского типа записи. Порядок по таксономии?
Я создал пользовательский тип записи 'publications'
и пользовательскую таксономию 'topics'
. Я также использую стандартную таксономию 'category'
.
Мой пользовательский запрос гарантирует, что он извлекает ВСЕ 'publications'
, которые находятся в правильном 'category'
, но я хотел бы также ORDER BY
дополнительную 'topics'
таксономию.
Этот пользовательский запрос действительно извлекает все правильные 'publications'
, но мне не повезло с разделом ORDER BY
:
$querystr = "
SELECT *
FROM $wpdb->posts
LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
LEFT JOIN $wpdb->terms ON ($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id)
WHERE $wpdb->posts.post_type = 'publications'
AND $wpdb->terms.slug = %s
AND $wpdb->term_taxonomy.taxonomy = 'category'
ORDER BY $wpdb->term_taxonomy.taxonomy = 'topics' DESC
";
$pageposts = $wpdb->get_results($wpdb->prepare($querystr, array($parent_post_slug)));
$parent_post_slug
- это имя 'category'
. И это очаровательно все правильные посты. Просто как бы я упорядочил их по таксономии, называемой 'topics'
?
Пример заказа, который я хотел бы:
Название категории = Художественная литература (На этой странице показаны только художественные публикации)
Публикация 1 = имеет тему пользовательской таксономии аллигаторов
Публикация 2 = имеет тему пользовательской таксономии аллигаторов
Публикация 3 = имеет специальную тему таксономии антилоп
Публикация 4 = содержит тему пользовательской таксономии буйволов
Публикация 5 = содержит тему пользовательской таксономии буйволов
Есть идеи о том, что я должен использовать в строке ORDER BY
, чтобы заставить это работать?
2 answers
Просто взглянув на таблицу term_taxonomy, вы все выбрали правильно, но последняя часть:
WHERE $wpdb->posts.post_type = 'publications'
AND $wpdb->terms.slug = %s
AND $wpdb->term_taxonomy.taxonomy = 'category'
ORDER BY $wpdb->term_taxonomy.taxonomy = 'topics' DESC
Из типа публикации post_type термины имеют значение %s и содержат таксономию категорий, но вы никогда не выбираете темы таксономии. Если вы посмотрите на таблицу, у вас есть один столбец с таксономией. В этом столбце вы можете указать категорию или темы. Это пример двух строк (плюс заголовок):
<tr>
<td>term_taxonomy_id</td>
<td>term_id</td>
<td>taxonomy</td>
<td>description</td>
<td>parent</td>
<td>count</td>
</tr>
<tr>
<td>1</td>
<td>1</td>
<td>category</td>
<td>This is the description for the category taxonomy</td>
<td>0</td>
<td>1</td>
</tr>
<tr>
<td>1</td>
<td>1</td>
<td>topics</td>
<td>This is the description for the topics taxonomy</td>
<td>0</td>
<td>1</td>
</tr>
(Я поместил это в табличную запись, чтобы выразите это проще)
Попробуйте добавить темы в запрос select, а затем отсортировать по нему:
WHERE $wpdb->posts.post_type = 'publications'
AND $wpdb->terms.slug = %s
AND $wpdb->term_taxonomy.taxonomy = 'category'
AND $wpdb->term_taxonomy.taxonomy = 'topics'
ORDER BY $wpdb->term_taxonomy.taxonomy = 'topics' DESC
Наконец-то мне удалось заставить это работать. Я нашел святой грааль упорядочивания пользовательских типов сообщений по пользовательской таксономии с разбиением на страницы. Код не очень красивый, но он работает.
Мой метод состоял в том, чтобы забыть о SQL-запросах и просто выбрать ВСЕ пользовательские сообщения, соответствующие правильной категории и правильному типу пользовательских сообщений (моя категория взята из текущей страницы, т. Е. foo.com/bar "бар" - это моя категория).
Затем создайте пользовательский массив из результата содержащий идентификатор каждой записи, Пользовательскую таксономию ("темы") Слизняк термина и пользовательской таксономии.
Затем ОТСОРТИРУЙТЕ этот массив. Затем СРЕЖЬТЕ этот массив в зависимости от того, на какой странице вы находитесь, т. Е. Страница 1, Страница 2, Страница 3. Мы просто выбираем публикации для показа на этой странице. А затем зациклите результаты.
Мне удается "сгруппировать" свои результаты в эти "темы", просто проверив, напечатали ли мы тот же пользовательский термин таксономии в предыдущем посте.
Вся разбивка на страницы выполняется с помощью код $current_paged_num вверху и код ссылок на страницы внизу.
Да, мой код уродлив и, вероятно, требует огромных ресурсов, но он работает. И поэтому я делюсь этим здесь на случай, если смогу помочь кому-нибудь еще. Если вы думаете, что можете привести в порядок или приукрасить этот код, пожалуйста, покажите нам здесь.
<?php // Run new query on Publications custom post type
// Appologies for complexity but this is the only way to do this in wordpress
$posts_per_page = 6; // Set number of Posts per page
$parent_post_data = get_post($post->post_parent);
$parent_post_slug = $parent_post_data->post_name; // Get Parent Page Name to find the relevant Stakeholder section
$current_paged_num = 0;
$current_paged_num = intval(get_query_var('paged')); // Find current Pagination Page number
if (($current_paged_num) > 0) { // Calculate offset so that the correct posts are fetched from the database
$offset = (($current_paged_num-1) * $posts_per_page);
} else {
$offset = 0;
$current_paged_num = 1;
}
$query = new WP_Query("post_type=publications&category_name=$parent_post_slug&showposts=-1"); // Get ALL posts for this section
$total = $query->post_count; // Calculate total number of posts
if ($total > 0) { // If we find relevant posts
$x = 0; // Setup Array numbers
while($query->have_posts()): $query->next_post(); // Create new array containing Post IDs and Topic slugs
$customTermSlug = 'unclassified';
$customTermName = 'Unclassified';
$new_terms = get_the_terms( $query->post->ID, 'topics' );
if ($new_terms) {
foreach ($new_terms as $term) {
$customTermSlug = $term->slug;
$customTermName = $term->name;
break;
};
};
$new_array[$x][customID] = $query->post->ID;
$new_array[$x][customTermSlug] = $customTermSlug;
$new_array[$x][customTermName] = $customTermName;
$x++;
endwhile;
function subval_sort($a,$subkey) { // Sort array by Topic slug
foreach($a as $k=>$v) {
$b[$k] = strtolower($v[$subkey]);
}
asort($b);
foreach($b as $key=>$val) {
$c[] = $a[$key];
}
return $c;
}
$ordered_array = subval_sort($new_array, 'customTermSlug');
$filtered_array = array_slice($ordered_array, $offset, $posts_per_page); // Slice (filter) the array to remove all unneccessary items
if ($filtered_array): ?>
<section class="article-list">
<?php foreach ($filtered_array as $item) {
$postID = $item[customID]; // Set up item variables
$customTermName = $item[customTermName];
<article class="clearfix">
<?php $post_array = get_post($postID); ?>
<?php if ($customTermName != $previousTermName) { ?>
<h3><?php echo $customTermName; ?></h3>
<?php } ?>
<h4><?php echo $post_array->post_title; ?></h4>
<?php echo apply_filters('the_content', $post_array->post_content); ?>
<?php $previousTermName = $customTermName; ?>
</article>
<?php } ?>
</section>
<div class="pager">
<?php // Paginate WP using method http://wordpress.stackexchange.com/questions/43489/paginate-custom-post-type-page
$big = 999999999; // need an unlikely integer
echo paginate_links( array(
'base' => str_replace( $big, '%#%', get_pagenum_link( $big ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => ceil($total / $posts_per_page),
'prev_text' => __('Previous | '),
'next_text' => __(' | Next')
)); ?>
</div>
<?php endif;
wp_reset_query();
} ?>