常にページの上部に表示されるショートコード


15

ショートコードを使用して、loops-name.phpを介してさまざまなループを取り込みます。何らかの理由で、常にページの上部にあります。私はそれをグーグルで調べて、リターンの代わりにエコーを使用するとその問題が発生しますが、私のコードではエコーを使用していません。ショートコードは次のとおりです。

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

なぜこれが起こっているのか考えていますか?


ファイルを含めるためのショートコード?私はそれを少し奇妙に感じます。
ラトウィックガンガード

1
「私のコードではエコーを使用していません」-loop-module.phpファイルは出力をエコーまたは返していますか?
マイケル

現時点ではありません-ファイルには「test」が記述された段落タグが付いているだけなので、動作を確認できます。
ジョンジョー

get_template_part('loop',$module)代わりに使用してください、それはきれいで、入力が速く、親/子テーマをサポートし、WordPressにテンプレートを含める推奨方法です(yes Locate_templateはそれらのいくつかを行うかもしれませんが、どれほど読みにくいかを見てください!)
Tom J Nowell

回答:


16

次のように出力をバッファリングできます。

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

編集。私はこれを試しましたが、うまくいきました。

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

8

含まれるファイルは、基本的にHTMLのエコーです。例えば

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

と同じです

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

両方とも返されるのではなく、すぐに印刷されます。印刷されているため、ページコンテンツの前に表示されます。コンテンツに含めるには何かを返す必要があります。

@RutwickGangurdeが指摘したように、テンプレートファイルをショートコードに含めるのは珍しいことです。


1
おかげで、私はそれを知りませんでした。だから私はすべてを変数に入れて返す必要がありますか?テンプレートファイルのインクルードに関しては、テーマユーザーがテーマをカスタマイズしやすくするために、ルートテーマディレクトリから巨大なショートコードファイルをネストするのは理想的ではありません。
ジョンジョー

offroffの答え@を参照してください-動作するはずですその
スティーブン・ハリス

1
まあ、テーマのユーザーがテーマをカスタマイズできる限り簡単にしたい」-抽象化レイヤーがいくつ必要なのか?ショートコード内にカスタムテンプレートファイルがあります。私はそれがユーザーにとって物事をより簡単にする方法を見ていません。すべての投稿に静的コンテンツを追加する機能を提供する場合はdynamic_sidebar()、ループ内を定義し、ユーザーがウィジェットを追加できるようにします。
チップベネット

ほとんどのテーマユーザーは、フロントエンドの単純なcssクラスを変更するために大規模なショートコードファイルを探し回る必要があることに感謝しません。標準のloop-name.phpシステムを使用してすべてを分割すると、必要なものを見つけるのがはるかに速くなります。理想的ではありませんが、私は彼らを幸せに保つ必要があります;)
ジョンジョー

非常によく説明されています。
DR。ソマー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.