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?


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

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


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.