Skip to content

Instantly share code, notes, and snippets.

@rccc
Last active January 15, 2016 09:06
Show Gist options
  • Select an option

  • Save rccc/11ba50e4adf90d33556a to your computer and use it in GitHub Desktop.

Select an option

Save rccc/11ba50e4adf90d33556a to your computer and use it in GitHub Desktop.

L'API de personnalisation permets de se connecter au moteur de Wordpress afin de modifier les fonctionnalités de base, ou ajouter de nouvelles fonctionnalités.

Notion de "Hook"

Le mot "hook" peut être traduit par "crochet" ou "hameçon". Les "hooks" sont une notion essentiel de l'API de personnalisation ( Plugin API ).

Les "hooks" sont des évenements déclenchés à un moment donné durant l'execution de l'application. On peut écouter ces évenements, et définir le code personnalisé qui sera executé au moment ou cet évenement sera déclenché par l'application.

Actions et filtres

Wordpress distingue deux types de "hooks", les actions et les filtres.

Les filtres concernent la modification le contenu textuel et retourne donc un valeur modifiée. Les actions ne retournent pas de valeur, le code personnalisé est executé, mais l'action de retourne rien par elle même.

Implementation

Prenons le bout de code suivant et imaginons qu'il est executé par Wordpress au moment ou un article est sauvegardé en base de donnée :

function wp_publish_post( $post ) {
  //...  
  do_action( 'wp_insert_post', $post->ID, $post, true );
}

C'est l'appel à la function do_action qui permets de déclencher l'évenement nommé "wp_insert_post". On peut alors executer du code à ce moement précis en récupérant les variables fournies en paramètres de do_action :

//dans functions.php
function email_post_author( $post_id, $post, $update ) {
  $email = '[email protected]';
  $subject = 'New Post Published';
  $message = 'A new post was published : ' . get_permalink( $post->ID );
  wp_mail( $email, $subject, $message );
}
//on écoute l'évenement "wp_insert_post"
add_action( 'wp_insert_post', 'email_post_author', 10, 3 );

add_actions() accepte 4 paramètres :

  • le nom du "hook"
  • le nom de la foncction a executé au déclenchement de l'évenement
  • l'ordre d'execution de cette fonction si d'autres sont connectées à ce "hook"
  • le nombre de paramètres acceptés par cette fonction

Exemples d'actions

Remplacer la version de jQuery utilisée par défaut

function add_scripts() {
    wp_deregister_script( 'jquery' );
    wp_register_script( 'jquery', 'https://code.jquery.com/jquery-git2.min.js');
    wp_enqueue_script( 'jquery' );
}

add_action('wp_enqueue_scripts', 'add_scripts');

Modifier les types de contenus pris en charge lors d'une recherche

function search_filter($query) {
  if ( !is_admin() && $query->is_main_query() ) {
    if ($query->is_search) {
      $query->set('post_type', array('post', 'movie'));
    }
  }
}

add_action('pre_get_posts','search_filter');

Exemple de filtre

Modifier la longueur de l'excerpt

function my_excerpt_length( $words ) {
 return 15;
}
add_filter( 'excerpt_length', 'my_excerpt_length' );

Modifier le nombre de résultats renvoyés lors d'une recherche

function change_wp_search_size($queryVars) {
	if ( isset($_REQUEST['s']) ) // Make sure it is a search page
		$queryVars['posts_per_page'] = 10; // Change 10 to the number of posts you would like to show
	return $queryVars; // Return our modified query variables
}
add_filter('request', 'change_wp_search_size'); // Hook our custom function onto the request filter

Ajouter une classe au premier article de la boucle

add_filter( 'post_class', 'wps_first_post_class' );
function wps_first_post_class( $classes ) {
    global $wp_query;
    if( 0 == $wp_query->current_post )
        $classes[] = 'first_post';
        return $classes;
}

Mettre filtres et actions à disposition

function replace_copyright( $copyright ) {
    // do something to $copyright
    return $copyright;
}
add_filter( 'my_footer_filter', 'replace_copyright' );

Dans le thème

<div id="footer">
    <p class="copyright">
    <?php
    echo apply_filters( 'my_footer_filter', 'Copyright 2011 By Me' );
    ?>
    </p>
</div>
<div id="footer">
    <!-- ... -->
    <?php do_action( 'below_footer', $post ) ?>
</div>

Liens

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment