Creează un shortcode pentru afișarea custom post types cu o taxonomie specifică

21 iul. 2016, 21:54:57
Vizualizări: 39.3K
Voturi: 7

Am creat un template de pagină pentru a lista toate produsele dintr-o linie specifică de produse. Acum vreau să listez toate postările din acest tip de postare personalizat (produse) bazat pe taxonomia specificată în shortcode pentru fiecare pagină.

Exemplu:

Pagina "Lista tuturor produselor Prime"

[products line="prime"]

Am încercat acest cod:

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' );
3
Comentarii

Ai încercat să faci asta sau ai ceva cod de arătat?

Howdy_McGee Howdy_McGee
21 iul. 2016 22:07:55

Am încercat asta: https://gist.github.com/luanpiegas/51560598cbee58e6881531ee003feab0

Luan Luan
21 iul. 2016 22:09:22

E un început bun - oamenii de aici sunt uneori mai înclinați să răspundă la întrebări când știu că cel care întreabă a încercat o soluție (și nu doar cere cod). Ar putea fi util să editezi întrebarea ta și să adaugi acel fragment de cod :)

Howdy_McGee Howdy_McGee
21 iul. 2016 22:18:02
Toate răspunsurile la întrebare 3
0

În primul rând, este întotdeauna bine să înregistrezi shortcode-urile în timpul acțiunii init și nu doar în fișierul general functions.php. Cel puțin, add_shortcode() ar trebui să fie în init. Oricum, să începem!

Ori de câte ori folosești add_shortcode(), primul parametru va fi numele shortcode-ului, iar al doilea va fi funcția de callback. Asta înseamnă că:

[products line="prime"]

Ar trebui să fie în schimb:

[produtos line="prime"]

Până acum avem asta:

/**
 * Înregistrează toate shortcode-urile
 *
 * @return null
 */
function register_shortcodes() {
    add_shortcode( 'produtos', 'shortcode_mostra_produtos' );
}
add_action( 'init', 'register_shortcodes' );

/**
 * Callback pentru Shortcode-ul Produtos
 * - [produtos]
 * 
 * @param Array $atts
 *
 * @return string
 */
function shortcode_mostra_produtos( $atts ) {
    /** Schița noastră va fi aici
}

Să ne uităm la procesarea atributelor. Modul în care shortcode_atts() funcționează este că va încerca să potrivească atributele transmise shortcode-ului cu atributele din array-ul transmis, partea stângă fiind cheia și partea dreaptă fiind valorile implicite. Deci trebuie să schimbăm defaults în line - dacă vrem să avem o categorie implicită, acesta ar fi locul:

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

DACĂ utilizatorul adaugă un atribut la shortcode line="test", atunci indexul array-ului nostru line va conține test:

echo $atts['line']; // Afișează 'test'

Toate celelalte atribute vor fi ignorate, decât dacă le adăugăm în array-ul shortcode_atts(). În final, rămâne doar WP_Query și afișarea a ceea ce ai nevoie:

/**
 * Înregistrează toate shortcode-urile
 *
 * @return null
 */
function register_shortcodes() {
    add_shortcode( 'produtos', 'shortcode_mostra_produtos' );
}
add_action( 'init', 'register_shortcodes' );

/**
 * Callback pentru Shortcode-ul Produtos
 * 
 * @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();
}
21 iul. 2016 22:51:50
0
    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  'Ne pare rău, nu s-au găsit articole';
          }
}

În codul de mai sus, am creat un tip de postare personalizată (CPT) pentru produse și o taxonomie product_category pentru acest CPT.

[product-list category="shirts"]

Codul de mai sus funcționează perfect!

4 nov. 2018 13:29:03
2
-1

**Încearcă asta**

function shortcode_bws_quiz_maker($id)
{
  if($id!='')
  {
    $post_id=$id[0];
    $html='';
    global $wpdb;
   $args=array('post_type'=>'post_type','p'=>$post_id);
   $wp_posts=new WP_Query($args);
   $posts=$wp_posts->posts;
  $html.="Scrie aici ce dorești să obții";
    return $html;

  }
  else
  {
    return 'Te rugăm să introduci un shortcode corect';    
  }

}
add_shortcode('bws_quiz_maker','shortcode_bws_quiz_maker');
20 iun. 2017 10:33:40
Comentarii

Te rog [editează] răspunsul tău și adaugă o explicație: de ce ar putea rezolva problema?

fuxia fuxia
20 iun. 2017 11:23:05

Acest răspuns nu răspunde deloc la întrebarea OP - pare complet neconectat. De asemenea, îi lipsește orice explicație despre ce ar trebui să facă sau cum să-l folosești.

butlerblog butlerblog
11 nov. 2018 01:54:46