2015-09-17 40 views
6

Niedawno zdałem sobie sprawę, że nie używam widżetów w WordPress wystarczająco dużo podczas tworzenia pasków bocznych w motywach, więc spędziłem ostatnie kilka dni badając, jak prawidłowo je rozwijać. Po przejrzeniu wielu samouczków znalazłem wiele z nich na niestandardowych widgetach budynków, które mają być nieaktualne. I widział, gdzie należy użyć konstrukt:Instancje aktualizacji widgetów Wordpress dla elementów wymagających znaczników

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 jest bardzo minimalne, jeśli chodzi o niestandardowych widgetów. Po przejrzeniu tagów SO i nie widziałem rozwiązania podczas wywoływania aktualizacji dla widżetu, jeśli obszar tekstowy wymaga tagów. Duża liczba ludzi pokaż wywołaniu instancji tytułowy jako:

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

W mojej funkcji form() mam potrzeby textarea, który zaprowadzi kodu wejściowego użytkownika, jak skopiowane reklamy Google Adsense. Następujące prace, ale jestem pewien, czy istnieje lepsze podejście do przyjmowania danych z formularza:

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

Czy istnieje lepszy sposób na powrót $instance kiedy trzeba tagów bez używania PHP strip_tags()?

Odpowiedz

0

Używam następujący kod niesamowite fragment zarejestrowania widżet niestandardowe który bierze żadnej 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

Czy istnieje lepszy sposób na powrót $instance kiedy trzeba tagów bez używania PHP strip_tags()?

Tak! WordPress ma wiele sposobów sprawdzania poprawności i odkażania danych użytkownika.

Dla Twojego przypadku wp_kses_post() powinien działać bardzo dobrze.

Jego opis: Sanitize zawartość dla dozwolonych znaczników HTML dla treści postów.

Używa domyślnej listy dozwolonych tagów, którą można znaleźć w wp-includes/kses.php.

Jeśli chcesz zezwolić tylko na określone znaczniki, najbezpieczniejszym sposobem jest użycie wp_kses() zamiast wp_kses_post().

Różnica polega na tym, że wp_kses() wymaga drugiego parametru dla $allowed_html zamiast korzystania z globalnej zmiennej $allowedposttags.

Istnieją sposoby na filtrowanie lub zastępowanie globalnej zmiennej $allowedposttags, ale prawdopodobnie nie jest to najlepszy pomysł w tym przypadku, ponieważ będą one wpływać na inny kod HTML, np. Treść postu, oprócz widgetu.

funkcja aktualizacji

Ci wp_kses_post() będzie wyglądać następująco:

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