Frage

Ich muss je nach Seite Bilder und andere Inhalte in der Seitenleiste anzeigen. Seiten werden dynamisch hinzugefügt und Informationen, die in der Seitenleiste angezeigt werden müssen, sind für jede Seite unterschiedlich. Ich kann also nicht vorhersagen, was wohin gehen wird. Die Idee war also, den Inhalt einer Seite wie üblich zu haben (mit allen teuer Shortcodes) und am Ende des Seiteninhalts einen Shortcode mit allen Informationen haben, die in der Seitenleiste für diese Seite angezeigt werden müssen.


Originalfrage: Selektiv anzeigen (im Hauptinhalt unterdrücken und stattdessen in einer Seitenleiste angezeigt werden)

Ich habe mich gefragt, ob es möglich ist, Shortcodes "selektiv" anzuzeigen.

Nennen wir es beispielsweise ein bestimmter Shortcode [sc], wird in einem Seiteninhalt angegeben. Wenn ich nun den Inhalt dieser Seite anzeige [sc] ShortCode, aber stattdessen aus der Seitenleiste für diese Seite anzeigen. Der Inhalt einer Seite verfügt über andere Shortcodes. Ich möchte nur selektiv das spezifische anzeigen [sc] Shortcode und verarbeiten Sie andere wie gewohnt - dh andere Shortcodes werden in dem Inhalt der Seite verarbeitet.

Ist das möglich? Und wie?

War es hilfreich?

Lösung

Ein Shortcode -Handler muss nichts zurückgeben, er kann nur eine globale Variable ändern, die Sie später in Ihrem Seitenleisten -Widget lesen. Wenn Ihre Seitenleiste nach Ihrem Postinhalt angezeigt wird (höchstwahrscheinlich, wenn es sich um eine rechte Seitenleiste handelt), können Sie dies ohne Probleme tun. Wenn Ihre Seitenleiste vor dem Postinhalt angezeigt wird, ist es komplizierter: Sie müssen die Ausgabepufferung mit dem Aufrufen Ihres Widgets beginnen, warten Sie, bis der Rest der Seite angezeigt wird, und tun Sie dann etwas mit dem Shortcode -Inhalt und spülen Sie den Ausgangspuffer.

Ein einfacher "Proof of Concept", der den Shortcode -Inhalt nicht im Beitrag, sondern in der Fußzeile anzeigt:

$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'] );
}

Andere Tipps

Ich habe meine Lösung auf Jan Fabry's Antworten. Ich habe keine Widgets, aber einfache Vorlagendateien.

Also, was ich getan habe, ist Folgendes:

  1. Spezifikierte alle Informationen, die in der Seitenleiste in dem Inhalt einer Seite selbst angezeigt werden müssen, um eingewickelt [sidebar_content] Shortcode.

  2. Spezifische die folgende Funktion in den Funktionen.php. Dies erweitert den gesamten Inhalt von [sidebar_content], aber nichts anzeigt, sondern spart es in der globalen Variablen.

    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. In dem sidebar.php. Ich habe den folgenden Code:

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

Sie können bedingte Tags und do_shortcode verwenden.http://codex.wordpress.org/function_reference/do_shortcode
http://codex.wordpress.org/conditional_tags

Ein einfaches Beispiel für eine einzelne Seite mit einer ID von 12.

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

Wenn Sie stattdessen diesen Shortcode selbst geschrieben haben, können Sie eine Funktion erstellen, um ihm einen Anzeigeparameter zu geben, wie [shortcode('page=5, 6, 7', 'category', 'exclude=posts', 'whatever')]

Sie können es basierend auf einem benutzerdefinierten Feld tun, z. B. erstellen Sie ein benutzerdefiniertes Feld mit dem Namen sc_no_show und geben Sie ihm den Wert von True. Dann machen Sie in Ihrer Shortcode -Funktion so etwas:

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
}

Jetzt auf jeder Seite oder jedem Beitrag haben Sie eine benutzerdefinierte Felder benannt sc_no_show mit dem Wert von true es wird nicht zeigen/

Sie können ein paar gut platzierte Aktionen verwenden, um nach vorne nach Ihrem Shortcode zu schauen. Wenn festgestellt wurde, dass ein Flag festgelegt ist und zusätzliche Aktionen ausführen, um den Inhalt dieses Shortcode zu entfernen, und dann eine sekundäre Ausführung dieser Shortcode in der Seitenleiste. Neben all dem, was eine einfache Aktion in der Sidebar -Datei erzeugt und sich darauf anschließt, wenn Sie den Shortcode ausdrucken müssen.

Nicht folgend? Beschuldigen Sie nicht, ich bin nicht immer gut darin, Ideen zu erklären. Hier ist ein Beispiel in Codeform.

Zuerst in Ihrer Seitenleiste, in der Sie den Shortcode -Inhalt erscheint, fügen Sie so etwas wie .. hinzu.

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

Wir haben jetzt eine Aktion, an die wir uns anschließen können, wenn eine Flagge gesetzt wird.

Als nächstes müssen wir die Beiträge scannen, bevor die Schleife auftritt, nach der Existenz eines bestimmten Shortcode [sc] Laut Ihrem Beispiel können wir das tun, indem wir uns an einversammelt haben the_posts. Anstatt ein globales zu verwenden, bevorzuge ich den Code einfach in eine Klasse und definiere eine Klassenvariable innerhalb der Klasse, um als Flagge zu fungieren.

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;

Also im Grunde ist das, was passiert.

  1. Der Rückruf weiter the_posts Überprüft jeden Beitrag auf den Shortcode, falls gefunden wird das Flag.
  2. Der Rückruf weiter the_content führt später ausgeführt und überprüft, ob das Flag eingestellt ist.
  3. Wenn das Flag eingestellt ist, wird der Shortcode aus dem Inhalt entfernt und fügt eine Aktion zu unserer benutzerdefinierten Sidebar -Aktion hinzu.
  4. Es gibt den Inhalt zurück, abzüglich des spezifischen Shortcode.
  5. Die Seitenleistenaktion erfolgt und der Shortcode -Inhalt wird erstellt.

Wenn Sie sich auf Ihren eigenen Shortcode beziehen, den Sie erstellt haben und es auf diese Weise verwendet wird.

[sc]something[/sc]

.. Dann werden Sie etwas schlauer benötigen, um den Shortcode -Inhalt aus dem Postinhalt zu entfernen.

Wenn es nicht so verwendet wird, sollte das, was ich oben angegeben habe, die Arbeit gut ausführen.

Ich hoffe, das hilft.. :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit wordpress.stackexchange
scroll top