web-dev-qa-db-fra.com

Créer un shortcode pour afficher des types d'article personnalisés avec une taxonomie spécifique

J'ai créé un modèle de page pour répertorier tous les produits d'une gamme de produits spécifique. Maintenant, je veux lister tous les articles de ce type d'article personnalisé (produits) en fonction de la taxonomie décrite dans le shortcode pour chaque page.

Exemple:

Page "Liste de tous les produits Prime"

[ligne de produits = "prime"]

J'ai essayé ce code:

function shortcode_mostra_produtos ( $atts ) {
  $atts = shortcode_atts( array(
    'default' => ''
  ), $atts );
    $terms = get_terms('linhas');
    wp_reset_query();
    $args = array('post_type' => 'produtos',
      'tax_query' => array(
        array(
          'taxonomy' => 'linhas',
          'field' => 'slug',
          'terms' => $atts,
        ),
      ),
     );
     $loop = new WP_Query($args);
     if($loop->have_posts()) {
        while($loop->have_posts()) : $loop->the_post();
            echo ' "'.get_the_title().'" ';
        endwhile;
     }
}
add_shortcode( 'produtos','shortcode_mostra_produtos' );
6
Luan Davi

Tout d’abord, il est toujours bon d’enregistrer le shortcode pendant init et seulement dans votre fichier functions.php général. À tout le moins add_shortcode() devrait être dans init. Quoi qu'il en soit, commençons!

Chaque fois que vous utilisez add_shortcode() le premier paramètre sera le nom du shortcode et le second sera la fonction de rappel. Cela signifie que:

[products line="prime"]

Devrait être à la place:

[produtos line="prime"]

Jusqu'ici nous avons ceci:

/**
 * Register all shortcodes
 *
 * @return null
 */
function register_shortcodes() {
    add_shortcode( 'produtos', 'shortcode_mostra_produtos' );
}
add_action( 'init', 'register_shortcodes' );

/**
 * Produtos Shortcode Callback
 * - [produtos]
 * 
 * @param Array $atts
 *
 * @return string
 */
function shortcode_mostra_produtos( $atts ) {
    /** Our outline will go here
}

Regardons les attributs de traitement. La méthode shortcode_atts() consiste à essayer de faire correspondre les attributs transmis au shortcode aux attributs du tableau transmis, le côté gauche étant la clé et le côté droit les valeurs par défaut. Nous devons donc remplacer defaults par line - si nous voulons utiliser par défaut une catégorie, ce serait l'endroit:

$atts = shortcode_atts( array(
    'line' => ''
), $atts );

SI l'utilisateur ajoute un attribut au shortcode line="test", alors notre index de tableau line contiendra test:

echo $atts['line']; // Prints 'test'

Tous les autres attributs seront ignorés sauf si nous les ajoutons au tableau shortcode_atts(). Enfin, il ne reste que WP_Query et imprimez ce dont vous avez besoin:

/**
 * Register all shortcodes
 *
 * @return null
 */
function register_shortcodes() {
    add_shortcode( 'produtos', 'shortcode_mostra_produtos' );
}
add_action( 'init', 'register_shortcodes' );

/**
 * Produtos Shortcode Callback
 * 
 * @param Array $atts
 *
 * @return string
 */
function shortcode_mostra_produtos( $atts ) {
    global $wp_query,
        $post;

    $atts = shortcode_atts( array(
        'line' => ''
    ), $atts );

    $loop = new WP_Query( array(
        'posts_per_page'    => 200,
        'post_type'         => 'produtos',
        'orderby'           => 'menu_order title',
        'order'             => 'ASC',
        'tax_query'         => array( array(
            'taxonomy'  => 'linhas',
            'field'     => 'slug',
            'terms'     => array( sanitize_title( $atts['line'] ) )
        ) )
    ) );

    if( ! $loop->have_posts() ) {
        return false;
    }

    while( $loop->have_posts() ) {
        $loop->the_post();
        echo the_title();
    }

    wp_reset_postdata();
}
7
Howdy_McGee
    add_shortcode( 'product-list','bpo_product_list' );
function bpo_product_list ( $atts ) {
  $atts = shortcode_atts( array(
    'category' => ''
  ), $atts );
    $terms = get_terms('product_category');
    wp_reset_query();
    $args = array('post_type' => 'product',
      'tax_query' => array(
        array(
          'taxonomy' => 'product_category',
          'field' => 'slug',
          'terms' => $atts,
        ),
      ),
     );
     $loop = new WP_Query($args);
     if($loop->have_posts()) {
        while($loop->have_posts()) : $loop->the_post();
            echo ' "'.get_the_title().'" ';
        endwhile;
     }

     else {
            echo  'Sorry, no posts were found';
          }
}

Dans le code ci-dessus, j'ai créé la taxonomie du produit CPT et de la catégorie produit_catégorie pour le produit CPT.

[product-list category = "chemises"]

Le code ci-dessus fonctionne parfaitement!

0
Pradeep