Des catégories en boutons radio : #jeudiconfession n°5

Des catégories en boutons radio : #jeudiconfession n°5

Il y a un moment que je voulais faire cet article, ce guide car c’est une question qui revient souvent : “Comment transformer la liste des cases à cocher des catégories, en bouton radio ?”

Piège de cristal

Si vous faites une recherche Google sur “radio button categories wordpress” vous trouverez un plugin (ou plus), des tutoriels, vraiment, de quoi se faire plaisir ! Mais tout ceci est piégé, aucun ne respecte la façon correcte, la façon WordPress de faire la chose. La plupart du temps, le développeur supprime la boite de WordPress et recrée la sienne.

Alors oui, ça part d’une bonne idée, mais si j’ai modifié aussi la boite des catégories, il ne va pas reprendre mes modifications ! Et si je veux le faire sur une custom taxo ? Impossible ! Et si j’ai supprimé la boite pour les contributeurs, il va en faite la remettre ? HAAAAAA !!

58 minutes pour vivre

J’ai donc eu l’idée d’arrêter de perdre du temps en cherchant sur Google, et de coder tout ça moi-même, et en moins d’une heure, j’avais trouvé la solution, LA solution pardon, celle que va prendre en compte vos modifs, vos customs taxo, et ne va pas la remettre si vous l’aviez supprimée.

Une journée en enfer

Si vous n’aimez pas lire du code ou si vous avez peur des classes PHP ou si le mot “WALKER” ne vous évoque que Chuck Norris, vous n’allez pas aimer ce qui suit, dans le cas contraire, vous allez vous régaler de simplicité !

 

add_filter( 'wp_terms_checklist_args', 'baw_wp_terms_checklist_args', 10, 2 );
function baw_wp_terms_checklist_args( $args, $post_id ) {
	$allowed = array( 'category', 'custom_taxo' );
	if ( in_array( $args['taxonomy'], $allowed ) ) {
		$args['walker'] = new Baw_Walker_CodeHTTP_Radiolist;
	}
	return $args;
}

class Baw_Walker_CodeHTTP_Radiolist extends Walker {
	var $db_fields = array( 'parent'=>'parent', 'id'=>'term_id' );

	function start_lvl( &$output, $depth = 0, $args = array() ) {
		$indent = str_repeat("\t", $depth);
		$output .= "$indent<ul class='children'>\n";
	}

	function end_lvl( &$output, $depth = 0, $args = array() ) {
		$indent = str_repeat("\t", $depth);
		$output .= "$indent</ul>\n";
	}

	function start_el( &$output, $category, $depth, $args ) {
		static $n=0; 
		$n++;
		extract( $args );
		$output .= "\n".'<li id="' . $taxonomy . '-' . $category->term_id . '">' .
		'<label class="selectit">' .
		'<input value="' . $category->term_id . '" type="radio" name="tax_input[' . $taxonomy . '][]" id="in-'.$taxonomy.'-'.$category->term_id . '"' . checked( in_array( $category->term_id, $selected_cats ) || $n==1, true, false ) . ' /> ' .
		esc_html( apply_filters('the_category', $category->name )) .
		'</label>' .
		'</li>';
	}
}

Retour en enfer

Je vous l’explique ? Si vous n’avez pas aimé lire le code, vous n’aimerez pas les explications !

D’abord je filtre les arguments de la liste des checkbox, formatée par la fonction wp_terms_checklist(), ce hook est wp_terms_checklist_args. Je vérifie que la taxo en cours de création fait partie de celles que je souhaite faire passer en boutons radio, ceci en remplissant le tableau <code>$allowed</code> avec les identifiants (slugs) des taxonomies.

Puis si celà me va, je lui indique que je souhaite utiliser un Walker maison, plus d’infos sur les walkers WordPress ici.

Ensuite je crée mon Walker en faisant un copier/coller du core et je change “checkbox” en “radio” dans le INPUT(et ui, juste ça !).

Belle journée pour mourir

Finalement, j’ai gagné du temps, s’il faisait beau, j’aurais même pu prendre un bain de soleil, mais là , si je sors, ça sera juste la douche …

Die Hardest

Pour Benjamin, 1 screenshot avant/après :

Avant, après !

Vous aimez ? Partagez !


Réagir à cet article

220 caractères maximum