web-dev-qa-db-fra.com

Obtenir une liste de types de messages personnalisés pour chaque catégorie shortcode

J'essaie de créer un shortcode pour répertorier tous les messages personnalisés dans la catégorie où ils se trouvent. Voici mon code et je ne suis pas un expert en codage mais je pensais que cela fonctionnerait. Si quelqu'un pouvait me dire ce que je faisais mal, ce serait utile. Toute aide est appréciée! Merci d'avance! :)

<?php

add_shortcode( 'categorylist', 'msc_category_post_list_shortcode' );

function msc_category_post_list_shortcode($atts) {

    $categories_args = array(
    'orderby'                  => 'name',
    'order'                    => 'ASC',
    'hide_empty'               => 1,
    'taxonomy'                 => 'cars_category'

); 

    $categories = get_categories( $categories_args );

    foreach( $categories as $category ) :

        $postlist_args = array(
            'posts_per_page'   => -1,
            'offset'           => 0,
            'category'         => $category->cat_ID,
            'orderby'          => 'post_date',
            'order'            => 'DESC',
            'post_type'        => 'msccar',
            'post_status'      => 'publish' );

            $custom_posts = get_posts( $postlist_args );
            foreach ( $custom_posts as $post ) : setup_postdata( $post ); ?>
                <?php $posts .= '<li>'; ?>
                    <?php $posts .= '<a href="' . the_permalink() . '">' . the_title() . '</a>' ?>
                <?php $posts .= '</li>'; ?>

            <?php endforeach; 
            wp_reset_postdata();
            return $posts;
    endforeach;


}
1
Fredrik

Vous n'avez pas affaire à des catégories. Vous avez affaire à une taxonomie personnalisée.

$postlist_args = array(
  'posts_per_page'   => -1,
  'offset'           => 0,
  // 'category'      => $category->cat_ID, // not this
  'tax_query'        => array(
    array(
      'taxonomy' => 'cars_category',
      'field'    => 'id',
      'terms'    =>  $category->term_ID,
    )
  ),
  'orderby'          => 'post_date',
  'order'            => 'DESC',
  'post_type'        => 'msccar',
  'post_status'      => 'publish'
);

Cela n’a pas été testé, et pour le tester, il faudrait un peu d’installation de mon côté - créer la taxonomie, les posts, etc. - mais cela devrait être l’idée.

Je devrais souligner que si cette solution (ou une variante) devrait fonctionner, elle peut aussi être très inefficace. Vous allez exécuter une requête de base de données pour les catégories plus une requête par catégorie retournée. Vous pouvez facilement avoir 30, 40, 50 requêtes ou plus à partir de ce bloc de code seul.

D'après mon expérience, il est presque toujours plus efficace d'exécuter le moins de requêtes possible et de mélanger les résultats en PHP.

Voir: https://wordpress.stackexchange.com/a/91263/21376

1
s_ha_dum