9

ユーザーがテキストの段落を入力できるようにする必要があるページがあります。次に、そのテキストの後に、投稿のリストをレンダリングするショートコードを挿入し、その後に自由形式のテキストを追加します。私の考えでは、投稿を出力するショートコードを挿入できるはずです。このようにして、投稿を表示したい場所にショートコードを追加するだけです。

私は現在、独自のファイルで区切られた投稿を取得するロジックを持っています。現在、get_template_part()関数を使用するだけでページに含めています。

get_template_part('donation', 'posts');

ショートコードの作成方法を調べ、ショートコードfunctions.phpを作成するために次のコードをファイルに含めました。

add_shortcode('donation-posts', 'fnDonatePosts');   
function fnDonatePosts($attr, $content)
{
    get_template_part('donation', 'posts');    
}

が適切に実行され、投稿が表示されますdonation-posts.phpが、ショートコードが配置された場所ではなく、常にコンテンツの前に配置されます。

関数を削除して、get_template_part()テキストを出力するだけで問題なく動作しました。したがって、get_template_part()これが正しい方法ではない可能性があることは理解していますが、私がやろうとしていることを実行する方法を見つけることができませんでした (方法があると確信しています...見つかりませんでした)。

私が試してみました:

include(get_template_directory(). '/donation-posts.php');
include_once(get_template_directory(). '/donation-posts.php') : 

しかし、インクルードされたファイルの PHP コードにヒットすると、これらは処理を停止しました。

私も試しました:

$file = file_get_contents(get_template_directory(). '/donation-posts.php');  
        return $file;

ただし、これは (関数名が示すように) ファイルの内容のみを返します。つまり、投稿を返すために PHP スクリプトを実行しません。

以前にこれをやった人はいますか?

4

4 に答える 4

20

get_template_partこれを試してみてください。基本的に のように反応するため、問題が解決する可能性があります。PHP's require返されませんが、呼び出された場所でコンテンツがすぐにエコーされます。

add_shortcode('donation-posts', 'fnDonatePosts');   
function fnDonatePosts($attr, $content)
{        
    ob_start();  
    get_template_part('donation', 'posts');  
    $ret = ob_get_contents();  
    ob_end_clean();  
    return $ret;    
}
于 2012-09-07T21:25:24.237 に答える
10

これは、テンプレートへのパスを渡すことができる、より動的なバージョンです。

function template_part( $atts, $content = null ){
   $tp_atts = shortcode_atts(array( 
      'path' =>  null,
   ), $atts);         
   ob_start();  
   get_template_part($tp_atts['path']);  
   $ret = ob_get_contents();  
   ob_end_clean();  
   return $ret;    
}
add_shortcode('template_part', 'template_part');  

そしてショートコード:

[template_part path="includes/social-sharing"]
于 2015-02-12T12:44:50.823 に答える
1

functions.php で get_template_part() を使用すると、うまくいきませんでした。代わりに、ob_start と clean 内で locate_template() を使用しました。例えば:

function full_petition_shortcode( $attr ) {
    ob_start();
    locate_template( 'petition.php', TRUE, TRUE );

    return ob_get_clean();
}
add_shortcode( 'full-petition', 'full_petition_shortcode' );
于 2015-11-28T16:19:17.357 に答える
1

受け入れられた回答の最小バージョン:

function my_template_part_shortcode() {
    ob_start();
    get_template_part( 'my_template' );
    return ob_get_clean();
}
add_shortcode( 'my_template_part', 'my_template_part_shortcode' );

my-template.php含めたいファイルはどこにありますか。

于 2015-11-01T22:54:48.537 に答える