Crear un shortcode para mostrar tipos de contenido personalizados con una taxonomía específica

21 jul 2016, 21:54:57
Vistas: 39.3K
Votos: 7

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

¿Has intentado hacer esto o tienes algún código que mostrar?

Howdy_McGee Howdy_McGee
21 jul 2016 22:07:55

Eso es un buen comienzo - a veces las personas aquí están más inclinadas a responder preguntas cuando saben que quien pregunta ha intentado una solución (y no solo está pidiendo código). Podría ser beneficioso que edites tu pregunta y agregues ese fragmento de código :)

Howdy_McGee Howdy_McGee
21 jul 2016 22:18:02
Todas las respuestas a la pregunta 3
0

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();
}
21 jul 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  '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!

4 nov 2018 13:29:03
2
-1

**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');
20 jun 2017 10:33:40
Comentarios

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

fuxia fuxia
20 jun 2017 11:23:05

Esta respuesta no responde para nada a la pregunta original - parece completamente irrelevante. Además, carece de cualquier explicación sobre lo que se supone que hace o cómo usarlo.

butlerblog butlerblog
11 nov 2018 01:54:46