Creează un shortcode pentru afișarea custom post types cu o taxonomie specifică
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' );
Î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();
}

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!

**Î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');

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