web-dev-qa-db-fra.com

Requête SQL personnalisée sur le type de publication personnalisé. Commander par taxonomie?

J'ai créé un type d'article personnalisé appelé 'publications' et une taxonomie personnalisée appelée 'topics'. J'utilise également la taxonomie standard de 'category'.

Ma requête personnalisée s'assure qu'elle récupère TOUS les 'publications' qui se trouvent dans le 'category' correct, mais j'aimerais également que ORDER BY soit ajouté à la taxonomie 'topics' supplémentaire.

Cette requête personnalisée récupère tout le 'publications' correct, mais je n’ai aucune chance avec la section 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)));

Le $parent_post_slug est le nom 'category'. Et il va chercher tous les bons messages. Comment puis-je les commander par la taxonomie appelée 'topics'?

Un exemple de l'ordre que je voudrais:

Nom de catégorie = Fiction (Cette page ne montre que les publications de fiction)
La publication 1 = a un sujet taxonomique personnalisé d’Alligator
La publication 2 = a un sujet taxonomique personnalisé sur Alligator
La publication 3 = a un sujet taxonomique personnalisé sur les antilopes
La publication 4 = a un sujet taxonomique personnalisé sur les buffles
La publication 5 = a un sujet taxonomique personnalisé sur les buffles

Avez-vous une idée de ce que je devrais utiliser dans la ligne ORDER BY pour que cela fonctionne?

1
John King

Enfin, j'ai réussi à faire ce travail. J'ai trouvé le saint graal de la commande de types de publication personnalisés par une taxonomie personnalisée, avec pagination. Le code n'est pas joli mais ça marche.

Ma méthode consistait à oublier les requêtes SQL et à sélectionner simplement TOUTES les publications personnalisées correspondant à la bonne catégorie et au type de publication personnalisé approprié (ma catégorie provient de la page en cours, c.-à-d. Foo.com/bar "barre" correspond à ma catégorie. ).

Créez ensuite un tableau personnalisé à partir du résultat contenant chaque identifiant de publication, chaque terme de taxonomie personnalisée et chaque slug de taxonomie personnalisée.

Puis TRIER ce tableau. Ensuite, COUPEZ ce tableau en fonction de la page sur laquelle vous vous trouvez, à savoir Page 1, Page 2, Page 3. Nous sélectionnons simplement les publications à afficher sur cette page. Et puis boucle les résultats.

Je parviens à "grouper" mes résultats dans ces "sujets" en vérifiant simplement si nous avons imprimé le même terme de taxonomie personnalisée sur le post précédent.

Toute la pagination est faite en utilisant le code $ current_paged_num en haut et le code des liens de pagination en bas.

Oui, mon code est moche et probablement une énorme ressource, mais cela fonctionne. Et donc je le partage ici au cas où je pourrais aider quelqu'un d'autre. Si vous pensez pouvoir ranger ou embellir ce code, merci de nous le montrer ici.

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

En regardant simplement la table term_taxonomy, vous sélectionnez tout correctement, sauf la dernière partie:

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

dans le post_type des publications, les termes slug de% s et la taxonomie des catégories, mais vous ne sélectionnez jamais les sujets de taxonomie. Si vous regardez le tableau, vous avez une colonne qui lit la taxonomie. Dans cette colonne, vous pouvez avoir une catégorie ou des sujets. Voici un exemple de deux lignes (plus l'en-tête):

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

(Je le mets en notation tabulaire pour l'exprimer plus facilement)

essayez de jeter les sujets dans la requête select, puis en effectuant un tri:

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