2015-09-17 12 views
6

Recentemente mi sono reso conto che non utilizzo i widget in WordPress abbastanza durante lo sviluppo di barre laterali nei temi, quindi ho passato gli ultimi due giorni a cercare come svilupparli correttamente. Dopo aver esaminato un sacco di tutorial, ho trovato alcuni di loro sui widget di costruzione personalizzati per essere obsoleti. Ho visto dove dovrei usare il costrutto:Wordpress aggiorna le istanze per gli articoli che necessitano di tag

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

Il codex è molto minimale quando si tratta di widget personalizzati. Dopo aver sfogliato i tag di SO e non ho visto una soluzione quando si chiama un aggiornamento per il widget se una textarea ha bisogno di tag. Un gran numero di persone mostrano chiamare l'istanza titolo come:

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

Nella mia funzione form() Sto dovendo una textarea che prenderà il codice input dell'utente, come un annuncio di Google Adsense copiato. I seguenti lavori, ma non sono sicuro se v'è un approccio migliore ad accettare l'ingresso dalla forma:

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

Esiste un modo migliore per restituire il $instance quando hai bisogno di tag senza l'utilizzo di PHP di strip_tags()?

risposta

0

Io uso seguente frammento di codice impressionante di registrare un widget personalizzato che prende qualsiasi 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

C'è un modo migliore per restituire il $instance quando hai bisogno di tag senza l'utilizzo di PHP di strip_tags()?

Sì! WordPress ha molti modi per convalidare e disinfettare i dati degli utenti.

Per il tuo caso wp_kses_post() dovrebbe funzionare molto bene.

La descrizione è: Disinfetta il contenuto per i tag HTML consentiti per il contenuto del post.

Utilizza un elenco predefinito di tag consentiti, che è possibile trovare in wp-includes/kses.php.

Se si desidera consentire solo tag specifici, il modo più sicuro per farlo è utilizzando wp_kses() anziché wp_kses_post().

La differenza è che wp_kses() richiede un secondo parametro per $allowed_html invece di utilizzare la variabile globale $allowedposttags.

Ci sono modi per filtrare o sovrascrivere la variabile globale $allowedposttags ma probabilmente non è la migliore idea in questo caso poiché avranno effetti su altri HTML, come i contenuti dei post, oltre al widget.

funzione di aggiornamento

È con wp_kses_post() sarebbe simile a questa:

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