自动将php函数插入POST$the_content

时间:2015-12-20 作者:730wavy

我正在尝试在我的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 个回复
SO网友:jgraup

使用shortcodes 在内容区域内添加php功能。或ob_start()ob_get_clean() 捕获输出并附加到$content 你回来了。


The"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;
}
如果您只想在内容中插入内容,请使用str_replace 在$post上。

$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);

SO网友:birgire

我肯定你想用the_content 过滤器,而不是default_content 过滤器(已被@jgraup提及),因为如果生成的HTML发生更改,会发生什么情况?然后你就被困在你的内容里了。最好动态添加它。这里有一个建议:

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的答案),因为我假设你不想把它添加到你网站的每个内容部分。

您也不需要两次检查同一类是否存在。

注意,这有一个很大的假设,即echo 属性;-)

相关推荐

Generating a perfect loop

所以我现在已经在这里坐了大约三个小时了,我不得不让这件事过去几个小时来好好睡一觉,同时我希望能得到你的帮助。我已经能够使用$wpdb->get\\u results从数据库中获取内容,并且能够将它们放入一个数组中,但是我想使用这些信息在循环中运行一个新的查询,以获取列表中的多个项目。我使用了本指南的一个变体https://stackoverflow.com/questions/45848249/woocommerce-get-all-orders-for-a-product 获取订单ID。现在,我已