Пользовательский 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, чтобы заставить это работать?

Author: kaiser, 2012-09-27

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
 1
Author: Jonathan, 2012-10-02 18:57:56

Наконец-то мне удалось заставить это работать. Я нашел святой грааль упорядочивания пользовательских типов сообщений по пользовательской таксономии с разбиением на страницы. Код не очень красивый, но он работает.

Мой метод состоял в том, чтобы забыть о 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();

        } ?>
 0
Author: John King, 2012-10-16 16:45:28