Pregunta

Necesito mostrar imágenes y otro contenido en la barra lateral dependiendo de una página. Las páginas se agregan dinámicamente y la información que debe aparecer en la barra lateral es diferente para cada página. Así que no puedo predecir qué irá a dónde. Entonces, la idea era tener el contenido de una página como de costumbre (con todos los códigos cortos necesarios) y luego, al final del contenido de la página, tener un código corto con toda la información que debe aparecer en la barra lateral para esa página.


Pregunta original: Mostrar códigos cortos selectivamente (suprima en el contenido principal y, en su lugar, se muestre en una barra lateral)

Me preguntaba si es posible mostrar códigos cortos "selectivamente".

Por ejemplo, un código corto específico, llamémoslo [sc], se especifica dentro de un contenido de página. Ahora, al mostrar el contenido de esa página, me gustaría suprimir ese específico [sc] Shortcode, pero en su lugar exhibirlo desde la barra lateral para esa página. El contenido de una página tendrá otros códigos cortos. Solo quiero mostrar selectivamente el específico [sc] Shortcode and Process Otros como de costumbre, es decir, otros códigos cortos se procesarán dentro del contenido de la página.

¿Es posible hacer eso? ¿Y cómo?

¿Fue útil?

Solución

Un controlador de código corto no tiene que devolver nada, solo puede modificar una variable global que luego lea en su widget de barra lateral. Si su barra lateral se muestra después de su contenido de publicación (probablemente si es una barra lateral derecha), puede hacerlo sin ningún problema. Si su barra lateral se muestra antes del contenido de la publicación, es más complicado: debe comenzar a buffer de salida cuando se llama a su widget, espere hasta que se muestre el resto de la página y luego hacer algo con el contenido de código corto y enjuagar el búfer de salida.

Una simple "prueba de concepto" que muestra el contenido de código corto no en la publicación sino en el pie de página:

$wpse13925_shortcode_content = array();

add_shortcode( '13925', 'wpse13925_shortcode' );
function wpse13925_shortcode( $shortcode_attr, $shortcode_content )
{
    $GLOBALS['wpse13925_shortcode_content'][] = $shortcode_content;
    return '';
}

add_action( 'wp_footer', 'wpse13925_footer' );
function wpse13925_footer()
{
    var_dump( $GLOBALS['wpse13925_shortcode_content'] );
}

Otros consejos

He basado mi solución en Jan Fabry's responder. No tengo widgets, sino archivos de plantilla simples.

Entonces, lo que hice es lo siguiente:

  1. Especificó toda la información que debe aparecer en la barra lateral dentro del contenido de una página envuelto en [sidebar_content] Código corto.

  2. Especificó la siguiente función en Functions.php. Esto amplía todo el contenido de [sidebar_content], pero no muestra nada, sino que lo guarda en la variable global.

    global $sidebar_content;
    add_shortcode("sidebar_content", "my_sidebar_content");
    function my_sidebar_content($atts, $content = null){
        global $sidebar_content;
        if( !empty($content) ){
            $sidebar_content = do_shortcode($content);
        }
        return "";
    }
    
  3. En el sidebar.php. Tengo el siguiente código:

    global $sidebar_content;
    if( isset($sidebar_content) && !empty($sidebar_content) ){
      echo $sidebar_content;
    }
    

Puede usar etiquetas condicionales y do_shortcode.http://codex.wordpress.org/function_reference/do_shortcode
http://codex.wordpress.org/conditional_tags

Un ejemplo simple para una sola página con una ID de 12.

if is_single(12){
do_shortcode('[shortcode]');
}

Si, en su lugar, escribió este brevemente, puede crear una función para darle un parámetro de pantalla, como [shortcode('page=5, 6, 7', 'category', 'exclude=posts', 'whatever')]

Puede hacerlo basado en un campo personalizado, por ejemplo, crear un campo personalizado con nombre sc_no_show y dale el valor de verdad. Luego, en su función de código corto, haga algo como esto:

function what_ever(){
    global $post;
    $no_show = get_post_meta($post->ID,'sc_no_show',true);
    if ($no_show)
        return '';
    //add your normal shortcode stuff here
}

Ahora en cada página o publicación, tiene un campos personalizados nombrados sc_no_show con el valor de true no se mostrará/

Puede usar algunas acciones bien ubicadas para mirar hacia adelante para su código corto, si se encuentra, establecer un indicador y ejecutar acciones adicionales para eliminar primero el contenido de ese código corto, luego uno secundario para ejecutar ese código corto en la barra lateral. Junto con todos los que crean una acción simple dentro del archivo de la barra lateral y se conectan cuando necesite imprimir el código corto.

¿No seguir? No te culpes, no siempre soy bueno para explicar ideas, así que aquí hay un ejemplo en forma de código ...

Primero, dentro de su barra lateral donde desea que aparezca el contenido de código corto, agregue algo como ...

<?php do_action( 'special_shortcode_content' ); ?>

Ahora tenemos una acción en la que podemos enganchar cuando se establece una bandera.

A continuación, necesitamos escanear las publicaciones, antes de que ocurra el bucle, verifique la existencia de un código corto en particular, usaré [sc] Según su ejemplo y podemos hacerlo conectando the_posts. En lugar de usar un global, prefiero envolver el código en una clase y definir una variable de clase dentro de la clase para actuar como el indicador.

class Page_Shortcode_to_Sidebar {
    private $has_shortcode = false;
    public function __construct() {
        if( is_admin() )
            return;

        add_action( 'the_posts', array( $this, 'check_for_shortcode' ) );
        add_filter( 'the_content', array( $this, 'remove_shortcode' ), 1 ); 
    }
    public function check_for_shortcode( $posts ) {
        if( empty( $posts ) )
            return $posts;

        if( !is_page() )
            return $posts;

        foreach( $posts as $post ) {
            if( !stripos( $post->post_content, '[sc]' ) )
                continue;
            $this->has_shortcode = true;
        }
        return $posts;
    }
    public function remove_shortcode( $content ) {

        if( !$this->has_shortcode )
            return $content;

        $content = str_replace( '[sc]', '', $content );
        add_action( 'special_shortcode_content', array( $this, 'do_shortcode' ) );

        return $content;
    }
    public function do_shortcode() {
        ?>
        <li><?php do_shortcode('[sc]'); ?></li>
        <?php
    }
}

$Page_Shortcode_to_Sidebar = new Page_Shortcode_to_Sidebar;

Entonces, básicamente, lo que sucede es esto ...

  1. La devolución de llamada en the_posts Comprueba cada publicación para el código corto, si se encuentra establece el indicador.
  2. La devolución de llamada en the_content se ejecuta más tarde y verifica si el indicador está configurado.
  3. Si el indicador está configurado, el código corto se elimina del contenido y agrega una acción a nuestra acción de barra lateral personalizada.
  4. Devuelve el contenido, menos el código corto específico.
  5. La acción de la barra lateral ocurre y se produce el contenido de código corto.

Si se refiere a su propio código corto que creó, y se usa de esta manera.

[sc]something[/sc]

... entonces necesitarás algo más inteligente para quitar el contenido de los códigos cortos del contenido de la publicación.

Si no se usa así, lo que he proporcionado anteriormente debería hacer el trabajo bien.

Espero que ayude.. :)

Licenciado bajo: CC-BY-SA con atribución
scroll top