Crear un shortcode para mostrar tipos de contenido personalizados con una taxonomía específica
Creé una plantilla de página para listar todos los productos de una línea específica de productos. Ahora quiero listar todas las entradas de este tipo de contenido personalizado (productos) basado en la taxonomía descrita en el shortcode para cada página.
Ejemplo:
Página "Lista de todos los productos Prime"
[products line="prime"]
Intenté este código:
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' );
En primer lugar, siempre es bueno registrar los shortcodes durante el init
en lugar de hacerlo directamente en el archivo functions.php
. Como mínimo, add_shortcode()
debería estar en init
. ¡De cualquier manera, comencemos!
Cuando utilices add_shortcode()
, el primer parámetro será el nombre del shortcode y el segundo será la función de callback. Esto significa que:
[products line="prime"]
Debería ser:
[produtos line="prime"]
Hasta ahora tenemos esto:
/**
* Registrar todos los shortcodes
*
* @return null
*/
function register_shortcodes() {
add_shortcode( 'produtos', 'shortcode_mostra_produtos' );
}
add_action( 'init', 'register_shortcodes' );
/**
* Callback del Shortcode de Produtos
* - [produtos]
*
* @param Array $atts
*
* @return string
*/
function shortcode_mostra_produtos( $atts ) {
/** Nuestro esquema irá aquí
}
Veamos cómo procesar los atributos. La forma en que funciona shortcode_atts()
es que intentará coincidir los atributos pasados al shortcode con los atributos en el array proporcionado, donde el lado izquierdo es la clave y el derecho son los valores predeterminados. Entonces necesitamos cambiar defaults
a line
- si queremos que por defecto sea una categoría, este sería el lugar:
$atts = shortcode_atts( array(
'line' => ''
), $atts );
SI el usuario añade un atributo al shortcode line="test"
, entonces nuestro índice del array line
contendrá test
:
echo $atts['line']; // Imprime 'test'
Todos los demás atributos serán ignorados a menos que los agreguemos al array shortcode_atts()
. Finalmente, solo queda el WP_Query y mostrar lo que necesites:
/**
* Registrar todos los shortcodes
*
* @return null
*/
function register_shortcodes() {
add_shortcode( 'produtos', 'shortcode_mostra_produtos' );
}
add_action( 'init', 'register_shortcodes' );
/**
* Callback del Shortcode de 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 'Lo sentimos, no se encontraron publicaciones';
}
}
En el código anterior, he creado un CPT (Custom Post Type) de productos y una taxonomía product_category para el CPT de productos.
[product-list category="camisas"]
¡El código anterior funciona perfectamente!

**Prueba esto**
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.="Escribe aquí lo que quieras obtener";
return $html;
}
else
{
return 'Por favor ingresa un shortcode correcto';
}
}
add_shortcode('bws_quiz_maker','shortcode_bws_quiz_maker');

Por favor, [edita] tu respuesta y añade una explicación: ¿por qué eso podría resolver el problema?
