Cómo agregar filtros a su cartera de WordPress

Publicado: 2016-03-21

El mes pasado, le mostré cómo crear un sitio de cartera en WordPress utilizando un tipo de publicación personalizada, una nueva consulta de "proyectos" y algunas plantillas nuevas.

En esta publicación, le mostraré cómo agregar filtros a la página de su cartera utilizando la biblioteca Isotope.js.

agregar-filtros-wordpress-portfolio-all

Si aún no lo ha hecho, vaya a su sitio de WordPress, cree algunas categorías y asígnelas a los elementos de su cartera. Si lee el primer artículo, estoy usando un CPT llamado 'Proyectos' nuevamente, por lo que para cada proyecto agregado a mi sitio de WordPress, tendré que asegurarme de que se asigne una categoría. En mi sitio, mis proyectos se clasificarán como "Nueva construcción" o "Renovaciones".

Una vez que haya asignado una categoría a cada uno de sus proyectos, es hora de agregar el JavaScript que hará el trabajo de filtrado sofisticado por usted.

Isotope.js es una biblioteca de diseño desarrollada por David DeSandro. Es gratuito para uso personal y de código abierto, sin embargo, para uso comercial, debe comprar una licencia. Revise la página de licencias para obtener más información y precios.

Entonces, agreguemos el archivo isotope.js a su sitio. Idealmente, agregaría esto a un directorio llamado /js/ en su tema secundario para asegurarse de que las actualizaciones nunca lo eliminen.

También necesita crear un archivo más y agregarlo a su directorio /js/ . Este archivo contendrá el jQuery necesario para orientar sus proyectos. En mi ejemplo, nombré este archivo projects.js .

Pegue el siguiente código en ese archivo y guárdelo. Los aspectos clave a tener en cuenta en este archivo son los #projects , .project-item y #filters . Este es el archivo donde también puede cambiar el modo de layoutMode: a mampostería, empaque, celdas por columna y más. En este tutorial, estoy usando el modo de cuadrícula.

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;

});

});

Una vez que haya agregado este código a su sitio, es hora de poner en cola los archivos. Si el functions.php de su tema hijo ya tiene una función declarada para hacer esto, solo necesitará agregarle una línea de código como la que se muestra a continuación.

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

Tenga en cuenta get_stylesheet_directory_uri() siempre se refiere al tema activo actual.
En el caso de un tema personalizado, o el escenario en el que está alterando un tema sin un tema secundario, probablemente usaría get_template_directory_uri() en lugar de get_stylesheet_directory_uri()
Si su tema hijo aún no tiene una función para poner en cola su secuencia de comandos, deberá agregar una. Utilice lo siguiente para poner en cola su archivo 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 );

}

Una última nota aquí, debe asegurarse de que su tema ya esté en la cola de jQuery. Si no es así, deberá agregar wp_enqueue_script('jquery'); pero a partir de WordPress 3.8, jQuery está empaquetado con el núcleo de WordPress en /wp-includes/js/jquery/jquery.js .

Finalmente, guarde su archivo functions.php .

Ahora, regrese a su archivo projects-page.php y agregue el código que mostrará sus filtros, así como también obtenga el número de categorías y el nombre de categoría de cada proyecto.

Pegue el siguiente código justo arriba de donde comienza su cartera. Al igual que el último tutorial, estoy usando Bootstrap y en el HTML a continuación, estoy configurando mi fila de filtro para que tenga el ancho completo del contenedor. De forma predeterminada, mis filtros se alinearán a la izquierda de la columna. Si no está utilizando Bootstrap, es posible que desee comenzar y terminar con las etiquetas <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;

El siguiente paso es obtener la categoría de cada proyecto y colocarla en el contenedor del proyecto como una clase.

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

En el código anterior, all , project-item y $tax se agregan a cada contenedor de proyecto. $tax será la categoría que le asignó en wp-admin . Agregar "todos" le permite restablecer la página de cartera cada vez que un usuario hace clic en el filtro "todos".

Al final, cada proyecto debe tener una clase llamada "todos" y, en mi caso, cada proyecto también tendrá "construcción nueva" o "renovaciones". Ahora, cuando un usuario hace clic en una de las categorías, la página se reformateará elegantemente para mostrar solo la categoría que se seleccionó, todo mientras se mantiene el diseño de cuadrícula de la cartera.

añadir-filtros-wordpress-cartera-filtrada

En conclusión, Isotope.js es un complemento de jQuery muy poderoso que se puede implementar en cualquier sitio de WordPress. Una vez instalado, se puede utilizar para ordenar y filtrar diseños de catálogo, galería o cartera. Además, hay múltiples opciones de diseño que puede usar. Consulta todas las opciones aquí.

Al final, así es como se ve mi projects-page.php cuando termine:

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

¡Y con eso, tendrá una página de cartera de filtrado de contenido en pleno funcionamiento!


Complementos de WordPress que te encantarán

¡Descargue este libro electrónico para obtener una lista de nuestros complementos más recomendados para desarrolladores! Descubrimos que todos estos complementos son fáciles de usar, no tienen un rendimiento demasiado alto en su sitio y son francamente confiables.