Comment ajouter des filtres à votre portfolio WordPress

Publié: 2016-03-21

Le mois dernier, je vous ai montré comment créer un site de portfolio sur WordPress en utilisant un type de publication personnalisé, une nouvelle requête "projets" et quelques nouveaux modèles.

Dans cet article, je vais vous montrer comment ajouter des filtres à votre page de portfolio à l'aide de la bibliothèque Isotope.js.

add-filters-wordpress-portfolio-all

Si vous ne l'avez pas déjà fait, accédez à votre site WordPress, créez quelques catégories et attribuez-les aux éléments de votre portefeuille. Si vous lisez le premier article, j'utilise à nouveau un CPT appelé "Projets", donc pour chaque projet ajouté à mon site WordPress, je devrai m'assurer qu'une catégorie est attribuée. Sur mon site, mes projets vont être classés comme « Nouvelle construction » ou « Rénovations ».

Une fois que vous avez attribué une catégorie à chacun de vos projets, il est temps d'ajouter le JavaScript qui fera le travail de filtrage sophistiqué pour vous.

Isotope.js est une bibliothèque de mise en page développée par David DeSandro. Il est gratuit pour une utilisation open source et personnelle, cependant, pour une utilisation commerciale, vous devez acheter une licence. Veuillez consulter la page de licence pour plus d'informations et les prix.

Alors, ajoutons le fichier isotope.js à votre site. Idéalement, vous devriez l'ajouter à un répertoire appelé /js/ dans votre thème enfant pour vous assurer que les mises à jour ne le suppriment jamais.

Vous devez également créer un fichier supplémentaire et l'ajouter à votre répertoire /js/ . Ce fichier contiendra le jQuery nécessaire pour cibler vos projets. Dans mon exemple, j'ai nommé ce fichier projects.js .

Collez le code suivant dans ce fichier et enregistrez-le. Les éléments clés à noter dans ce fichier sont les #projects , .project .project-item et #filters . Il s'agit du fichier dans lequel vous pouvez également modifier layoutMode: masonry, packery, cellsByColumn, etc. Dans ce tutoriel, j'utilise le mode grille.

jQuery(function ($) {

// initialize Isotope after all images have loaded

var $container = $('#projects').imagesLoaded( function() { //The ID for the list with all the blog posts

$container.isotope({ //Isotope options, 'item' matches the class in the PHP

itemSelector : '.project-item',

grid: {

columnWidth: 200

}

});

});

 
//Add the class selected to the item that is clicked, and remove from the others

var $optionSets = $('#filters'),

$optionLinks = $optionSets.find('a');
$optionLinks.click(function(){

var $this = $(this);

// don't proceed if already selected

if ( $this.hasClass('selected') ) {

return false;

}

var $optionSet = $this.parents('#filters');

$optionSets.find('.selected').removeClass('selected');

$this.addClass('selected');
//When an item is clicked, sort the items.

var selector = $(this).attr('data-filter');

$container.isotope({ filter: selector });
return false;

});

});

Une fois que vous avez ajouté ce code à votre site, il est temps de mettre les fichiers en file d'attente. Si le functions.php de votre thème enfant a déjà une fonction déclarée pour faire cela, il vous suffira d'y ajouter une ligne de code comme celle ci-dessous.

wp_enqueue_script('isotope', get_stylesheet_directory_uri() . '/js/isotope.pkgd.min.js', array(), '1.0.0', true );

wp_enqueue_script('projects', get_stylesheet_directory_uri() . '/js/projects.js', array(), '1.0.0', true );

Notez get_stylesheet_directory_uri() fait toujours référence au thème actif actuel.
Dans le cas d'un thème personnalisé ou du scénario où vous modifiez un thème sans thème enfant, vous utiliserez probablement get_template_directory_uri() à la place de get_stylesheet_directory_uri()
Si votre thème enfant n'a pas encore de fonction pour mettre votre script en file d'attente, vous devrez en ajouter une. Utilisez ce qui suit pour mettre en file d'attente votre fichier isotope.js .

add_action( 'wp_enqueue_scripts', 'child_scripts');

function child_scripts(){

wp_enqueue_script('isotope', get_stylesheet_directory_uri() . '/js/isotope.pkgd.min.js', array(), '1.0.0', true );

wp_enqueue_script('projects', get_stylesheet_directory_uri() . '/js/projects.js', array(), '1.0.0', true );

}

Une dernière note ici, vous devez vous assurer que votre thème a déjà mis en file d'attente jQuery. Si ce n'est pas le cas, vous devrez ajouter wp_enqueue_script('jquery'); mais à partir de WordPress 3.8, jQuery est fourni avec le noyau WordPress dans /wp-includes/js/jquery/jquery.js .

Enfin, enregistrez votre fichier functions.php .

Maintenant, revenez à votre fichier projects-page.php et ajoutez le code qui affichera vos filtres, ainsi que le nombre de catégories et le nom de la catégorie de chaque projet.

Collez le code suivant juste au-dessus du point de départ de votre portefeuille. Comme le dernier tutoriel, j'utilise Bootstrap et dans le HTML ci-dessous, je configure ma ligne de filtre sur toute la largeur du conteneur. Par défaut, mes filtres s'aligneront à gauche de la colonne. Si vous n'utilisez pas Bootstrap, vous pouvez commencer et terminer par les balises <ul> .

&amp;amp;lt;div id=&quot;filter-row&quot; class=&quot;row&quot;&amp;amp;gt;
&amp;amp;lt;div id=&quot;project-page&quot; class=&quot;col-lg-12&quot;&amp;amp;gt;
		&amp;amp;lt;ul class=&quot;nav navbar-nav navbar-left&quot; id=&quot;filters&quot;&amp;amp;gt;
			&amp;amp;lt;?php
				$terms2 = get_terms(&quot;project_categories&quot;); // This will go get all the categories
				$count = count($terms2); //This counts the number of categories
				echo '&amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;a href=&quot;javascript:void(0)&quot; title=&quot;&quot; data-filter=&quot;.all&quot; class=&quot;active&quot;&amp;amp;gt;Show All&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt;';
				if ( $count &amp;amp;gt; 0 ){
				foreach ( $terms2 as $term ) {
												$termname = strtolower($term-&amp;amp;gt;name);								$termname = str_replace(' ', '-', $termname);
	echo '&amp;amp;lt;li style=&quot;list-style:inline;&quot;&amp;amp;gt;&amp;amp;lt;a href=&quot;javascript:void(0)&quot; title=&quot;&quot; class=&quot;&quot; data-filter=&quot;.'.$termname.'&quot;&amp;amp;gt;'.$term-&amp;amp;gt;name.'&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt;';
	}
}
// in the above foreach loop, the code will return all the values stored in $terms2 array.

 ?&amp;amp;gt;
		&amp;amp;lt;/ul&amp;amp;gt;
	&amp;amp;lt;/div&amp;amp;gt;
&amp;amp;lt;/div&amp;amp;gt;

L'étape suivante consiste à obtenir la catégorie de chaque projet et à la placer dans le conteneur de projet en tant que classe.

&amp;amp;lt;?php
/*
Get the category for each unique post using the post ID
*/
$terms = get_the_terms( $post-&amp;amp;gt;ID, 'project_categories' );
if ( $terms &amp;amp;amp;&amp;amp;amp; ! is_wp_error( $terms ) ) :
$links = array();
	foreach ( $terms as $term ) {
	$links[] = $term-&amp;amp;gt;name;
	}
	$tax_links = join( &quot; &quot;, str_replace(' ', '-', $links));
	$tax = strtolower($tax_links);
	else :
	$tax = '';
	endif;

	$terms = get_the_terms( $post-&amp;amp;gt;ID, 'project_categories' );
?&amp;amp;gt;

&amp;amp;lt;?php echo '&amp;amp;lt;div class=&quot;project col-sm-6 col-md-4 all project-item '. $tax .'&quot;&amp;amp;gt;';?&amp;amp;gt;

Dans le code ci-dessus, all , project-item et $tax sont ajoutés à chaque conteneur de projet. $tax sera la catégorie que vous lui avez attribuée dans wp-admin . L'ajout de « tout » vous permet de réinitialiser la page du portfolio chaque fois qu'un utilisateur clique sur le filtre « tout ».

En fin de compte, chaque projet devrait avoir une classe appelée "tous" et dans mon cas, chaque projet aura également soit "nouvelle construction" soit "rénovations". Désormais, lorsqu'un utilisateur clique sur l'une des catégories, la page se reformate avec élégance pour n'afficher que la catégorie qui a été sélectionnée, tout en conservant la disposition en grille du portfolio.

add-filters-wordpress-portfolio-filtré

En conclusion, Isotope.js est un plugin jQuery très puissant qui peut être implémenté sur n'importe quel site WordPress. Une fois installé, il peut être utilisé pour trier et filtrer les mises en page de catalogue, de galerie ou de portfolio. De plus, il existe plusieurs options de mise en page que vous pouvez utiliser. Découvrez toutes les options ici.

Au final, voici à quoi ressemble mon projects-page.php une fois terminé :

&amp;amp;lt;?php
/* This is my Projects Portfolio page */

get_header(); 

?&amp;amp;gt;
&amp;amp;lt;div id=&quot;content-full-width&quot; class=&quot;page-wrap&quot;&amp;amp;gt;
    &amp;amp;lt;div class=&quot;container content-wrapper&quot;&amp;amp;gt;
        &amp;amp;lt;div class=&quot;row&quot;&amp;amp;gt;
            &amp;amp;lt;div id=&quot;content-projects&quot; class=&quot;page-wrap2&quot;&amp;amp;gt;
	    &amp;amp;lt;div class=&quot;container content-wrapper&quot;&amp;amp;gt;
	&amp;amp;lt;!-- ============ CONTENT START ============ --&amp;amp;gt;
	        &amp;amp;lt;section id=&quot;project-content&quot;&amp;amp;gt;
		&amp;amp;lt;div id=&quot;intro&quot; class=&quot;row&quot;&amp;amp;gt;
		    &amp;amp;lt;div class=&quot;col-sm-12 text-center&quot;&amp;amp;gt;
			&amp;amp;lt;?php while ( have_posts() ) : the_post(); ?&amp;amp;gt;
			&amp;amp;lt;?php the_content() ?&amp;amp;gt;
			&amp;amp;lt;?php endwhile; // end of the loop. ?&amp;amp;gt;
		    &amp;amp;lt;/div&amp;amp;gt;
		&amp;amp;lt;/div&amp;amp;gt;
	            &amp;amp;lt;div id=&quot;filters-row&quot; class=&quot;row&quot;&amp;amp;gt;
		    &amp;amp;lt;div id=&quot;project-page&quot; class=&quot;col-lg-12&quot;&amp;amp;gt;
		        &amp;amp;lt;ul class=&quot;nav navbar-nav navbar-left&quot; id=&quot;filters&quot;&amp;amp;gt;
			&amp;amp;lt;?php
			$terms2 = get_terms(&quot;project_categories&quot;);
			$count = count($terms2);
			echo '&amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;a href=&quot;javascript:void(0)&quot; title=&quot;&quot; data-filter=&quot;.all&quot; class=&quot;active&quot;&amp;amp;gt;All&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt;';
			if ( $count &amp;amp;gt; 0 ){
			    foreach ( $terms2 as $term ) {									    $termname = strtolower($term-&amp;amp;gt;name);
			    $termname = str_replace(' ', '-', $termname);
			echo '&amp;amp;lt;li style=&quot;list-style:inline;&quot;&amp;amp;gt;&amp;amp;lt;a href=&quot;javascript:void(0)&quot; title=&quot;&quot; class=&quot;&quot; data-filter=&quot;.'.$termname.'&quot;&amp;amp;gt;'.$term-&amp;amp;gt;name.'&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt;';
			}
		} ?&amp;amp;gt;
		    &amp;amp;lt;/ul&amp;amp;gt;
		&amp;amp;lt;/div&amp;amp;gt;
	        &amp;amp;lt;/div&amp;amp;gt;
	    &amp;amp;lt;div id=&quot;projects&quot; class=&quot;row&quot;&amp;amp;gt;
	&amp;amp;lt;!-- Start projects Loop --&amp;amp;gt;
		&amp;amp;lt;?php  /* Query the post   */
	$args = array( 'post_type' =&amp;amp;gt; 'projects', 'posts_per_page' =&amp;amp;gt; -1, 'orderby'=&amp;amp;gt;'menu_order','order'=&amp;amp;gt;'ASC' );
	$loop = new WP_Query( $args );
	while ( $loop-&amp;amp;gt;have_posts() ) : $loop-&amp;amp;gt;the_post();
/* Pull category for each unique post using the ID */
	$terms = get_the_terms( $post-&amp;amp;gt;ID, 'project_categories' );
	if ( $terms &amp;amp;amp;&amp;amp;amp; ! is_wp_error( $terms ) ) :
	   $links = array();
	       foreach ( $terms as $term ) {
	       $links[] = $term-&amp;amp;gt;name;
		}
	       $tax_links = join( &quot; &quot;, str_replace(' ', '-', $links));
	       $tax = strtolower($tax_links);
		else :
		$tax = '';
	endif;
	&amp;amp;lt;?php echo '&amp;amp;lt;div class=&quot;project col-sm-6 col-md-4 all project-item '. $tax .'&quot;&amp;amp;gt;';?&amp;amp;gt;
            &amp;amp;lt;a href=&quot;&amp;amp;lt;?php print get_permalink($post-&amp;amp;gt;ID) ?&amp;amp;gt;&quot;&amp;amp;gt;
              &amp;amp;lt;?php echo the_post_thumbnail(); ?&amp;amp;gt;&amp;amp;lt;/a&amp;amp;gt;
              &amp;amp;lt;h4&amp;amp;gt;&amp;amp;lt;?php print get_the_title(); ?&amp;amp;gt;&amp;amp;lt;/h4&amp;amp;gt;
              &amp;amp;lt;?php print get_the_excerpt(); ?&amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;
              &amp;amp;lt;a class=&quot;btn btn-default&quot; href=&quot;&amp;amp;lt;?php print get_permalink($post-&amp;amp;gt;ID) ?&amp;amp;gt;&quot;&amp;amp;gt;Details&amp;amp;lt;/a&amp;amp;gt;
        &amp;amp;lt;/div&amp;amp;gt; &amp;amp;lt;!-- End individual project col --&amp;amp;gt;
        &amp;amp;lt;?php endwhile; ?&amp;amp;gt;
    &amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;!-- End Projects Row --&amp;amp;gt;
&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;!-- End Container --&amp;amp;gt;
&amp;amp;lt;!-- ============ CONTENT END ============ --&amp;amp;gt;

&amp;amp;lt;?php get_footer(); ?&amp;amp;gt;

Et avec cela, vous aurez une page de portefeuille de filtrage de contenu entièrement fonctionnelle !


Les plugins WordPress que vous allez adorer

Téléchargez cet ebook pour obtenir une liste de nos plugins les plus recommandés pour les développeurs ! Nous avons trouvé que tous ces plugins étaient simples à utiliser, pas trop performants sur votre site et tout simplement fiables.