ccc

Añadir un widget especifico dentro de una entrada concreta

Añadir un widget especifico dentro de una entrada concreta (por ejemplo un banner).

En el functions.php de nuestro tema activo:
register_sidebar( array(
    'id' => 'meter_widget_en_articulo',
    'name' => __( 'Dentro articulo', 'lsg' ),
    'description' => __( 'Widget Dentro artículo', 'lsg' ),
    'before_widget' => '<div>',
    'after_widget' => '</div>',
) );

add_shortcode('lsg_get_contenido_widget', 'get_contenido_widget'); // esto solo se usara cuando se haga manualmente
function get_contenido_widget() {
    ob_start();
    dynamic_sidebar( 'meter_widget_en_articulo', array(
    'before' => '<div class="content-widget widget-area">',
    'after'  => '</div>',
    ) );
    $contenido = ob_get_contents();
    ob_end_clean();

    return $contenido;
}

Luego nos vamos ya desde el Admin a Apariencia -> Widget nos saldrá esa nueva zona de widget creada donde podremos meter la imagen (o cualquier otro widget que queramos).

Y ya en la entrada que quieras solo tienes que añadir este shortcode:
[lsg_get_contenido_widget]


Si queremos automatizar como que por ejemplo tras el segundo párrafo de todas las entradas salga ese widget habría que ocultar en el functions.php el add_shortcode y quedaría así:
register_sidebar( array(
    'id' => 'meter_widget_en_articulo',
    'name' => __( 'Dentro articulo', 'lsg' ),
    'description' => __( 'Widget Dentro artículo', 'lsg' ),
    'before_widget' => '<div>',
    'after_widget' => '</div>',
) );

add_filter( 'the_content', 'lsg_insertar_dentro_articulo' );
function lsg_insertar_dentro_articulo( $content ) {
    $content_widget_area = get_contenido_widget();
    if ( is_single() ) {
        return lsg_insertar_despues_del_parrafo( $content_widget_area, 2, $content );
    }
    return $content;
}

// add_shortcode('lsg_get_contenido_widget', 'get_contenido_widget'); // esto solo se usara cuando se haga manualmente
function get_contenido_widget() {
    ob_start();
    dynamic_sidebar( 'meter_widget_en_articulo', array(
    'before' => '<div class="content-widget widget-area">',
    'after'  => '</div>',
    ) );
    $contenido = ob_get_contents();
    ob_end_clean();

    return $contenido;
}

function lsg_insertar_despues_del_parrafo( $insertion, $paragraph_id, $content ) {
    $closing_p = '</p>';
    $paragraphs = explode( $closing_p, $content );
    foreach ($paragraphs as $index => $paragraph) {
         if ( trim( $paragraph ) ) {
            $paragraphs[$index] .= $closing_p;
        }
         if ( $paragraph_id == $index + 1 ) {
            $paragraphs[$index] .= $insertion;
        }
    }
     return implode( '', $paragraphs );
}

INCISO: Si no hubiera segundo párrafo lo pondría detrás del primero y único párrafo.

No hay comentarios:

Publicar un comentario