Wordpress小部件更新需要标签的项目的实例

时间:2015-09-17 00:46:21

标签: php widget adsense wordpress

最近我意识到在开发主题侧边栏时我没有充分利用WordPress中的小部件,所以我花了最后几天研究如何正确开发它们。在查看了很多教程之后,我发现其中一些在自定义构建小部件上已经过时了。我确实看到了应该使用构造的地方:

function __construct() {
    parent::__construct(
    // Base ID of your widget
    'foobar_widget', 
    // Widget name will appear in UI
    __('Give them foo Widget', 'foobar_widget_domain'), 
    // Widget description
    array( 'description' => __( 'Development widget for testing', 'foobar_widget_domain' ), ) 
    );
}

对于自定义小部件,codex非常小。在浏览了SO的标签之后,如果textarea需要标签,我在调用小部件的更新时没有看到解决方案。很多人表示将标题实例称为:

$instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';

在我的函数form()中,我需要一个带有用户输入代码的文本区域,例如复制的Google Adsense广告。以下是有效的,但我不确定是否有更好的方法来接受表单中的输入:

// Updating widget replacing old instances with new
public function update( $new_instance, $old_instance ) {
    $instance = array();
    $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
    $instance['foo1'] = $new_instance['foo1'];
    return $instance;
    }
}

当您需要使用不使用PHP $instance的代码时,是否有更好的方法可以返回strip_tags()

2 个答案:

答案 0 :(得分:0)

我使用以下精彩的代码片段来注册一个带有任何HTML的自定义小部件

add_action('widgets_init', create_function('', 'register_widget("clean_markup_widget");'));
class Clean_Markup_Widget extends WP_Widget {
    function __construct() {
        parent::WP_Widget('clean_markup_widget', 'ASR Custom Text Widget', array('description'=>'Simple widget for well-formatted markup & text'));
    }
    function widget($args, $instance) {
        extract($args);
        $markup = $instance['markup'];
        //echo $before_widget;
        if ($markup) echo $markup;
        //echo $after_widget;
    }
    function update($new_instance, $old_instance) {
        $instance = $old_instance;
        $instance['markup'] = $new_instance['markup'];
        return $instance;
    }
    function form($instance) {
        if ($instance) $markup = esc_attr($instance['markup']);
        else $markup = __('<p>Clean, well-formatted markup.</p>', 'markup_widget'); ?>
        <p>
            <label for="<?php echo $this->get_field_id('markup'); ?>"><?php _e('Markup/text'); ?></label><br />
            <textarea class="widefat" id="<?php echo $this->get_field_id('markup'); ?>" name="<?php echo $this->get_field_name('markup'); ?>" type="text" rows="16" cols="20" value="<?php echo $markup; ?>"><?php echo $markup; ?></textarea>
        </p>
<?php }
}

答案 1 :(得分:0)

  

当您需要使用不使用PHP $instance的代码时,是否有更好的方法可以返回strip_tags()

是的! WordPress有许多方法可以验证和清理用户数据。

对于你的案例,wp_kses_post()应该可以很好地运作。

它的描述是:为发布内容的允许HTML标签清理内容。

它使用允许标记的默认列表,您可以在wp-includes/kses.php中找到它。

如果您希望仅允许特定代码,最安全的方法是使用wp_kses()代替wp_kses_post()

区别在于wp_kses()需要$allowed_html的第二个参数,而不是使用$allowedposttags全局变量。

有一些方法可以过滤或覆盖$allowedposttags全局变量,但在这种情况下可能不是最好的主意,因为除了小部件之外,它们还会影响其他HTML,例如发布内容。

您使用wp_kses_post()更新功能将如下所示:

// Updating widget replacing old instances with new
public function update( $new_instance, $old_instance ) {
    $instance = array();
    $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
    $instance['foo1'] = wp_kses_post( $new_instance['foo1'] );
    return $instance;
}