Shortcode Ausgabe

  • Moin,

    kann mir jemand helfen, wie ich kontrollieren kann, an welcher Stelle die Shortcode-Ausgabe genau erfolgt?

    So weit ich weiß, löst man das, indem man die ganze Ausgabe, die eine Shortcode Funktion machen soll, in eine String Variable packt und am Ende mit return ausgibt. Bei mir wäre das aber mit etwas Arbeit verbunden, da ich über 300 Zeilen Code in einen String verpacken müsste. Hier mal ein kurzer Umriss des Ablaufs:

    - in einem Textwidget möchte ich den Shortcode etwa folgendermaßen verwenden:

    Code
    Beliebiger Text
    <div>...google adsense code...</div>
    noch ein Textabsatz
    [shortcode]

    - dazu steht in der functions.php folgendes:

    PHP
    function shortcodefunction(){
    include ($_SERVER['DOCUMENT_ROOT']."/wp-content/plugins/ads/adswidget.php");
    }
    
    
    add_shortcode('shortcode', 'shortcodefunction');

    - in der adswidget.php steht schließlich alles, was ausgegeben werden soll. Etwa 300 Zeilen html, etwa 100 Zeilen php

    ...Wordpess spuckt aber leider alles was zum Shortcode gehört gleich am Anfang des Widgetbereichs aus, statt da wo ich das Shortcode Tag verwende.

    Gibt es eine einfachere Lösung, als die Ausgabe der adswidget.php in einen String zu verpacken?

    • Anzeige

    Hallo!

    Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.

    • ✔️ Schnelle Ladezeiten (optimiert für WordPress & Co.)
    • ✔️ Deutsche Server & DSGVO-konform
    • ✔️ Persönlicher Support (kein 0815-Ticket-System)

    Mehr erfahren

  • Klasse, mit den Funktionen ist ja das zwischenspeichern schnell gemacht. Hab es jetzt so gelöst:

    PHP
    function shortcodefunction($atts){
    ob_start();
    include ($_SERVER['DOCUMENT_ROOT']."/wp-content/plugins/ads/adswidget.php");
    ob_end_clean();
    return $ausgabe;}

    Und in der adswidget.php alles mit

    PHP
    ob_start();
    ...
    $ausgabe = ob_get_flush();

    umschließen.

    Dankeschön!

  • Das ist aber nicht sehr konsequent.
    Solch ein Code sollte besser zusammenhängend auf einer Seite stehen und nicht ein Teil hier und der andere Teil dort.

    PHP
    ob_start();
    include ($_SERVER['DOCUMENT_ROOT']."/wp-content/plugins/ads/adswidget.php");
    //$ausgabe = ob_get_contents();
    //ob_end_clean();
    $ausgabe = ob_get_flush();  // ob_get_flush war doch ob_get_contents und ob_end_clean in Einem?
    return übersetzte_die_bbcodes($ausgabe);


    Oder der Code kommt zusammen in die andere PHP.

    Einmal editiert, zuletzt von himitsu (10. Dezember 2014 um 16:54)

  • himitsu
    Genau so hatte ich es auch erst versucht. Das Ergebnis war, das die Ausgabe zwei mal erfolgt ist. D.h. alles in der adswigdet.php wurde direkt ausgegeben. Trotzdem wurde nach dem include nochmal alles mittels ob_get_flush() gespeichert.

    Wenn ich ob_start() und ob_get_flush() nur in der der adswidget.php verwende, passiert genau dasselbe. Ich dachte mir deshalb, ob_start() wirkt vielleicht nicht scriptübergreifend. Also habe ich es in beiden Sripten eingebaut. In der functions.php habe ich den Ausgabepuffer dann mit ob_end_clean() beendet, da ich ja nicht noch eine Variable befüllen muss.

    Ich hoffe, ich hab mich halbwegs verständlich ausgedrückt :) ...wenn man für die adswidget.php ein einfaches einzeiliges Sript (echo "Test"; )einsetzt, kann man meinen Fall übrigens leicht rekonstruieren. Falls es jemand selbst ausprobieren will. Den Shortcode kann man dann statt in einem Textwidget natürlich auch in jedem Post unterbringen / ausgeben lassen.

  • Hmm ... nja, hauptsache es geht.

    Viele Plugins fangen ebenfalls über diese Outputhandler (ob_start usw.) die Ausgaben ab und jagen sie z.B. nochmal durch irgendwelche Behandlungen (BBCodes, HTML-Tag-Analysen usw.), bevor sie das dann selber ausgeben.
    Eventuell kommt dein Code ja mit irgendwas davon in Konflikt? :confused:

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!