在主页上插入自定义PHP脚本

时间:2015-03-23 作者:user69485

我有一个简单的PHP脚本,每当有人登陆主页时,我都想加载它。它从另一个服务获取数据,然后我必须将其显示在主页上的容器中。

我正在研究如何在Wordpress提供的HTML框中启用PHP代码的选项。

我发现了几个插件,它们声称能够在HTML框/文本框中解析和执行PHP脚本。然而,他们都没有为我工作。我试过了PHP Code Widget 最后,我注意到我的PHP代码以某种方式自动转换为HTML注释。请参见下面的示例--

激活插件后,我在HTML框的文本视图(我也尝试了可视化视图)中输入了这个。

<?php
echo "Hello World!";
?>
然而,页面上没有显示任何内容。当我做一个inspect元素时,它显示了如下内容——

<div class="htmlbox-content">
       <!--?php
          echo "Hello world!";
       ?--> 
</div>
它自动将PHP代码的开头括号转换为HTML注释。我试着内联编辑它,但是每当我删除“-”,它们就会再次出现,也就是说,它不允许我修改它们。

我不能百分之百肯定我是否做对了。然而,在我执行的步骤中,我没有发现任何错误。如何修复此问题?

此外,我知道在HTML/textbox中启用PHP代码并不是一个很好的解决方案。然而,我找不到任何东西可以告诉我如何才能实现同样的目标。如果您有任何其他教程/指导,我们将不胜感激!

Some details:

我使用的是网络支持的Wordpress 3.9.2

我尝试只为网站启用,也尝试通过网络启用。两种情况下的结果相同。

该插件与版本2.8及更高版本兼容,并支持uptil 4.0.1,因此应该可以理想地工作。我还尝试了其他插件,它们支持的内容有不同的变化,但它们似乎都不起作用。

2 个回复
SO网友:Pieter Goosen

正如您所言,在文本框中运行可执行PHP不是一个好主意。这不仅不是一个好主意,而且是一个糟糕的主意。这在您的安全性中创建了一个循环漏洞,很容易被黑客利用。

我建议您为这个功能编写自己的自定义小部件。在索引顶部添加自定义侧栏非常简单。php的特定用途,您只需将自定义小部件放入其中即可。看看register_sidebar(). 关于如何在主题中添加自定义侧栏,还有很多关于这个特定主题的教程

至于小部件,请查看Widget API. 我(在@birgire;-)的帮助下)也做了recent widget which displays categories 您可以将其用作小部件的基础。您只需将所选服务中的自定义代码编码到widget 方法您可以使其非常动态。

这是您可以使用的基本骨架。要使其正常工作,只需更换// ADD YOUR CUSTOM PHP CODE HERE FOR EXECUTION TO DISPLAY ON FRONT END 使用您的自定义php代码widget() 方法(注意:需要PHP 5.4+)

class Custom_Services extends WP_Widget 
{

    public function __construct() 
    {
        parent::__construct(
            \'widget_custom_service\', 
            _x( \'Custom Service Widget\', \'Custom Service Widget\' ), 
            [ \'description\' => __( \'Displays information from a custom service.\' ) ] 
        );
        $this->alt_option_name = \'widget_custom_service\';

        add_action( \'save_post\', [$this, \'flush_widget_cache\'] );
        add_action( \'deleted_post\', [$this, \'flush_widget_cache\'] );
        add_action( \'switch_theme\', [$this, \'flush_widget_cache\'] );
    }

    public function widget( $args, $instance ) 
    {
        $cache = [];
        if ( ! $this->is_preview() ) {
            $cache = wp_cache_get( \'widget_services\', \'widget\' );
        }

        if ( ! is_array( $cache ) ) {
            $cache = [];
        }

        if ( ! isset( $args[\'widget_id\'] ) ) {
            $args[\'widget_id\'] = $this->id;
        }

        if ( isset( $cache[ $args[\'widget_id\'] ] ) ) {
            echo $cache[ $args[\'widget_id\'] ];
            return;
        }

        ob_start();

        $title          = ( ! empty( $instance[\'title\'] ) ) ? $instance[\'title\'] : __( \'Category Posts\' );
        /** This filter is documented in wp-includes/default-widgets.php */
        $title          = apply_filters( \'widget_title\', $title, $instance, $this->id_base );

        // ADD YOUR CUSTOM PHP CODE HERE FOR EXECUTION TO DISPLAY ON FRONT END

        echo $args[\'after_widget\']; 

        if ( ! $this->is_preview() ) {
            $cache[ $args[\'widget_id\'] ] = ob_get_flush();
            wp_cache_set( \'widget_services\', $cache, \'widget\' );
        } else {
            ob_end_flush();
        }
    }

    public function update( $new_instance, $old_instance ) 
    {
        $instance                   = $old_instance;
        $instance[\'title\']          = strip_tags( $new_instance[\'title\'] );
        $this->flush_widget_cache();

        $alloptions = wp_cache_get( \'alloptions\', \'options\' );
        if ( isset($alloptions[\'widget_custom_service\']) )
            delete_option(\'widget_custom_service\');

        return $instance;
    }

    public function flush_widget_cache() 
    {
        wp_cache_delete(\'widget_services\', \'widget\');
    }

    public function form( $instance ) 
    {

        $title      = isset( $instance[\'title\'] ) ? esc_attr( $instance[\'title\'] ) : \'\';
        ?>

        <p>
            <label for="<?php echo $this->get_field_id( \'title\' ); ?>"><?php _e( \'Title:\' ); ?></label>
            <input class="widefat" id="<?php echo $this->get_field_id( \'title\' ); ?>" name="<?php echo $this->get_field_name( \'title\' ); ?>" type="text" value="<?php echo $title; ?>" />
        </p>

    <?php
    }

}

add_action( \'widgets_init\', function () 
{
    register_widget( \'Custom_Services\' );
});

SO网友:Gabriel

这个PHP Code Widget 不修改文本或可视化编辑器框,或标准“文本”小部件;它添加了一个“PHP代码”小部件,您可以在外观>小部件>可用小部件下找到它。

如果要在帖子或页面的正文中显示脚本,应创建Shortcode. API中的基本示例适用于“Hello World”;您可以将此添加到主题functions.php (或者最好创建一个插件):

function foobar_func( $atts ){
    return "Hello World";
}
add_shortcode( \'foobar\', \'foobar_func\' );
然后在您的帖子或页面中,键入[foobar] 显示脚本的快捷代码。为自定义PHP脚本添加代码,然后return 要显示的最终输出(您不想echo 来自shortcode函数)。

或者,即使您切换主题,在插件中创建短代码也会使其保持可用:

<?php
/**
 * Plugin Name: wpse-182025
 * Description: Creates [wpse-182025] shortcode to execute custom PHP script on posts, pages, etc
 * Plugin URI: http://wordpress.stackexchange.com/a/182026/54569
 * Version: 1.0
 */

function wpse_182025_func() {
    // Add your custom PHP script
    $output = "Hello World";
    return $output;
}
add_shortcode( \'wpse-182025\', \'wpse_182025_func\' );
?>
将上述代码添加到/wp-content/plugins/wpse-182025/wpse-182025.php, 或创建/wpse-182025/wpse-182025.php 本地文件夹和文件,添加到zip文件,并使用插件>添加新内容>上载进行上载。使用显示快捷码[wpse-182025]. 您可以根据需要修改任何示例插件代码。

结束