Как добавить фильтры в ваше портфолио WordPress

Опубликовано: 2016-03-21

В прошлом месяце я показал вам, как создать сайт-портфолио на WordPress, используя настраиваемый тип записи, новый запрос «проекты» и несколько новых шаблонов.

В этом посте я покажу вам, как добавить фильтры на страницу вашего портфолио с помощью библиотеки Isotope.js.

добавить-фильтры-wordpress-портфолио-все

Если вы еще этого не сделали, зайдите на свой сайт WordPress, создайте несколько категорий и назначьте их элементам в своем портфолио. Если вы читали первую статью, я снова использую CPT под названием «Проекты», поэтому для каждого проекта, добавленного на мой сайт WordPress, мне нужно убедиться, что ему назначена категория. На моем сайте мои проекты будут отнесены к категории «Новое строительство» или «Ремонт».

После того, как вы присвоили категорию каждому из ваших проектов, пришло время добавить JavaScript, который сделает за вас сложную фильтрацию.

Isotope.js — это библиотека макетов, разработанная Дэвидом ДеСандро. Это бесплатно для открытого исходного кода и личного использования, однако для коммерческого использования вы должны приобрести лицензию. Пожалуйста, просмотрите страницу лицензии для получения дополнительной информации и цен.

Итак, давайте добавим файл isotope.js на ваш сайт. В идеале вы должны добавить это в каталог с именем /js/ в вашей дочерней теме, чтобы гарантировать, что обновления никогда не удалят его.

Вам также нужно создать еще один файл и добавить его в каталог /js/ . Этот файл будет содержать jQuery, необходимый для ваших проектов. В моем примере я назвал этот файл projects.js .

Вставьте следующий код в этот файл и сохраните его. Ключевыми моментами, которые следует отметить в этом файле, являются #projects , .project-item и #filters . Это файл, в котором вы также можете изменить layoutMode: на masonry, packery, CellsByColumn и т. д. В этом уроке я использую режим сетки.

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;

});

});

После того, как вы добавили этот код на свой сайт, пришло время поставить файлы в очередь. Если в файле functions.php вашей дочерней темы уже объявлена ​​функция для этого, вам просто нужно добавить в нее строку кода, как показано ниже.

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

Обратите внимание, get_stylesheet_directory_uri() всегда ссылается на текущую активную тему.
В случае пользовательской темы или сценария, когда вы изменяете тему без дочерней темы, вы, вероятно, будете использовать get_template_directory_uri() вместо get_stylesheet_directory_uri()
Если в вашей дочерней теме еще нет функции для постановки скрипта в очередь, вам нужно будет добавить ее. Используйте следующее, чтобы поставить в очередь файл 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 );

}

И последнее замечание: вы должны убедиться, что ваша тема уже поставила jQuery в очередь. Если это не так, вам нужно будет добавить wp_enqueue_script('jquery'); но начиная с WordPress 3.8, jQuery упакован с ядром WordPress в /wp-includes/js/jquery/jquery.js .

Наконец, сохраните файл functions.php .

Теперь вернитесь к файлу projects-page.php и добавьте код, который будет отображать ваши фильтры, а также получать количество категорий и название категории каждого проекта.

Вставьте следующий код чуть выше, где начинается ваше портфолио. Как и в предыдущем уроке, я использую Bootstrap и в приведенном ниже HTML я устанавливаю строку фильтра на всю ширину контейнера. По умолчанию мои фильтры будут выравниваться по левому краю столбца. Если вы не используете Bootstrap, вы можете начинать и заканчивать теги <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;

Следующий шаг — получить категорию для каждого проекта и поместить ее в контейнер проекта как класс.

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

В приведенном выше коде all , project-item и $tax добавляются в каждый контейнер проекта. $tax будет категорией, которую вы присвоили ей в wp-admin . Добавление «всех» позволяет сбросить страницу портфолио каждый раз, когда пользователь щелкает фильтр «все».

В конце концов, у каждого проекта должен быть класс с именем «все», и в моем случае каждый проект также будет иметь либо «новое строительство», либо «ремонт». Теперь, когда пользователь нажимает на одну из категорий, страница элегантно переформатируется, чтобы отображать только выбранную категорию, сохраняя при этом сетку портфолио.

добавить-фильтры-wordpress-портфолио-отфильтровано

В заключение, Isotope.js — это очень мощный плагин jQuery, который можно внедрить на любой сайт WordPress. После установки его можно использовать для сортировки и фильтрации макетов каталога, галереи или портфолио. Кроме того, есть несколько вариантов макета, которые вы можете использовать. Проверьте все варианты здесь.

В конце концов, вот как выглядят мои projects-page.php после завершения:

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

И с этим у вас будет полностью функционирующая страница портфолио с фильтрацией контента!


Плагины WordPress, которые вам понравятся

Загрузите эту электронную книгу, чтобы получить список наших наиболее рекомендуемых плагинов для разработчиков! Мы обнаружили, что все эти плагины просты в использовании, не слишком требовательны к производительности вашего сайта и совершенно надежны.