WordPress – Sobrescribir un código corto

4 minutos de lectura

avatar de usuario
daniel harris

Tengo un tema que amplía el complemento Visual Composer con un control deslizante en la página principal. El control deslizante mostrará cinco testimonios de cinco clientes diferentes. Quiero agregar la imagen destacada de cada testimonio como miniatura en el control deslizante.

Aquí está el código abreviado del tema principal:

function jo_customers_testimonials_slider( $atts ) {
    extract( shortcode_atts( array( 'limit' => 5, "widget_title" => __('What Are People Saying', 'jo'), 'text_color' => "#000" ), $atts ) );
    $content = "";
    $loopArgs = array( "post_type" => "customers", "posts_per_page" => $limit, 'ignore_sticky_posts' => 1 );

    $postsLoop = new WP_Query( $loopArgs );
    $content = "";

    $content .= '...';
    $content .= '...';
    $content .= '...';

    wp_reset_query();
    return $content;
}
add_shortcode( 'jo_customers_testimonials_slider', 'jo_customers_testimonials_slider' ); 

Mi archivo functions.php:

function jo_customers_testimonials_slider_with_thumbnail( $atts ) {
    extract( shortcode_atts( array( 'limit' => 5, "widget_title" => __('What Are People Saying', 'jo'), 'text_color' => "#000" ), $atts ) );
    $content = "";
    $loopArgs = array( "post_type" => "customers", "posts_per_page" => $limit, 'ignore_sticky_posts' => 1 );

    $postsLoop = new WP_Query( $loopArgs );
    $content = "";

    $content .= '...';
    $content .= get_the_post_thumbnail( get_the_ID(), 'thumbnail' );
    $content .= '...';
    $content .= '...';

    wp_reset_query();
    return $content;
}
add_shortcode( 'jo_customers_testimonials_slider', 'jo_customers_testimonials_slider_with_thumbnail' );

En teoría, la función de mi archivo functions.php debería sobrescribir el código abreviado del tema principal. Pero nada parece suceder cuando uso este código. ¿Qué estoy haciendo mal?

Editar:

Intenté este código, pero aún no funciona.

function wpa_add_child_shortcodes(){
remove_shortcode('jo_customers_testimonials_slider');
    add_shortcode( 'jo_customers_testimonials_slider', 'jo_customers_testimonials_slider_with_thumbnail' );
}
add_action( 'after_setup_theme', 'wpa_add_child_shortcodes' );

también cambiado

add_action( 'after_setup_theme', 'wpa_add_child_shortcodes' ); a

add_action( 'init', 'wpa_add_child_shortcodes' );

pero no hay diferencia en el resultado.

Edición 2 (con solución):

Cambiando add_action( 'after_setup_theme', 'wpa_add_child_shortcodes' ); a add_action( 'wp_loaded', 'wpa_add_child_shortcodes' ); resuelto.

avatar de usuario
clark t

tienes que llamar eliminar_códigocorto(); como esto:

remove_shortcode('jo_customers_testimonials_slider');` 

Antes de agregar su nuevo shortcode con el mismo nombre para “sobrescribirlo”.

También deberá llamarlo después de que se haya ejecutado el tema principal, por lo que activamos un gancho de acción llamado wp_loaded.

function overwrite_shortcode() {

    function jo_customers_testimonials_slider_with_thumbnail($atts) {
        extract(shortcode_atts(array('limit' => 5, "widget_title" => __('What Are People Saying', 'jo'), 'text_color' => "#000"), $atts));
        $content = "";
        $loopArgs = array("post_type" => "customers", "posts_per_page" => $limit, 'ignore_sticky_posts' => 1);

        $postsLoop = new WP_Query($loopArgs);
        $content = "";

        $content .= '...';
        $content .= get_the_post_thumbnail(get_the_ID(), 'thumbnail');
        $content .= '...';
        $content .= '...';

        wp_reset_query();
        return $content;
    }

    remove_shortcode('jo_customers_testimonials_slider');
    add_shortcode('jo_customers_testimonials_slider', 'jo_customers_testimonials_slider_with_thumbnail');
}

add_action('wp_loaded', 'overwrite_shortcode');

  • Intenté eso. No funciona ya que el archivo functions.php se llama antes que los archivos de función del tema principal.

    –Daniel Harris

    21 de enero de 2014 a las 18:05

  • ¿Has intentado hacer algo como esta función shortcode_cleaner() { remove_shortcode(); agregar_códigocorto(); } add_action( ‘init’, ‘shortcode_cleaner’ ); que en teoría debería registrar su código corto primero y evitar que el suyo lo sobrescriba.

    –Clark T.

    21 de enero de 2014 a las 18:10


  • @Daniel, entonces tienes uno obstinado… ¿Has intentado hacer mi última sugerencia, pero en lugar de hacerlo en el gancho after_setup_theme? o si intenta hacerlo después de que el suyo esté registrado, intente con el gancho wp_loaded

    –Clark T.

    21 de enero de 2014 a las 18:16


  • after_setup_theme tampoco funciona Gracias por intentarlo.

    –Daniel Harris

    21 de enero de 2014 a las 18:17

  • @Daniel, ¿qué pasa con el gancho wp_loaded? y lo siento por lanzar conjeturas, no tengo ningún tema secundario para probar.

    –Clark T.

    21 de enero de 2014 a las 18:21

Tienes que escribir este código en functions.php de tu Child Theme

add_action( 'after_setup_theme', 'calling_child_theme_setup' );

function calling_child_theme_setup() {
   remove_shortcode( 'parent_shortcode_function' );
   add_shortcode( 'shortcode_name', 'child_shortcode_function' );
}

function child_shortcode_function( $atts) {
    $atts = shortcode_atts( array(
        'img'  => '',
        'cat'  => '',
        'capt' => '',
        'link' => ''
    ), $atts );

//YOUR OWN CODE HERE

    $imgSrc = wp_get_attachment_image_src( $atts['img'], 'delicious-gallery' );

    $imgFull = wp_get_attachment_image_src( $atts['img'], 'full' );



    $b = '<div class="screen-item" data-groups=\'["'.strtolower(str_replace(' ', '_', $atts["cat"])).'", "all"]\'>'.

        '<a href="'.$atts["link"].'" data-title="'.$atts["capt"].'" target="_blank"><img src="'.$imgSrc[0].'" alt="SCREEN" class="screenImg" /></a>'.

        '<span>'.$atts["capt"].'</span>'.

    '</div>';

//YOUR OWN CODE HERE

    return $b;
}

¿Ha sido útil esta solución?