• Bazan

    (@bazan)


    Witam,

    Muszę zrobić filtrowanie swojego WP_Query wg termów taksonomii i niestety mam problem ze stronicowaniem wyników.

    Do stronicowania używam wtyczki wp simple pagination.

    Problem polega na tym, że dobrze pobiera wybrane taksonomie, i tworzy mi listę postów tylko z wybranych kilku kategorii, ale linki stronicowania prowadzą do złej strony, i nie potrafię w nich przepisać wartości wybranych kategorii, bo niestety link do następnej strony albo prowadzi do 404, albo do archiwum postów z wszystkich kategorii.

    Post type = partnerzy, taksonomia = branza

    Da się obejść bez javascriptu zeby stronicowanie dzialalo tak jak powinno czyli zeby w wynikach pokazywalo kolejne strony wybranych kilku kategorii.

    Taki mam kod:

    <?php 
    
    	$taxes = array();
    	if (isset($_POST['terms'])) {
    		$taxes = $_POST['terms'];
    	}
    
    	?>
    
    	<div class="filter-container">
    
    		<form action="" method="post" class="filters-form">
    
    		<?php 	$terms = get_terms('branza',array('hide_empty'=>true));	?>
    
    		<?php foreach ($terms as $term): 
    
    			$name = $term->name;
    			$slug = $term->slug;
    			$id = $term->term_id;
    
    		?>
    
    			<span class="thefield">
    				<input type="checkbox" name="terms[]" id="term-<?php echo $id; ?>" value="<?php echo $slug; ?>" <?php if (in_array($slug,$taxes)) {echo 'checked="checked"';} ?>
    				>
    				<label for="term-<?php echo $id; ?>">
    					<?php echo $name ?>
    				</label>
    			</span>
    
    		<?php endforeach ?>
    
    		<div class="filter-buttons">
    			<input class="ico-reset filter-reset" type="reset" value="Wyczyść" />
    			<input class="ico-submit filter-submit" type="submit" value="Filtruj" />
    		</div>
    		</form>
    
    	</div>
    
    	<div class="query-results">
    
    		<?php
    		echo $paged;
    		if (sizeof($taxes) == 0) {
    			$taxes = false;
    		}
    
    		$args = array();
    
    		if ($taxes) {
    			$args = array(
    				'posts_per_page' => 2,
    				'post_type' => 'partnerzy',
    				'tax_query' => array(
    						'relation' => 'OR',
    						array(
    							'taxonomy' => 'branza',
    							'field' => 'slug',
    							'terms' => $taxes
    							),
    					),
    
    				'paged'=> $paged
    			);
    		} else {
    			$args = array(
    				'posts_per_page' => 2,
    				'post_type' => 'partnerzy',
    				'paged'=> $paged
    			);
    		} 
    
    		$temp = $wp_query;
    
    		$wp_query = new WP_Query($args);
    
    		?>
    
    		<?php if ( $wp_query->have_posts() ) : while (  $wp_query->have_posts() ) :  $wp_query->the_post(); ?>
    
    				<?php $www = get_field('www'); ?>
    
    			<article id="post-<?php the_ID();?>" <?php post_class('partnerzy-item'); ?> >
    					<?php if (has_post_thumbnail()): ?>
    						<div class="archive-thumb">
    							<a href="<?php the_permalink(); ?>"><?php the_post_thumbnail('partner-thumb'); ?></a>
    						</div>
    					<?php endif; ?>
    
    					<h2 class="archive-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
    
    					<div class="archive-content">
    						<?php the_excerpt(); ?>
    					</div>
    					<div class="archive-more clearfix">
    						<?php if (!empty($www)): ?>
    							<a href="<?php echo $www; ?>" class="ico-link"><?php _e('strona www','medivite'); ?></a>
    						<?php endif; ?>
    						<a href="<?php the_permalink(); ?>" class="read-more"><?php _e('Czytaj dalej','medivite'); ?></a>
    					</div>
    
    			</article>
    
    		<?php endwhile; ?>
    		<div class="clearfix"></div>
    			<?php if (function_exists('wp_simple_pagination')): ?>
    				<?php wp_simple_pagination(); ?>
    			<?php endif ?>
    		<?php else: ?>
    			<h2><?php _e('Brak partnerów','medivite'); ?></h2>
    			<p><?php _e('Niestety w tej branży jeszcze nie ma partnerów. Chcesz dołączyć?','medivite'); ?></p>
    		<?php endif; ?>
    
    			<?php wp_reset_postdata(); ?>
    
    		<?php $wp_query = null; $wp_query = $temp; unset($temp);?> 	
    
    	</div>

    Wcinam się w zmienna $wp_query po to żeby w ogóle wtyczka stronicowania działała.

    Formularz działa metodą POST. Wolałbym GET, ale niestety nie potrafię zrobić ładnego linku, i tworzy się kod typu …?terms=3&terms=6&terms=8, a wolalbym wtedy ?terms=3,6,8

    Jak to zrobic? Wtedy i stronicowanie łatwo by bylo dopisac do linkow stronicowania poprzez JS.

    Calosc wyglada tak http://scr.hu/5oi/mlmm8 🙂

Temat ‘Filtrowanie WP_Query za pomocą formularza i stronicowanie’ jest zamknięty na nowe odpowiedzi.