Shortcode toujours affiché en haut de la page

15

J'utilise un shortcode pour extraire différentes boucles via le loops-name.php. Pour une raison quelconque, il est toujours en haut de la page. Je l'ai googlé et utiliser echo au lieu de return provoque ce problème mais avec mon code, je n'utilise pas echo. Voici le 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'));
 }

Une idée pourquoi cela se produit?

John Joe
la source
Shortcode pour inclure un fichier? Je trouve ça un peu bizarre.
Rutwick Gangurde
1
'avec mon code, je n'utilise pas echo' - les fichiers loop-module.php font-ils écho ou retournent-ils leur sortie?
Michael
Pas pour le moment - le fichier a juste une balise de paragraphe avec "test" écrit pour que je puisse voir comment cela fonctionne.
john joe
utilisez à la get_template_part('loop',$module)place, il est plus joli, plus rapide à taper, prend en charge les thèmes parent / enfant, et c'est la méthode recommandée pour inclure des modèles dans wordpress (oui Locate_template peut faire certaines de ces choses mais regardez combien il est moins lisible!)
Tom J Nowell
duplication possible du résultat d'un shortcode AVANT le contenu de la page
Chip Bennett

Réponses:

16

Vous pouvez tamponner la sortie comme ceci:

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

ÉDITER. J'ai essayé, j'ai bien fonctionné.

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
la source
4
N'utilisez pas la mise en mémoire tampon de sortie s'il existe d'autres moyens.
fuxia
Je crains que cela n'ait pas fonctionné.
john joe
Qu'est ce qui ne s'est pas bien passé? J'ai essayé et mis à jour la réponse
offroff
8

Votre fichier inclus fait essentiellement écho au HTML. Par exemple

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

Est le même que

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

Les deux sont imprimés immédiatement plutôt que retournés. Depuis son impression, il apparaît avant le contenu de la page. Vous devez retourner quelque chose pour qu'il soit inclus dans le contenu.

Comme l'a souligné @RutwickGangurde - il est inhabituel d'inclure un fichier modèle dans un shortcode.

Stephen Harris
la source
1
Merci, je ne le savais pas. Je dois donc mettre le tout dans une variable et le renvoyer? En ce qui concerne l'inclusion d'un fichier de modèle - eh bien, je veux que les utilisateurs du thème puissent le personnaliser aussi facilement que possible et avoir un énorme fichier de shortcode imbriqué loin du répertoire racine du thème n'est pas vraiment idéal pour eux.
john joe
Voir la réponse de @offroff - ça devrait marcher
Stephen Harris
1
" eh bien, je veux que les utilisateurs du thème puissent le personnaliser aussi facilement que possible " - Combien de couches d'abstraction sont nécessaires? Vous avez un fichier de modèle personnalisé à l'intérieur d'un shortcode. Je ne vois pas comment cela rend les choses plus faciles pour les utilisateurs. Si vous souhaitez offrir la possibilité d'ajouter du contenu statique à toutes les publications, définissez simplement un dynamic_sidebar()dans la boucle et laissez les utilisateurs ajouter des widgets.
Chip Bennett
La plupart des utilisateurs du thème n'apprécieront pas d'avoir à parcourir un fichier de shortcode massif pour changer une simple classe CSS sur le frontend. Si je décompose tout en utilisant le système standard loop-name.php, il est beaucoup plus rapide pour eux de trouver ce dont ils ont besoin. Pas idéal mais je dois les garder heureux;)
john joe
Très bien expliqué;
DR.Somar