Der Shortcode wird immer oben auf der Seite angezeigt

15

Ich benutze einen Shortcode, um verschiedene Loops über die loops-name.php einzulesen. Aus irgendeinem Grund steht es immer oben auf der Seite. Ich habe es gegoogelt und die Verwendung von Echo anstelle von Return verursacht dieses Problem, aber mit meinem Code verwende ich kein Echo. Hier ist der Shortcode:

// setup the shortcode for use
function friendly_loop_shortcode( $atts, $content = null ) {
extract( shortcode_atts( array(
'category' => '',
'module' => ''
), $atts ) );

include(locate_template('loop-'.$module.'.php'));
 }

Irgendeine Idee, warum das passiert?

John Joe
quelle
Shortcode zum Einfügen einer Datei? Ich finde es etwas seltsam.
Rutwick Gangurde
1
'mit meinem code verwende ich kein echo' - geben die loop-module.php dateien das echo wieder oder senden sie ihre ausgabe zurück?
Michael
Im Moment nicht - in die Datei ist nur ein Absatz-Tag mit "test" geschrieben, damit ich sehen kann, wie es funktioniert.
John Joe
verwenden get_template_part('loop',$module)Stattdessen ist es schöner, schneller geben, unterstützt Eltern / Kind - Themen, und es ist die empfohlene Methode von Vorlagen in Wordpress einschließlich (ja locate_template können einige dieser Dinge tun , sondern sehen , wie viel weniger lesbar ist!)
Tom J Nowell

Antworten:

16

Sie können die Ausgabe wie folgt puffern:

ob_start();
include(locate_template('loop-'.$module.'.php'));
return ob_get_clean();

BEARBEITEN. Ich habe es versucht, habe gut funktioniert.

function friendly_loop_shortcode( $atts, $content = null ) {
     extract( shortcode_atts( array(
         'category' => '',
         'module' => ''
     ), $atts ) );

     ob_start();
     include(locate_template('loop-'.$module.'.php'));
     $output = ob_get_clean();
     //print $output; // debug
     return $output;
}

if (!is_admin()) {
     add_shortcode('test', 'friendly_loop_shortcode' );
}
offroff
quelle
4
Verwenden Sie die Ausgabepufferung nicht, wenn es andere Möglichkeiten gibt.
fuxia
Ich fürchte, das hat nicht funktioniert.
John Joe
was schief gelaufen ist? Ich habe versucht, die Antwort zu aktualisieren
offroff
8

Ihre enthaltene Datei enthält im Wesentlichen HTML-Echo. Zum Beispiel

<?php
 //Some PHP
 echo 'test';
 //Some more PHP
 ?>

Ist das gleiche wie

<?php
 //Some PHP 
 ?>
 test
<?php
 //Some more PHP
 ?>

Beide werden sofort gedruckt und nicht zurückgesandt. Seit dem Ausdruck erscheint es vor dem Seiteninhalt. Sie müssen zurückkehren , etwas für sich im Inhalt enthalten sein.

Wie @RutwickGangurde betonte, ist es ungewöhnlich, eine Vorlagendatei in einen Shortcode aufzunehmen.

Stephen Harris
quelle
1
Danke, das wusste ich nicht. Also muss ich das Ganze in eine Variable schreiben und zurückgeben? Bezüglich des Einbindens einer Vorlagendatei - nun, ich möchte es den Benutzern des Themas so einfach wie möglich machen, das Thema anzupassen, und eine riesige Shortcode-Datei, die vom Stammverzeichnis des Themas verschachtelt ist, ist nicht wirklich ideal für sie.
John Joe
Siehe @ offroffs Antwort - das sollte funktionieren
Stephen Harris
1
" Nun, ich möchte es den Benutzern des Themas so einfach wie möglich machen, das Thema anzupassen. " - Wie viele Abstraktionsebenen sind erforderlich? Sie haben eine benutzerdefinierte Vorlagendatei in einem Shortcode. Ich verstehe nicht, wie das den Benutzern die Sache leichter macht. Wenn Sie die Möglichkeit bieten möchten, allen Posts statischen Inhalt hinzuzufügen, definieren Sie einfach ein dynamic_sidebar()Element in der Schleife und lassen Sie die Benutzer Widgets hinzufügen.
Chip Bennett
Die meisten Benutzer von Themes werden es nicht schätzen, eine riesige Shortcode-Datei durchsuchen zu müssen, um eine einfache CSS-Klasse im Frontend zu ändern. Wenn ich alles mit dem Standardsystem loop-name.php aufteile, ist es für sie viel schneller, das zu finden, was sie brauchen. Nicht ideal, aber ich muss sie glücklich machen;)
John Joe
Sehr gut erklärt;
DR.Somar