8710 sujets

Développement web côté serveur, CMS

Bonjour à tous !

Donc voila tout est dans le titre, j'aimerais comprendre la différence entre add_filter et add_action.

En fait j'ai créer un thème WordPress, dans lequel je renseigne le logo du site via une interface d'options du thème (j'utilise SMOF de Options Framework pour faire cela).
Le truc c'est que des fois j'aimerais pouvoir renseigner mon logo directement dans mon fichier functions.php sans passer par l'interface d'options du thème, et sans avoir à remplacer mon header.php dans mon thème enfant.

Voici la partie de code concernée qui se trouve dans mon header.php :
<div class="header-logo">
    <a href="<?php echo home_url(); ?>">
        <?php echo ($data['logo-upload'])? '<img src="'.$data['logo-upload'].'" alt="'.get_bloginfo('name').'" />' : get_bloginfo('name'); ?>
    </a>
</div>


$data correspond à ce que me renvoi SMOF.

J'imagine que pour réussir ce que je souhaite il faut que je rajoute un hook quelque part, mais je ne sais pas trop comment faire cela...

Si quelqu'un a un début de réponse à m'apporter je suis preneur. Merci d'avance ! Smiley smile
Modifié par Raphi (06 Nov 2013 - 10:13)
Bonjour,
J'aime beaucoup les filtres et actions de WordPress donc je te réponds avec plaisir!
En préambule je préconise la création d'un thème enfant (child theme) pour ne pas modifier ton framework.

1 - Approche action
Les actions permettent d'éxecuter du code à des endroits prédéfinis.
Avec l'approche action voici ce que tu pourrais faire :dans le fichier header.php où est situé ton code, remplace le block de code par une nouvelle action que tu déclares :

<?php do_action ('logo_action_hook'); ?>


Dans ton fichier functions.php maintenant, tu ajoutes une function de callback à l'action que tu as créée :

add_action( 'logo_action_hook' , 'my_logo_callback');

function my_logo_callback() {
//il faut que récupères le tableau $data, d'une manière ou d'une autre avant ici si tu veux l'utiliser
	?>
	<div class="header-logo">
	    <a href="<?php echo home_url(); ?>">
	        <?php echo ($data['logo-upload'])? '<img src="'.$data['logo-upload'].'" alt="'.get_bloginfo('name').'" />' : get_bloginfo('name'); ?>
	    </a>
	</div>
	<?php
}


2 - Approche filtre
Les filtres permettent de modifier le comportement d'une fonction.
Dans le fichier header.php, on va créer un filtre qui récupère le contenu du logo généré en HTML et ensuite se donner la possibilité de filtrer ce contenu dans le fichier functions.php

Fichier header, remplacer le code d'origine par :


<?php ob_start(); ?>
<div class="header-logo">
	    <a href="<?php echo home_url(); ?>">
	        <?php echo ($data['logo-upload'])? '<img src="'.$data['logo-upload'].'" alt="'.get_bloginfo('name').'" />' : get_bloginfo('name'); ?>
	    </a>
</div>
<?php
$html = ob_get_contents();
ob_end_clean();
echo apply_filters( 'my_logo_filter', $html);



Dans le fichier functions.php, tu peux maintenant modifier à loisir le contenu du filtre créé :


add_filter( 'my_logo_filter' , 'my_logo_callback');

function my_logo_callback($html) {
//idem que pour l'action : il faut que récupères le tableau $data, d'une manière ou d'une autre avant ici si tu veux l'utiliser
	?>
	<div class="header-logo">
	    <a href="<?php echo home_url(); ?>">
	        <?php echo ($data['logo-upload'])? '<img src="'.$data['logo-upload'].'" alt="'.get_bloginfo('name').'" />' : get_bloginfo('name'); ?>
	    </a>
	</div>
	<?php
}


Voilà, j'espère que ça t'aidera à mieux comprendre les hooks dans WordPress. C'est un sujet que je connais bien et que j'ai notamment mis en place massivement dans mon thème Customizr
Modifié par nikeo (06 Nov 2013 - 20:32)
Bonjour @nikeo,

C'est super tu as parfaitement répondu à mon interrogation ! Merci infiniment pour cet éclaircissement. Smiley biggrin

Ce que je cherchais c'était bien une approche par les filtres, en effet.
J'ai donc adapté l'exemple que tu m'as donné comme ceci :
<div class="header-logo">
    <a href="<?php echo home_url(); ?>">
        <?php
        ob_start();
        echo ($data['logo-upload']) ? '<img src="'.$data['logo-upload'].'" alt="'.get_bloginfo('name').'" />' : get_bloginfo('name');
        $html = ob_get_contents();
        ob_end_clean();
        echo apply_filters('my_logo_filter', $html);
        ?>
    </a>
</div>


Et mon filtre que voici :
add_filter('my_logo_filter', 'display_logo');
function display_logo(){
    return '<img src="'.get_stylesheet_directory_uri().'/img/logo.png" alt="Mon Logo" />';
}


Ça fonctionne impec ! Smiley smile

nikeo a écrit :
En préambule je préconise la création d'un thème enfant (child theme) pour ne pas modifier ton framework.

C'est bien comme ça que je procède en effet. Smiley smile

a écrit :
C'est un sujet que je connais bien et que j'ai notamment mis en place massivement dans mon thème Customizr

J'avais vu ton thème mais je n'ai jamais pris le temps de le tester.
Il faut que je regarde ça de plus près sachant que j'ai également basé mon thème sur Bootstrap.

À bientôt et merci encore !
Parfait, content d'avoir pu aider là dessus!
(Je viens de voir ta réponse en faisant une recherche add_filter dans google...je n'avais pas reçu de notifications d'alsacréation)
A+