WordPress как на ладони
Новые WordPress шаблоны Хостинг, VPS/VDS и отдельные сервера только на SSD дисках. 7 дней бесплатного тестирования.

Вывод произвольного типа записи, таксономия и форма фильтр

В двух словах. Есть произвольный тип записей programmes (программы обучения), две таксономии (направления обучения и города, по которым происходит поиск). Есть файл вывода программ обучения programmes.php, есть файлы таксономий taxonomy-%slug%.php. Есть отдельный файл поиска по программам programmes-search.php.
Когда в форме выбран хоть один фильтр, допустим город, или направление обучения, или оба, поиск успешно осуществляется и вывод происходит нормально. Если же ни один фильтр не выбран и нажимаю "найти" (или при прямом переходе по ссылке, допустим в тех же хлебных крошках, domain/programmes/) то меня кидает на главную, а хотелось бы что бы по этому адресу выводились все программы.

Теперь подробнее.

Был зарегистрирован произвольный тип записи 'programmes' - программы обучения.

add_action( 'init', 'cpt_register' );
function cpt_register() {
		$args = array(
		'label' => 'Программы обучения',
		'singular_label' => 'Программа',
		'public' => true,
		'menu_position' => 20,
		'menu_icon' => 'dashicons-welcome-learn-more',
		'rewrite' => true,
		'has_archive' => true,
		'supports' => array( 'thumbnail', 'editor', 'title' ),
		'taxonomies' => array('napravlenie-obucheniya', 'city') 
	);  
	register_post_type( 'programmes' , $args );
}

Были зарегистрированы таксономии (Направления обучения и города)

add_action( 'init', 'tax_register', 0 );
function tax_register() {
		$args = array(
		'label' => _x( 'Направления обучения', 'taxonomy general name' ), 
		'labels' => array(
			'name' => _x( 'Направления обучения', 'taxonomy general name' ),
			'singular_name' => _x( 'Направление обучения', 'taxonomy singular name' ),
			'menu_name' => __( 'Направления обучения' ),
			'all_items' => __( 'Все направления обучения' ),
			'edit_item' => __( 'Изменить направление обучения' ),
			'view_item' => __( 'Просмотреть направления обучения' ),
			'update_item' => __( 'Обновить направление обучения' ), 
			'add_new_item' => __( 'Добавить новое направление обучения' ),
			'new_item_name' => __( 'Название' ), 
			'parent_item' => __( 'Родительская' ), 
			'parent_item_colon' => __( 'Родительская:' ), 
			'search_items' => __( 'Поиск направлений обучения' ), 
			'popular_items' => null, 
			'separate_items_with_commas' => null, 
			'add_or_remove_items' => null,
			'choose_from_most_used' => null, 
			'not_found' => __( 'Направлений обучения не найдено.' ),
		),
		'public' => true,
		'show_ui' => true,
		'show_in_menu' => true,
		'show_in_nav_menus' => true,
		'show_tagcloud' => true,
		'show_in_quick_edit' => true,
		'meta_box_cb' => null,
		'show_admin_column' => false,
		'description' => '',
		'hierarchical' => true,
		'update_count_callback' => '',
		'query_var' => true,
		'rewrite' => array(
			'slug' => 'napravlenie-obucheniya',
			'with_front' => false,
			'hierarchical' => true,
			'ep_mask' => EP_NONE,
		),
		'sort' => null,
		'_builtin' => false,
	);
	register_taxonomy( 'napravlenie-obucheniya', array('programmes'), $args );

Были созданы файлы programmes.php (вывод программ обучения), single-programmes.php (вывод одной программы), taxonomy-city.php и taxonomy-napravlenie-obucheniya.php:

programmes.php

<?php
/**
 * Template Name: Программы обучения
 *
 * @package Techacademy
 */
get_header(); ?>
<div class="motopress-wrapper content-holder clearfix">
	<div class="container">
		<div class="row">
			<div class="span12" style="margin-bottom: 35px;" data-motopress-wrapper-file="programmes.php" data-motopress-wrapper-type="content">
				<div class="row">
					<div class="span12" data-motopress-type="static" data-motopress-static-file="static/static-title.php">
						<?php get_template_part('static/static-title'); ?>
					</div>
				</div>
				<div class="row flex-row">
					<div class="span8" data-motopress-type="loop" data-motopress-loop-file="loop/loop-programmes.php">
						<div class="section-programmes">
							<?php get_template_part('loop/loop-programmes'); ?>
						</div>
					</div>
					<div class="span4 sidebar left">
							<?php get_template_part( 'programmes-search' ); ?>
					</div>
				</div>
			</div><!-- .span12 -->
		</div><!-- .row -->
	</div><!-- .container -->
</div><!-- .motopress-wrapper -->
<?php get_footer(); ?>

loop-programmes.php

<?php /* Loop Name: Programmes */ ?>
<?php
$args = array(
	'post_type' => 'programmes',
	'publish' => true,
	'paged' => get_query_var('paged'),
);
query_posts($args);
if ( have_posts() ) : ?>
	<?php while ( have_posts() ) : the_post(); ?>
		<div class="block_programs">
			<h3><?php echo get_post_meta($post->ID, 'code', true); ?> <?php the_title(); ?></h3>
			<p><em>
				<?php
					$city = get_the_terms($post->ID, 'city');
					foreach( $city as $gorod) {
					echo ' <a href="' . get_term_link($gorod) . '">' . $gorod->name . '</a> ';
				} ?>
			</em></p>
			<p class="pleft"><strong>Направление: </strong>
				<?php
					$napravlenie = get_the_terms( $post->ID, 'napravlenie-obucheniya' );
						foreach( $napravlenie as $naprav) {
						echo ' <a href="' . get_term_link($naprav) . '" title="Все программы по этому направлению">' . $naprav->name . '</a> ';
					} ?>
			</p>      
			<p class="pleft"><strong>Стоимость обучения: </strong><?php echo get_post_meta($post->ID, 'price', true); ?> руб.</p>
			<div>
				<a class="link_blue" href="<?php echo get_permalink(); ?>">Подробнее</a>
				<a request-fancybox class="request link_blue link_red" href="#contact_form_pop1" data-program="<?php the_title(); ?>" data-code="<?php echo get_post_meta($post->ID, 'code', true); ?>">Заполнить заявку</a>
			</div>
		</div>
	<?php endwhile; ?>
<?php else : ?>
	<p><?php _e( 'Извините, по вашему запросу не найдено программ обучения. Пожалуйста, попробуйте снова.', 'techacademy' ); ?></p>
<?php endif; ?>

programmes-search.php

<?php
/**
 * @package Techacademy
 */
get_filename(); ?>
<div id="container_programm">
	<form id="filter" action="<?php echo site_url() ?>/programmes/" method="POST">
		<ul>
			<li>
				<h4>Программы обучения:</h4> 
			<select onchange="document.location.href=this.options[this.selectedIndex].value;">
				<option value=""><?php echo esc_attr( __( 'Все программы обучения' ) ); ?></option>
				<?php
				$args=array(
				'post_type' => 'programmes'
				);
				$programmes = get_posts($args);
				foreach ($programmes as $post) :
					setup_postdata($post);
				?>
				<option value="<?php the_permalink(); ?>"><?php the_title(); ?></option>
				<?php endforeach; ?>
			 </select>
		</li>
			<li>
				<h4>Напрвления обучения:</h4>
			<select name="napravlenie-obucheniya">
				<option value=""><?php echo esc_attr( __( 'Все направления обучения' ) ); ?></option>
				<?php
					$args = array ('hide_empty=0'); 
					$terms = get_terms( 'napravlenie-obucheniya', $args );
					if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
						foreach ( $terms as $term ) {
							echo '<option value="' . $term->slug . '">' . $term->name . '</option>';
						}
					}
				?>
			 </select>
		</li>
			<li>
				<h4>Выбрать город:</h4>
			<select name="city">
				<option value=""><?php echo esc_attr( __( 'Все города' ) ); ?></option>
				<?php
					$args = array ('hide_empty=0'); 
					$terms = get_terms( 'city', $args );
					if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
						foreach ( $terms as $term ) {
							echo '<option value="' . $term->slug . '">' . $term->name . '</option>';
						}
					}
				?>
			 </select>
		</li>
		<li>
			<!-- input type="submit" value="Найти">
			<button type="submit">Найти</button -->

			<button>Применить фильтр</button>
			<input type="hidden" name="action" value="myfilter">
			</li>
		</ul>
	</form>   
	<div id="response"></div>

<script type="text/javascript">
	jQuery(function($){
	$('#filter').submit(function(){
		var filter = $(this);
		$.ajax({
			url:ajaxurl, // обработчик
			data:jQuery('#filter').serialize(), // filter.serialize(), // данные
			type: 'POST', //filter.attr('method'), // тип запроса
			beforeSend:function(xhr){
				filter.find('button').text('Загружаю...'); // изменяем текст кнопки
			},
			success:function(data){
				filter.find('button').text('Применить фильтр'); // возвращаеи текст кнопки
				$('#response').html(data);
			}
		});
		return false;
	});
});
</script> 
	<!-- ?php echo do_shortcode('[searchandfilter id="10556"]'); ? -->
</div>
<?php get_filename(); ?>

Обработчик PHP из functions.php

function true_filter_function(){
	// для таксономий
	if( isset( $_POST['napravlenie-obucheniya'] ) || isset( $_POST['city'] ) )
		$args['tax_query'] = array(
			array(
				'taxonomy' => 'napravlenie-obucheniya',
				'field' => 'id',
				'terms' => $_POST['napravlenie-obucheniya']
			),
			array(
				'taxonomy' => 'city',
				'field' => 'id',
				'terms' => $_POST['city']
			)
		);
	die();
}
add_action('wp_ajax_myfilter', 'true_filter_function'); 
add_action('wp_ajax_nopriv_myfilter', 'true_filter_function');

Если включить плагин Search and Filter и в настройках в качестве шаблона вывода результатов указать programmes.php и не важно какой slug (хоть programmes), всё работает прекрасно.

Скриншот вывода с выбранными фильтрами

0
4 месяца назад
  • 3
    el-lable50 cайт: el-lable.ru

    У вас ошибочка на сайте, ReferenceError: ajaxurl is not defined.
    как я полагаю вам надо в functions.php добавить его инициализацию.

    function wp_ajax_url(){
    	wp_localize_script( 'scripts', 'ajaxURL', 
    		array(
    			'url' => admin_url('admin-ajax.php')
    		)
    	);  
    }
    add_action( 'wp_enqueue_scripts', 'wp_ajax_url', 99 );

    и в javascript-ах вместо ajaxurl написать что-то вроде

    window.ajaxURL.url

    получится что-то вроде

    jQuery(function($){
    	$('#filter').submit(function(){
    		var filter = $(this);
    		$.ajax({
    			url:window.ajaxURL.url, // обработчик
    			data:filter.serialize(), // данные
    			type:filter.attr('method'), // тип запроса
    			beforeSend:function(xhr){
    				filter.find('button').text('Загружаю...'); // изменяем текст кнопки
    			},
    			success:function(data){
    				filter.find('button').text('Применить фильтр'); // возвращаеи текст кнопки
    				$('#response').html(data);
    			}
    		});
    		return false;
    	});
    });
    OLD_Grays 4 месяца назад

    Добрый день. Спасибо. Да, действительно была проблема с ajax url. Плюс ко всему в обработчике я забыл прописать блок с выводом программ в цикле. Всё дописал, url поправил, немного другим способом правда, всё работает, всё фильтруется.
    Теперь встало два вопроса. 1. В programmes.php у меня выводится невидимая форма заявки и при нажатии на кнопку "Заполнить заявку" она появляется во всплывающем окне (fancybox3). Однако, если отфильтровать программы, то форма не появляется во всплывающем окне. 2. Если перейти на страницу отдельной программы, слева в сайдбаре также присутствует форма, но при выборе фильтров, получается ничего не происходит, мы остаёмся на странице отдельной программы, а по идее должны вновь перейти на //domain/programmes/ где будут показаны программы согласно выбранным фильтрам.

    el-lable 4 месяца назад

    Как я понял у вас форма заявки(невидимая) выводится только на страницах конкретного курса. На страницах списка семинаров ее физически нет в html.
    В ваших файлах шаблонах этого нет, она видимо выводится как-то через виджеты.
    Как я понимаю, вам надо чтоб эта форма как-то динамически создавалась/заполнялась при нажатии "заполнить заявку" в списке программ обучения и естесвенно выводилась в фансибоксе.

    OLD_Grays 4 месяца назад

    Да, всё верно. За исключением того, что форма через виджет выводится. И да кнопка "Заполнить заявку" автоматом вставляет два значения в поля формы. Форму я запихнул пока сразу после <body>. А выводиться она должна и на странице со всеми курсами и на странице конкретного курса. Только вот после того как я включаю свою форму поиска и вывод отфильтрованных курсов производится с помощью ajax, она просто-напросто не открывается. Как только перехожу на страницу конкретного курса, всё норм. Если обновить страницу вывода курсов, всё норм. Но если отфильтровать, не работает хоть тресни)
    У меня подозрения, что в связи с ajax выводом, надо и форму перегружать. Сейчас пробую сделать форму поиска без использования ajax'а, банальными GET запорсами, если получится, по идее форма заявки должна заработать как часы. Если не получится, оставлю, наверное, хоть и не люблю плагины, плагин search&filter. В общем-то он идеально справляется))

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация