web-dev-qa-db-ja.com

自動的にphp関数をpost $ the_contentに挿入します

私は私のCPTのためにすべての投稿に自動的に2つのphp関数を挿入しようとしています。私が抱えている問題は、たとえテキストを追加する方法を見つけたとしても、php関数を追加する方法が私が持っているコードで引き起こすのかわからないということです。

これが私の関数ファイルにあるものです---

    add_filter( 'default_content', 'my_editor_content', 10, 2 );

    function my_editor_content( $content, $post ) {

        switch( $post->post_type ) {
            case 'property':
 $content = "<div>";
                $content . "<?php if ( class_exists( 'MRP_Multi_Rating_API' ) ) {
        MRP_Multi_Rating_API::display_rating_result( array(
                'rating_item_ids' => 2,
                'show_count' => false,
                'result_type' => 'value_rt',
    'no_rating_results_text' => 'Not Rated'
        ) ); } ?><?php if ( class_exists( 'MRP_Multi_Rating_API' ) ) {
        MRP_Multi_Rating_API::display_rating_result( array(
                'rating_item_ids' => 5,
                'show_count' => false,
                'result_type' => 'overall_rt',
    'no_rating_results_text' => 'Not Rated'
        ) );
    } ?>";
 $content = "</div>";
            break;
            default:
                $content = "your default content";
            break;
        }

        return $content;
    }

私の関数が機能するようにこれをどのように修正すればい​​いですか。そして、作成した新しい投稿だけでなく、すべての投稿に追加することは可能ですか?

ありがとう

2
Rich

コンテンツ領域内にphp機能を追加するには、 ショートコード を使用します。または、 ob_start() および ob_get_clean() を使用して出力を取得し、あなたが戻ってきている $ content に追加してください。


"the_content" フィルタは、投稿がデータベースから取得されてから画面に出力されるまでの間に、その投稿のコンテンツをフィルタ処理するために使用されます。

add_filter( 'the_content', 'my_the_content_filter', 20 );

function my_the_content_filter($content) {

    $post = $GLOBALS['post'];

    ob_start();

    switch($post->post_type) {
        case 'property':
            if(class_exists('MRP_Multi_Rating_API')) {
                MRP_Multi_Rating_API::display_rating_result(array(
                                                                'rating_item_ids'        => 2,
                                                                'show_count'             => false,
                                                                'result_type'            => 'value_rt',
                                                                'no_rating_results_text' => 'Not Rated',
                                                            ));

                MRP_Multi_Rating_API::display_rating_result(array(
                                                                'rating_item_ids'        => 5,
                                                                'show_count'             => false,
                                                                'result_type'            => 'overall_rt',
                                                                'no_rating_results_text' => 'Not Rated',
                                                            ));
            }
            break;
    }

    $extra = ob_get_clean();

    if( ! empty($extra)) {
        return "<div>" . $content . $extra . "</div>";
    }

    return $content;
}

コンテンツにコンテンツを挿入するだけの場合は、$ postに str_replace を使用します。

$post = get_post(37);

// Update post 37
$my_post = array(
    'ID'           => $post->ID,
    'post_content' => str_replace('round hole', 'square peg' . ' round hole', $post->post_content),
);

// Update the post into the database
wp_update_post($my_post);
1
jgraup

生成されたHTMLが変更された場合はどうなるのでしょうか。the_contentフィルタの代わりにdefault_contentフィルタ(@jgraupで既に言及されています)を使用したいと思います。それからあなたはあなたのコンテンツにそれで立ち往生しています。動的に追加することをお勧めします。これは1つの提案です:

add_filter( 'the_content', function( $content)
{
    if( ! in_the_loop() )
        return $content;

    if( 'property' !== get_post_type() )
        return $content;

    $args = [
        'rating_item_ids'           =>  2,
        'show_count'                => false,
        'result_type'               => 'value_rt',
        'no_rating_results_text'    => 'Not Rated',
        'echo'                      => 0,
    ];

    if ( class_exists( 'MRP_Multi_Rating_API' ) ) 
    {
        $content .= MRP_Multi_Rating_API::display_rating_result( $args ); 

        // Modify arguments for the second run
        $args['rating_item_ids'] = 5;
        $args['result_type']     = 'overall_rt';

        $content .= MRP_Multi_Rating_API::display_rating_result( $args ); 
    }

    return $content;
} );

in_the_loop チェック(ここでは@PieterGoosenによる質問と@gmazzapによる回答にリンクしています)を使用していることに注意してください。これをあなたのサイトのすべてのコンテンツ部分に追加したいです。

同じクラスが存在するため、2回チェックする必要もありません。

これは一つの大きな仮定、すなわちecho属性を持っていることに注意してください;-)

1
birgire