Création d’un thème enfant

Exemple avec twentytwelve :
Créer un répertoire twentytwelve-child au même niveau que twentytwelve (directement dans /wp-content/themes/ donc), puis y créer style.css :

/*
Theme Name:     Twenty Twelve Child
Theme URI:      http://example.com/
Description:    Child theme for the Twenty Twelve theme
Author:         Your name here
Author URI:     http://example.com/about/
Template:       twentytwelve
Version:        0.1.0
*/

/* Inclusion de la feuille de style du thème parent si besoin : */
@import url("../twentytwelve/style.css"); 

Les seuls champs requis sont :

  • « Theme Name »
  • « Template » qui est le nom du répertoire du thème parent

http://codex.wordpress.org/Child_Themes

Entête d’un plugin

/*
Plugin Name: Name Of The Plugin
Plugin URI: http://URI_Of_Page_Describing_Plugin_and_Updates
Description: A brief description of the Plugin.
Version: The Plugin's Version Number, e.g.: 1.0
Author: Name Of The Plugin Author
Author URI: http://URI_Of_The_Plugin_Author
License: A "Slug" license name e.g. GPL2
*/

https://codex.wordpress.org/Writing_a_Plugin

Traitements à l’installation / désinstallation d’un plugin

class produits{
	
	public static function hooks(){
		register_activation_hook(__FILE__, array(__CLASS__,'activate'));
		register_deactivation_hook( __FILE__, array(__CLASS__, 'deactivate' ) );
		register_uninstall_hook( __FILE__, array(__CLASS__, 'uninstall' ) );
	}

	public static function activate(){	

	}
	
	public static function deactivate(){		

	}
	
	public static function uninstall(){
		//The uninstall hook will be called when the user clicks on the uninstall
		//link that calls for the plugin to uninstall itself. 
		//The link won't be active unless the plugin hooks into the action.
	}
}

produits::hooks();

http://codex.wordpress.org/Function_Reference/register_activation_hook
http://codex.wordpress.org/Function_Reference/register_deactivation_hook
http://codex.wordpress.org/Function_Reference/register_uninstall_hook

Création d’un shortcode

<?php

class my_shortcode{

	public static function hooks(){
		add_shortcode('shortcode_name', array(__CLASS__,'shortcode_handler'));
	}
	
	public static function shortcode_handler( $atts, $content = '' ) {
		global $post;
		
		$html = '';
		
		extract( shortcode_atts( array(
			'arg1' => 'default value 1',
			'arg2' => '',
		), $atts ) );
		
		$content = trim($content);
		
		$html = "Something". $content ."something else.";
				
		return $html;
	}
	
}

my_shortcode::hooks();

Ajout d’un panel Back Office avec enregistrement d’options

<?php

class my_panel{

	const option_id = 'my_panel_option_id';
	
	public static function hooks(){
		
		if ( is_admin() ){
			add_action('admin_menu', array(__CLASS__,'add_settings_panels'));
		}
		
	}
	
	public static function add_settings_panels(){
		
		add_menu_page(
        		__('Mes options'), 
        		__('Mes options'), 
        		'manage_options', 
        		'my_settings_panel', 
       			array(__CLASS__,'settings_panel')
        	);
	
	}
	
	public static function settings_panel(){
		$result = self::handle_posted_settings();
		$options = self::get_options();
		?>
		<div class="wrap">
		
			<h1>Mes options</h1>
			
			<?php if ( !empty( $result['message'] ) ): ?>
				<div class="<?php echo $result['type'] ?>" ><p><?php echo $result['message'] ?></p></div>
			<?php endif ?>

			<form method="post" action="<?php echo add_query_arg(array()) ?>">
				<table class="form-table">
				    <tr valign="top">
				        <th scope="row">Setting 1</th>
				        <td><input type="text" name="setting_1" value="<?php echo $options['setting_1'] ?>" /></td>
				    </tr>
				    <tr valign="top">
				        <th scope="row">Setting 2</th>
				        <td><input type="text" name="setting_2" value="<?php echo $options['setting_2'] ?>" /></td>
				    </tr>
				</table>
				
				<?php wp_nonce_field('my_panel_save_settings') ?>
				
				<input type="submit" class="button button-primary" value="Enregistrer" />
				
			</form>
			
		</div>
		<?php 
	}
	
	
	protected static function handle_posted_settings(){

		$result = array(
			'message' => '',
			'type' => 'updated'
		);

		if( isset($_POST['setting_1']) && check_admin_referer('my_panel_save_settings') ){
			$options = self::get_options();

			if( !empty($_POST['setting_1']) ){
				$options['setting_1'] = $_POST['setting_1']; //format/sanitize posted data!
			}
			
			if( !empty($_POST['setting_2']) ){
				$options['setting_2'] = $_POST['setting_2']; //format/sanitize posted data!
			}
			
			self::save_options($options);

			$result['message'] = "Options enregistrées";
		}

		return $result;
	}
	
	protected static function save_options($options){
		if ( get_option( self::option_id ) !== false ) {
			update_option( self::option_id, $options );
		} else {
			add_option( self::option_id, $options, '', 'no' );
		}
	}
	
	public static function get_options(){
		$options = get_option( self::option_id );
		$options = wp_parse_args(
			$options,
			array(
				'setting_1'=>'Default for setting 1',
				'setting_2'=>'Default for setting 2'
			)
		);
		return $options;
	}
	
}

my_panel::hooks();

Création d’un panel Back Office

class my_module_with_bo_panel{
	
	public static function hooks(){
		if ( is_admin() ){
			add_action('admin_menu',array(__CLASS__,'add_settings_panels'));
		}
	}

	public static function add_settings_panels(){
		
		add_menu_page(
			__('Params'), 
			__('Params'), 
			'manage_options', 
			'my_settings_panel', 
			array(__CLASS__,'settings_panel')
		);

		add_submenu_page(
			'my_settings_panel',
			__('Params 1'), 
			__('Params 1'),
			'manage_options',
			'my_settings_panel',
			array(__CLASS__,'settings_panel_1')
		); 

		add_submenu_page(
			'my_settings_panel',
			__('Params 2'), 
			__('Params 2'),
			'manage_options',
			'my_settings_panel_2',
			array(__CLASS__,'settings_panel_2')
		); 
	}

	public static function settings_panel(){
	}
	
	public static function settings_panel_1(){
		?>
		<div class="wrap">
			<h2>Params 1</h2>
			<form method="post" action="<?php echo add_query_arg(array()) ?>"> 
				<?php //... ?>
				<?php submit_button() ?>
			</form>
		</div>
		<?php
	}

	public static function settings_panel_2(){
		?>
		<div class="wrap">
			<h2>Params 2</h2>
			<?php //... ?>
		</div>
		<?php 
	}
}

my_module_with_bo_panel::hooks();

Hook « request » : éviter la requète par défaut

Lorsqu’on n’a pas besoin de la requète par défaut de WordPress et qu’elle est significativement coûteuse en ressources :

class produits{

	public static function hooks(){
		add_filter('request', array(__CLASS__,'request'));
	}

	public static function request($request){

		if( !empty($request['la_query_var_à_tester']) ){
			//We could use an "anonymous function" here (only PHP>5.3)
			if( !function_exists('empty_posts_request') ){
				function empty_posts_request($request){
					remove_filter('posts_request',empty_posts_request);
					return ''; 
				}
			}
			add_filter('posts_request',empty_posts_request);
		}

		return $request;
	}
}

produits::hooks();

Ajout de règles de réécritures

class produits{

	public static function hooks(){
		add_action('init', array(__CLASS__,'rewrite_rules'));
		add_action('template_redirect',array(__CLASS__,'template_redirect'));

		register_activation_hook( __FILE__, array( __CLASS__, 'on_activation' ) );
		register_deactivation_hook( __FILE__, array( __CLASS__, 'on_deactivation' ) );
	}

	public static function rewrite_rules() {

		add_rewrite_tag('%is_produit%','([01])');
		add_rewrite_tag('%produit_type%','([^&]+)');

		add_rewrite_rule('^produit-type/(.*?)/?$','index.php?is_produit=1&produit_type=$matches[1]','top');

	}

	public static function template_redirect(){
		global $wp_query;
		
		if( isset($wp_query->query_vars['is_produit']) && $wp_query->query_vars['is_produit'] == 1 ){
			if( $wp_query->query_vars['produit_type'] == 'le-bon-type' ){
				load_template(...);
				exit;
			}
		}
	}

	public static function on_activation() {
		self::rewrite_rules();
		flush_rewrite_rules();
	}
	
	public static function on_deactivation() {
		flush_rewrite_rules();
	}
}

produits::hooks();

Wordrpress met les règles de réécritures en cache, il faut donc faire une flush de ce cache après avoir ajouté des règles de réécritures.

Attention!
Ne pas faire un flush des règles de réécriture systématique en appelant flush_rewrite_rules() ou $wp_rewrite->flush_rules() à chaque exécution!

Appeler flush_rewrite_rules() à l’activation d’un plugin ou manuellement via le back office « Réglages » > « Permaliens » > cliquer sur « Enregistrer les modifications », comme expliqué là : Function_Reference/flush_rewrite_rules et là Rewrite_API/flush_rules.

http://codex.wordpress.org/Rewrite_API/add_rewrite_tag
http://codex.wordpress.org/Rewrite_API/add_rewrite_rule