2015-09-17 8 views
6

Kürzlich erkannte ich, dass ich Widgets in WordPress nicht genug verwenden, wenn Sidebars in Themen zu entwickeln, so habe ich die letzten paar Tage erforscht, wie man sie richtig entwickelt. Nachdem ich eine Menge Tutorials gelesen habe, habe ich festgestellt, dass eine Reihe von ihnen auf Widgets für benutzerdefinierte Gebäude veraltet ist. Ich habe, wo ich das Konstrukt verwenden sollte:Wordpress-Widget Update-Instanzen für Elemente, die Tags benötigen

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'),) 
    ); 
} 

Die codex ist sehr gering, wenn es um eigene Widgets kommt. Nach dem Durchsuchen der SO-Tags und habe ich keine Lösung gefunden, wenn ich ein Update für das Widget aufgerufen habe, wenn ein Textbereich Tags benötigt. Eine große Anzahl von Menschen zu zeigen, den Aufruf des Titel Instanz als:

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

In meiner Funktion form() ich eine Textarea bin, um die Benutzereingaben Code nehmen, wie eine kopierte Google Adsense Anzeige. Die folgenden Werke, aber ich bin nicht sicher, ob es ein besserer Ansatz wird von dem Formular zu akzeptieren:

// 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; 
    } 
} 

Gibt es einen besseren Weg, um die $instance zurückzukehren, wenn Sie Tags benötigen, ohne strip_tags() PHP zu verwenden?

Antwort

0

Ich verwende folgende ehrfürchtige Code-Snippet ein eigenes Widget, das eine beliebige 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 } 
} 
0

Gibt es eine bessere Art und Weise strip_tags() die $instance zurückzukehren, wenn Sie Tags müssen ohne Verwendung von PHP nimmt registrieren?

Ja! WordPress bietet viele Möglichkeiten, Benutzerdaten zu validieren und zu bereinigen.

Für Ihren Fall wp_kses_post() sollte sehr gut funktionieren.

Seine Beschreibung ist: Sanitize Inhalt für erlaubte HTML-Tags für Post-Inhalt.

Es verwendet eine Standardliste der zulässigen Tags, die Sie in wp-includes/kses.php finden können. Wenn Sie nur bestimmte Tags zulassen möchten, verwenden Sie am besten wp_kses() anstatt wp_kses_post().

Der Unterschied ist, dass wp_kses() einen zweiten Parameter für $allowed_html erfordert, anstatt die globale Variable $allowedposttags zu verwenden.

Es gibt Möglichkeiten, die globale Variable $allowedposttags zu filtern oder zu überschreiben, aber wahrscheinlich nicht die beste Idee in diesem Fall, da sie neben Ihrem Widget auch andere HTML-Inhalte wie Post-Inhalt beeinflussen.

Sie Update-Funktion mit wp_kses_post() würde wie folgt aussehen:

// 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; 
}