web-dev-qa-db-ja.com

カスタム投稿タイプのカスタム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 = Buffalosのカスタム分類学のトピック
出版物5 = Buffalosのカスタム分類トピックがあります

これを機能させるためにORDER BY行で何を使用すべきかという考えはありますか?

1
John King

最後に、私はこの仕事を成功させました。私は、カスタムの投稿タイプをカスタム分類法で、ページ付けして注文するという聖杯を見つけました。コードはきれいではありませんが、うまくいきます。

私の方法は、SQLクエリを忘れて、正しいカテゴリーと正しいカスタム投稿タイプにマッチしたすべてのカスタム投稿を選択することでした(私のカテゴリーは現在のページのスラッグから取得されます。 ).

次に、各投稿ID、Custom Taxonomy( 'topics')Term、およびCustom Taxonomy Slugを含む結果からカスタム配列を作成します。

次にこの配列をソートします。ページ1、ページ2、ページ3など、現在表示されているページに応じてこの配列をスライスします。そのページに表示する出版物を選択します。そして結果をループします。

前回の記事で同じカスタム分類用語を印刷したかどうかを確認するだけで、結果をこれらの「トピック」に「グループ化」することができました。

すべてのページ付けは、上部にある$ current_paged_numコードと下部にあるpaginate linksコードを使用して行われます。

はい、私のコードは醜く、おそらく巨大なリソースを占有するものですが、うまくいきます。そして私は他の誰かを助けることができる場合に備えてここでそれを共有します。あなたがこのコードをきちんと整えたり見分けたりできると思うなら、ここに私たちを見せてください。

<?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
John King

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で、カテゴリの分類がありますが、分類のトピックを選択することはありません。表を見ると、分類を読む1つの列があります。このコラムでは、カテゴリまたはトピックのどちらかを持つことができます。これは2行(およびヘッダー)の例です。

<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
Jonathan