it-swarm.com.de

Erstellen Sie einen Shortcode, um individuellen Beitragstypen mit einer bestimmten Taxonomie anzuzeigen

Ich habe eine Seitenvorlage erstellt, um alle Produkte einer bestimmten Produktlinie aufzulisten. Jetzt möchte ich alle Posts dieses benutzerdefinierten Post-Typs (Produkte) basierend auf der im Shortcode für jede Seite beschriebenen Taxonomie auflisten.

Beispiel:

Seite "Liste aller Prime-Produkte"

[products line = "prime"]

Ich habe diesen Code ausprobiert:

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

Zuallererst ist es immer gut, Shortcode während init zu registrieren, anstatt nur in Ihrer allgemeinen functions.php -Datei. Zumindest sollte add_shortcode() in init sein. Wie auch immer, fangen wir an!

Wann immer Sie add_shortcode() verwenden, ist der erste Parameter der Name des Shortcodes und der zweite die Rückruffunktion. Das bedeutet, dass:

[products line="prime"]

Sollte stattdessen sein:

[produtos line="prime"]

Bisher haben wir folgendes:

/**
 * 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
}

Werfen wir einen Blick auf die Verarbeitungsattribute. Die Methode shortcode_atts() besteht darin, dass versucht wird, Attribute, die an den Shortcode übergeben wurden, mit Attributen im übergebenen Array abzugleichen, wobei die linke Seite der Schlüssel und die rechte Seite die Standardwerte sind. Wir müssen also stattdessen defaults in line ändern - wenn wir standardmäßig eine Kategorie verwenden möchten, ist dies der Ort:

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

WENN der Benutzer dem Shortcode line="test" ein Attribut hinzufügt, enthält unser Array-Index linetest:

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

Alle anderen Attribute werden ignoriert, es sei denn, wir fügen sie dem Array shortcode_atts() hinzu. Schließlich ist es nur die WP_Query und das Drucken, was Sie brauchen:

/**
 * 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';
          }
}

Im obigen Code habe ich die Produkt-CPT und die Taxonomie product_category für das Produkt-CPT erstellt.

[product-list category = "shirts"]

Der obige Code funktioniert einwandfrei!

0
Pradeep