it-swarm.com.de

Post-Shortcode-Inhalt in der Seitenleiste anzeigen?

Ich muss abhängig von einer 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 gewohnt zu haben (mit allen erforderlichen Shortcodes) und dann am Ende des Seiteninhalts einen Shortcode mit allen Informationen, die in der Seitenleiste für diese Seite angezeigt werden müssen.


Ursprüngliche Frage: Kurzwahlnummern selektiv anzeigen (im Hauptinhalt unterdrücken und stattdessen in einer Seitenleiste anzeigen)

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

Beispielsweise wird in einem Seiteninhalt ein bestimmter Shortcode (nennen wir ihn [sc]) angegeben. Wenn ich nun den Inhalt dieser Seite anzeige, möchte ich diesen speziellen [sc]-Shortcode unterdrücken, sondern ihn stattdessen in der Seitenleiste für diese Seite anzeigen. Der Inhalt einer Seite enthält andere Shortcodes. Ich möchte nur den spezifischen [sc]-Shortcode selektiv anzeigen und andere wie gewohnt verarbeiten - d. H. Andere Shortcodes werden im Inhalt der Seite verarbeitet.

Ist das möglich zu tun? Und wie?

1
dashaluna

Ein Shortcode-Handler muss nichts zurückgeben, sondern kann nur eine globale Variable ändern, die Sie später in Ihrem Seitenleisten-Widget lesen. Wenn Ihre Seitenleiste nach Ihrem Beitragsinhalt angezeigt wird (am wahrscheinlichsten, wenn es sich um eine rechte Seitenleiste handelt), können Sie dies problemlos tun. Wenn Ihre Seitenleiste vor dem Inhalt des Beitrags angezeigt wird, ist dies komplizierter: Sie müssen die Ausgabepufferung starten, wenn Ihr Widget aufgerufen wird, warten, bis der Rest der Seite angezeigt wird, und dann etwas mit dem Shortcode-Inhalt tun und den Ausgabepuffer leeren.

Ein einfacher "Proof of Concept", der den Shortcode-Inhalt nicht in der Veröffentlichung, 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'] );
}
0
Jan Fabry

Ich habe meine Lösung auf Jan Fabry's Antwort basiert. Ich habe keine Widgets, sondern einfache Vorlagendateien.

Also, was ich getan habe, ist das Folgende:

  1. Gibt alle Informationen an, die in der Seitenleiste innerhalb des Inhalts einer Seite in [sidebar_content] shortcode eingeschlossen sein müssen.

  2. Spezifiziert die folgende Funktion in der functions.php. Dies erweitert den gesamten Inhalt von [sidebar_content], zeigt jedoch nichts an, sondern speichert ihn 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. Im sidebar.php. Ich habe folgenden Code:

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

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 diesen Shortcode stattdessen selbst geschrieben haben, können Sie eine Funktion erstellen, um ihm einen Anzeigeparameter zuzuweisen, z. B. [shortcode('page=5, 6, 7', 'category', 'exclude=posts', 'whatever')]

0
Wyck

Sie können dies basierend auf einem benutzerdefinierten Feld tun, beispielsweise ein benutzerdefiniertes Feld mit dem Namen sc_no_show erstellen und ihm den Wert true zuweisen. 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 haben Sie auf jeder Seite oder jedem Beitrag ein benutzerdefiniertes Feld mit dem Namen sc_no_show mit dem Wert true, das nicht angezeigt wird /

0
Bainternet

Sie können einige gut platzierte Aktionen verwenden, um nach Ihrem Shortcode zu suchen. Wenn festgestellt wird, dass ein Flag gesetzt ist, führen Sie zusätzliche Aktionen aus, um zuerst den Inhalt dieses Shortcodes zu entfernen, und dann eine sekundäre Aktion, um diesen Shortcode in der Seitenleiste auszuführen. Darüber hinaus können Sie in der Sidebar-Datei eine eigene einfache Aktion erstellen und diese aktivieren, wenn Sie den Shortcode ausdrucken müssen.

Nicht folgend? Beschuldige dich nicht, ich bin nicht immer gut darin, Ideen zu erklären. Hier ist ein Beispiel in Code-Form.

Fügen Sie zunächst in Ihrer Seitenleiste, in der der Shortcode-Inhalt angezeigt werden soll, Folgendes hinzu:.

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

Wir haben jetzt eine Aktion, die wir verfolgen können, wenn eine Flagge gesetzt wird.

Als nächstes müssen wir die Posts scannen, bevor die Schleife auftritt. Überprüfen Sie, ob ein bestimmter Shortcode vorhanden ist. Ich verwende [sc] gemäß Ihrem Beispiel, und wir können dies tun, indem wir uns an the_posts einhängen. Anstatt ein globales zu verwenden, ziehe ich es vor, den Code einfach in eine Klasse zu packen und eine Klassenvariable innerhalb der Klasse zu definieren, die als Flag fungiert.

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, was passiert, ist das ..

  1. Der Rückruf bei the_posts prüft jeden Beitrag auf die Kurzwahl, wenn gefunden, setzt er das Flag.
  2. Der Rückruf für the_content wird später ausgeführt und überprüft, ob das Flag gesetzt ist.
  3. Wenn das Flag gesetzt ist, wird der Shortcode aus dem Inhalt entfernt und der benutzerdefinierten Seitenleistenaktion eine Aktion hinzugefügt.
  4. Es gibt den Inhalt abzüglich des spezifischen Shortcodes zurück.
  5. Die Sidebar-Aktion wird ausgeführt und der Shortcode-Inhalt wird erstellt.

Wenn Sie auf Ihren eigenen Shortcode verweisen, den Sie erstellt haben, und er auf diese Weise verwendet wird.

[sc]something[/sc]

..dann brauchen Sie etwas Klügeres, um den Shortcode-Inhalt vom Beitragsinhalt zu entfernen.

Wenn es nicht so verwendet wird, sollte das, was ich oben bereitgestellt habe, den Job gut machen.

Hoffentlich hilft das.. :)

0
t31os