Bonsoir à tous,
Lors du visionnage du tuto de Grafikart concernant les options de WordPress j'ai vu qu'il n'utilisais pas l'API dédié aux options, je vous donne rapidement l'utilisation d'une class qu'on trouve [url=http://alisothegeek.com/2011/01/wordpress-settings-api-tutorial-1/]ici[/url]
Vous n'avez pas à vous soucier de la sécurité, de la mise en page, etc, l'API se charge de tout.
Voici un exemple d'utilisation assez basique de la classe. (Bien sûr il est possible de ne pas utiliser cette classe et de passer directement par le [url=http://codex.wordpress.org/Settings_API]codex de WordPress[/url] mais on gagne beaucoup de temps avec cette classe, commencez par vous familiariser avec l'API sans la classe et par la suite vous comprendrez mieux le rôle de la classe.
La page est accessible via Réglages > WP Options
En base de donnée les options utiliserons qu'une seule entrée dans la table (id, clé, value). value sera sérialisé, WordPress recommande d'utiliser les options sérialisé lorsque vous devez stocker beaucoup d'options. Ça permet d'alléger la table au lieu d'avoir 20 lignes pour pas grand chose.
On commence par l'initialisation, créer un dossier options dans le dossier du thème avec un fichier init.php et wp-setting.php dans celui ci.
Dans le fichier functions.php ajouter cette ligne au début :
[code]
require 'options/init.php';
[/code]
init.php
[code]
<?php
class WPThemeInit {
private $options = array();
public function __construct() {
add_action( 'admin_menu', array( &$this, 'add_menu' ) );
$this->options = get_option( '_wp_my_option' );
}
public function add_menu() {
require 'wp-setting.php';
$setting = new WPSetting( $this->options );
add_options_page( __( 'WP Options', 'wp-options' ), __( 'WP options', 'wp-options' ), 'manage_options', 'wp-options', array( $setting, 'wp_option_page' ) );
}
}
$myoptions = new WPThemeInit;
[/code]
wp-setting.php
[code]
<?php
class WPSetting {
private $settings = array();
public function __construct($options) {
$this->options = $options;
register_setting( '_wp_my_option', '_wp_my_option' );
add_settings_section( 'general', 'General', array( &$this , 'general_section_callback' ), 'wp-options' );
// Get the configuration of fields
$this->get_settings();
// Generate fields
foreach ( $this->settings as $id => $setting ) {
$setting['id'] = $id;
$this->create_settings( $setting );
}
}
// Initialisation des options
public function get_settings() {
$this->settings['checkbox_one'] = array(
'section' => 'general',
'title' => __( "Une checkbox", 'wp-options' ),
'type' => 'checkbox',
'desc' => __( "Texte de description", 'wp-options' ),
);
$this->settings['select_one'] = array(
'section' => 'general',
'title' => __( "Select", 'wp-options' ),
'type' => 'select',
'desc' => __( "Texte de description", 'wp-options' ),
'choices' => array(
'id' => 'ID',
'name' => 'Nom'
)
);
$this->settings['checkbox_two'] = array(
'section' => 'general',
'title' => __( "Checkbox2", 'wp-options' ),
'type' => 'checkbox',
'desc' => __( "Texte de description", 'wp-options' ),
);
$this->settings['select_two'] = array(
'section' => 'general',
'title' => __( "Select2", 'wp-options' ),
'type' => 'select',
'desc' => __( "Texte de description", 'wp-options' ),
'choices' => array(
'toto' => 'toto.it',
'tata' => 'tata.com',
'titi' => 'titi.com'
)
);
$this->settings['textbox'] = array(
'section' => 'general',
'title' => __( "Text1", 'wp-options' ),
'type' => 'text',
'desc' => __( "Texte de description", 'wp-options' )
);
}
// On crée les champs
function create_settings( $args = array() ) {
extract( $args );
$options = get_option( '_wp_my_option' );
$field_args = array(
'type' => $type,
'id' => $id,
'desc' => $desc,
'label_for' => $id,
'std' => $std,
'choices' => $choices
);
add_settings_field( $id, $title, array( $this, 'display_settings' ), 'wp-options', $section, $field_args );
}
// Gestion du type du champ (select, text, checkbox, etc)
public function display_settings( $args = array() ) {
extract( $args );
$options = $this->options;
if ( ! isset( $options[$id] ) && 'type' != 'checkbox' )
$options[$id] = $std;
elseif ( ! isset( $options[$id] ) )
$options[$id] = 0;
switch ( $type ) {
case 'checkbox':
echo '<input class="checkbox' . $field_class . '" type="checkbox" id="' . $id . '" name="_wp_my_option[' . $id . ']" value="1" ' . checked( $options[$id], 1, false ) . ' /> <label for="' . $id . '">' . $desc . '</label>';
break;
case 'select':
echo '<select class="select' . $field_class . '" name="_wp_my_option[' . $id . ']">';
foreach ( $choices as $value => $label )
echo '<option value="' . esc_attr( $value ) . '"' . selected( $options[$id], $value, false ) . '>' . $label . '</option>';
echo '</select>';
if ( $desc != '' )
echo '<br /><span class="description">' . $desc . '</span>';
break;
case 'text':
default:
echo '<input class="regular-text' . $field_class . '" type="text" id="' . $id . '" name="_wp_my_option[' . $id . ']" value="' . esc_attr( $options[$id] ) . '" />';
if ( $desc != '' )
echo '<br /><span class="description">' . $desc . '</span>';
break;
}
}
// Description de la section général
function general_section_callback() {
echo '<p>Options général.</p>';
}
// Méthode appelé depuis la class WPThemeInit (création de la vue pour notre page d'options)
public function wp_option_page() {
?>
<div class="wrap">
<?php screen_icon(); ?> <h2><?php _e( "WP Options", 'wp-options' ) ?></h2>
<form action="options.php" method="post">
<?php settings_fields( '_wp_my_option' ); ?>
<?php do_settings_sections( 'wp-options' ); ?>
<?php submit_button(); ?>
</form>
</div>
<?php
}
}
[/code]
Personnellement quand je fais un plugin qui a des options j'utilise cette classe :). Il y a sans doute moyen d'améliorer et de l'optimiser mais pour comprendre c'est un bon début, d'ailleurs c'est le même code que sur l'adresse que j'ai donnée en haut, juste modifié ce que j'ai besoin et retiré ce que je n'ai pas besoin ;). C'est une bonne ressource quand on veut gérer les options.
Si vous voulez gérer des données autre que des options (une table pour votre plugin par exemple) il faut utiliser l'objet $wpdb pour gérer vos requête et utiliser les nonce pour sécuriser votre formulaire.
N'hésitez pas améliorer la classe pour gérer par exemple tous les types de champs, etc ;)