Come aggiungere filtri al tuo portfolio WordPress

Pubblicato: 2016-03-21

Il mese scorso ti ho mostrato come creare un sito portfolio su WordPress utilizzando un tipo di post personalizzato, una nuova query "progetti" e alcuni nuovi modelli.

In questo post, ti mostrerò come aggiungere filtri alla pagina del tuo portfolio utilizzando la libreria Isotope.js.

aggiungi-filtri-wordpress-portfolio-all

Se non l'hai già fatto, entra nel tuo sito WordPress, crea alcune categorie e assegnale agli elementi del tuo portfolio. Se leggi il primo articolo, sto usando di nuovo un CPT chiamato "Progetti", quindi per ogni progetto aggiunto al mio sito WordPress, dovrò assicurarmi che venga assegnata una categoria. Sul mio sito, i miei progetti saranno classificati come "Nuove costruzioni" o "Ristrutturazioni".

Dopo aver assegnato una categoria a ciascuno dei tuoi progetti, è il momento di aggiungere il JavaScript che farà il lavoro di filtraggio di fantasia per te.

Isotope.js è una libreria di layout sviluppata da David DeSandro. È gratuito per l'open source e per uso personale, tuttavia, per uso commerciale, è necessario acquistare una licenza. Si prega di consultare la pagina della licenza per ulteriori informazioni e prezzi.

Quindi, aggiungiamo il file isotope.js al tuo sito. Idealmente, dovresti aggiungerlo a una directory chiamata /js/ nel tuo tema figlio per assicurarti che gli aggiornamenti non lo eliminino mai.

Devi anche creare un altro file e aggiungerlo alla tua directory /js/ . Questo file conterrà il jQuery necessario per indirizzare i tuoi progetti. Nel mio esempio, ho chiamato questo file projects.js .

Incolla il codice seguente in quel file e salvalo. Le cose chiave da notare in questo file sono #projects , .project .project-item e #filters . Questo è il file in cui puoi anche cambiare layoutMode: in muratura, packery, cellsByColumn e altro. In questo tutorial, sto usando la modalità griglia.

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;

});

});

Dopo aver aggiunto questo codice al tuo sito, è il momento di accodare i file. Se functions.php del tuo tema figlio ha già una funzione dichiarata per farlo, dovrai solo aggiungere una riga di codice come quella qui sotto.

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 );

Nota, get_stylesheet_directory_uri() si riferisce sempre al tema attivo corrente.
Nel caso di un tema personalizzato o dello scenario in cui stai alterando un tema senza un tema figlio, probabilmente utilizzeresti get_template_directory_uri() al posto di get_stylesheet_directory_uri()
Se il tuo tema figlio non ha già una funzione per accodare il tuo script, dovrai aggiungerne uno. Utilizzare quanto segue per accodare il file 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 );

}

Un'ultima nota qui, dovresti assicurarti che il tuo tema abbia già accodato jQuery. In caso contrario, dovrai aggiungere wp_enqueue_script('jquery'); ma a partire da WordPress 3.8, jQuery è impacchettato con il core di WordPress in /wp-includes/js/jquery/jquery.js .

Infine, salva il tuo file functions.php .

Ora torna al tuo file projects-page.php e aggiungi il codice che mostrerà i tuoi filtri, oltre a ottenere il numero di categorie e il nome della categoria di ciascun progetto.

Incolla il codice seguente appena sopra dove inizia il tuo portfolio. Come l'ultimo tutorial, sto usando Bootstrap e nell'HTML sottostante, sto impostando la mia riga del filtro su tutta la larghezza del contenitore. Per impostazione predefinita, i miei filtri si allineeranno a sinistra della colonna. Se non stai usando Bootstrap, potresti voler iniziare e terminare con i tag <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;

Il passaggio successivo consiste nell'ottenere la categoria per ogni progetto e inserirla nel contenitore del progetto come 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;

Nel codice sopra, all , project-item e $tax vengono aggiunti a ogni contenitore del progetto. $tax sarà la categoria che gli hai assegnato nel wp-admin . L'aggiunta di "tutto" consente di reimpostare la pagina del portfolio ogni volta che un utente fa clic sul filtro "tutto".

Alla fine, ogni progetto dovrebbe avere una classe chiamata "tutti" e nel mio caso, ogni progetto avrà anche "nuove costruzioni" o "ristrutturazione". Ora, quando un utente fa clic su una delle categorie, la pagina si riformatta in modo elegante per visualizzare solo la categoria che è stata selezionata, il tutto mantenendo il layout della griglia del portfolio.

aggiungi-filtri-wordpress-portfolio-filtrati

In conclusione, Isotope.js è un plugin jQuery molto potente che può essere implementato su qualsiasi sito WordPress. Una volta installato, può essere utilizzato per ordinare e filtrare layout di cataloghi, gallerie o portfolio. Inoltre, ci sono più opzioni di layout che puoi usare. Scopri tutte le opzioni qui.

Alla fine, ecco come appare il mio projects-page.php una volta terminato:

&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;

E con ciò, avrai una pagina del portfolio di filtraggio dei contenuti completamente funzionante!


Plugin WordPress che adorerai

Scarica questo ebook per un elenco dei nostri plugin più consigliati per gli sviluppatori! Abbiamo riscontrato che tutti questi plugin sono semplici da usare, non troppo performanti sul tuo sito e semplicemente affidabili.