• 解決済 jmzkw

    (@jmzkw)


    こんにちは。
    WordPressでサイト制作をしています。

    functions.phpに書いたカスタムコードの結果を固定ページに表示させるべく、固定ページの指定の場所にショートコードを埋め込んだのですが、ページをプレビューすると、ショートコードが任意の場所に表示されず、固定ページの本文のトップに表示されてしまいます。

    固定ページの記載例は下記のようなイメージです。
    下記のように記載しても、<h1>タグよりもトップにショートコードから呼び出したプログラムの結果が表示されてしまいます。
    これを固定ページに記載した任意の場所に表示させる方法はありますか?
    もしくは、ショートコードを使って別の方法で任意の場所に表示させる手段があれば教えてください。

    宜しくお願いいたします。

    ■固定ページ本文の記載例)
    ※get_programがショートコードの呼び出し名

    <h1>タイトル</h1>
    <p>ああああああああああああ</p>
    <p>[get_program]</p>

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • モデレーター jim912

    (@jim912)

    jmzkwさん

    ショートコードで呼び出す関数で出力してしまっていませんか?
    ショートコードは、wp_contentのフィルターを通る際に、出力したいコードに置き換わる仕組みなので、出力してしまうとフィルターを通った際に出力してしまい、本文の上部に表示されてしまいます。

    ショートコードで呼び出す場合は、return でHTMLのソースコードを返すようにしてください。

    ショートコードAPI

    トピック投稿者 jmzkw

    (@jmzkw)

    jim912さん

    早速の回答ありがとうございます。

    >ショートコードで呼び出す場合は、return でHTMLのソースコードを返すようにしてください。
    素人質問で誠に恐れ入りますが、例えば、呼び出した関数がリスト形式(

      )でforeach文で必要な数だけループさせる処理の場合はどのようにreturnすれば良いのでしょうか?

    モデレーター jim912

    (@jim912)

    jmzkwさん

    $html = '';
    foreach (  ) {
    $html .= 'ループ内で表示させるHTMLのソース';
    }
    return $html;

    みたいな感じです。

    トピック投稿者 jmzkw

    (@jmzkw)

    jim912さん

    返信遅くなってすみません。
    ご指摘の内容で実現することができました!
    ありがとうございました!

    トピック投稿者 jmzkw

    (@jmzkw)

    jim912さん

    度々すみません、ショートコードの先にある関数で、
    locate_template( array( ‘外部ファイル’ ), true );
    という処理を入れた場合、変数に入れてもHTMLが先頭に出力されてしまいます。

    locate_templateで外部処理をする部分についてHTMLのソースを返すような方法はありますでしょうか?

    モデレーター jim912

    (@jim912)

    jmzkwさん

    PHPの出力制御関数を使うと対応できます。出力制御関数は、通常ブラウザに出力される内容を溜めておき、値として取得したり、出力を遅延させたりなどが可能です。

    具体的には、ob_start でバッファリングを開始し、ob_get_clean でバッファ内容の取得とバッファの停止を行います。

    ob_start();
    locate_template( array( '外部ファイル' ), true );
    $html .= ob_get_clean();
    トピック投稿者 jmzkw

    (@jmzkw)

    jim912さん

    返信遅くなってすみません。
    改めてご指摘いただいた方法で実装することができました!

    ご丁寧にご説明いただき誠にありがとうございました。

    jim912さん

    大変助かりました!
    魔法みたいです!

    MAC

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「ショートコードの表示位置について」には新たに返信することはできません。