Cum să filtrezi postările după categorii?

7 aug. 2013, 12:31:35
Vizualizări: 14.2K
Voturi: 0

Am un tip de postare personalizată și acum trebuie să filtrez proiectele în funcție de categoriile lor fără a fi redirecționat pe altă pagină. De asemenea, am nevoie să am o categorie all care să afișeze toate proiectele. Link către site-ul de testare. Aș aprecia orice ajutor.

portfolio-type.php:

<?php

if ( function_exists( 'add_theme_support' ) ) { 
   add_theme_support( 'post-thumbnails' );
   set_post_thumbnail_size( 270, 170, true ); // Dimensiuni miniaturi normale
   add_image_size( 'screen-shot', 720, 540 ); // Dimensiune completă ecran
}

add_action('init', 'portfolio_register');  

function portfolio_register() {
$labels = array(
   'name' => _x('Portfolio', 'nume general tip postare'),
   'singular_name' => _x('Element Portfolio', 'nume singular tip postare'),
   'add_new' => _x('Adaugă nou', 'element portfolio'),
   'add_new_item' => __('Adaugă element nou în portfolio'),
   'edit_item' => __('Editează elementul din portfolio'),
   'new_item' => __('Element nou în portfolio'),
   'view_item' => __('Vezi elementul din portfolio'),
   'search_items' => __('Caută elemente în portfolio'),
   'not_found' =>  __('Nimic găsit'),
   'not_found_in_trash' => __('Nimic găsit în coșul de gunoi'),
   'parent_item_colon' => ''
);
$args = array(
   'labels' => $labels,
   'public' => true,
   'publicly_queryable' => true,
   'show_ui' => true,
   'query_var' => true,
   'rewrite' => true,
   'capability_type' => 'post',
   'hierarchical' => false,
   'menu_position' => 5,
   'supports' => array('title','editor','thumbnail')
); 
register_post_type( 'portfolio' , $args );
}

function create_portfolio_taxonomies() {
$labels = array(
   'name'              => _x( 'Categorii', 'nume general taxonomie' ),
   'singular_name'     => _x( 'Categorie', 'nume singular taxonomie' ),
   'search_items'      => __( 'Caută categorii' ),
   'all_items'         => __( 'Toate categoriile' ),
   'parent_item'       => __( 'Categorie părinte' ),
   'parent_item_colon' => __( 'Categorie părinte:' ),
   'edit_item'         => __( 'Editează categoria' ),
   'update_item'       => __( 'Actualizează categoria' ),
   'add_new_item'      => __( 'Adaugă categorie nouă' ),
   'new_item_name'     => __( 'Nume categorie nouă' ),
   'menu_name'         => __( 'Categorii' ),
);

$args = array(
   'hierarchical'      => true, // Setează 'false' pentru taxonomie neierarhică (ca etichetele)
   'labels'            => $labels,
   'show_ui'           => true,
   'show_admin_column' => true,
   'query_var'         => true,
   'rewrite'           => array( 'slug' => 'categorii' ),
);

register_taxonomy( 'portfolio_categories', array( 'portfolio' ), $args );
}
add_action( 'init', 'create_portfolio_taxonomies', 0 );

?>

index.php:

        <!-- Început Pagină Portfolio -->

    <section id="portfolio" class="page">
        <div class="container">
            <div class="row">
                <div class="span12">

                    <div class="title">Portfoolio</div>
                    <hr>
                    <div class="sub-title visible-desktop">Lucrări:</div>

                            <!-- Început Filtre -->

                      <?php

                      $taxonomy = 'portfolio_categories';
                      $terms = get_terms($taxonomy); // Obține toți termenii unei taxonomii

                      if ( $terms && !is_wp_error( $terms ) ) :
                      ?>
                          <ul class="option-set" data-option-key="filter">
                            <li class="filter-icon hidden-phone">&#0065;</li>
                              <?php foreach ( $terms as $term ) { ?>
                                  <li><a href="<?php echo get_term_link($term->slug, $taxonomy); ?>" ><?php echo $term->name; ?></a></li>
                              <?php } ?>
                          </ul>
                      <?php endif;?>

                        <!-- Sfârșit Filtre -->            

                        <!-- Început Proiecte -->

                    <div id="posts" class="row isotope">


                      <?php if (have_posts()) : while (have_posts()) : the_post(); ?>  

                          <?php  
                              $title= str_ireplace('"', '', trim(get_the_title()));  
                              $desc= str_ireplace('"', '', trim(get_the_content()));  
                          ?>     

                          <div class="item post item span4 isotope-item">

                            <a class="project-wrp fancybox" title="<?=$title?>" rel="lightbox[work]" href="<?php print portfolio_thumbnail_url($post->ID) ?>"><div class="profile-photo"><div class="profile-icon">&#0102;</div><?php the_post_thumbnail(array('230','170'),array('alt' => '')); ?> </div>  
                            <div class="project-name"><?php echo $title; ?></div>
                            <div class="project-client"><?php echo $desc; ?></div>
                            </a>
                          </div>  
                      <?php endwhile; endif; ?>  

                    </div>

                </div>                    
            </div>
        </div>

    </section>

    <!-- Sfârșit Pagină Portfolio -->
0
Toate răspunsurile la întrebare 1
1

Din Documentația Isotope:

HTML:

<ul id="filters">
  <li><a href="#" data-filter="*">afisează tot</a></li>
  <li><a href="#" data-filter=".metal">metal</a></li>
  <li><a href="#" data-filter=".transition">tranziție</a></li>
  <li><a href="#" data-filter=".alkali, .alkaline-earth">alcalin și alcalino-pământos</a></li>
  <li><a href="#" data-filter=":not(.transition)">nu tranziție</a></li>
  <li><a href="#" data-filter=".metal:not(.transition)">metal dar nu tranziție</a></li>
</ul>
<div id="container">
  <div class="element transition metal">...</div>
  <div class="element post-transition metal">...</div>
  <div class="element alkali metal">...</div>
  <div class="element transition metal">...</div>
  <div class="element lanthanoid metal inner-transition">...</div> 
  <div class="element halogen nonmetal">...</div> 
  <div class="element alkaline-earth metal">...</div>
  ...
</div>

Logica JS:

// stochează containerul
var $container = $('#container');
// inițializează isotope
$container.isotope({
  // opțiuni...
});

// filtrează elementele când se face clic pe linkul de filtrare
$('#filters a').click(function(){
  var selector = $(this).attr('data-filter');
  $container.isotope({ filter: selector });
  return false;
});

Se pare că ai omis atributul "data-filter" pe linkurile de filtrare și clasa pentru filtrare în interiorul atributului class al elementelor tale de postare Puteți afișa slug-ul categoriei în atributul "data-filter" și aceeași valoare pe atributul class al elementelor tale de postare.

ACTUALIZARE

Conform noilor răspunsuri,

index.php

<!-- Preluat din index.php -->

<!-- Începe Filtre -->
<?php
    $taxonomy = 'portfolio_categories';
    $terms = get_terms($taxonomy); // Obține toți termenii unei taxonomii

    if ( $terms && !is_wp_error( $terms ) ) :


?>


<ul class="option-set" data-option-key="filter"> 
  <li class="filter-icon hidden-phone">&#0065;</li> 
  <li><a href="#" data-option-value="*">Toate</a></li> 
  <?php foreach ( $terms as $term ) { ?> 
  <li><a data-option-value=".<?php echo $term->slug; ?>" href="#" ><?php echo $term->name; ?></a></li> 
<?php } ?> 
</ul>
<?php endif;?>
<!-- Sfârșit Filtre -->

<!-- Începe Bucla Elemente Portofoliu -->
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>


<?php  
    $title= str_ireplace('"', '', trim(get_the_title()));  
    $desc= str_ireplace('"', '', trim(get_the_content()));

    /*
     * Notă: funcția get_the_terms() recuperează toți termenii unei taxonomii care aparțin postului.
     * Returnează: (array|false|wp_error)
     *  1. array de obiecte termeni
     *  2. false dacă nu există termeni în taxonomie
     *  3. obiect wp_error dacă taxonomia dată este invalidă
     */

    $termsObj = get_the_terms( $post->ID, 'portfolio_categories' );
    if ( $termsObj && !is_wp_error( $termsObj ) ) :
        //Avem nevoie doar de slug-ul acestui/acestor termen(i) așa că parcurgem rezultatul pentru a extrage doar valoarea slug și o stocăm într-un nou array
        $terms = array();
        foreach( $termsObj as $obj ){
            $terms[] = $obj->slug;
        }
        //Unim sau implodăm noul array într-un șir și apoi îl punem în atributul class al elementului de portofoliu
        $termsString = join( ' ', $terms);
    endif;
?>     

<div class="item post item span4 isotope-item <?php echo $termsString; ?>">
    <a class="project-wrp fancybox" title="<?=$title?>" rel="lightbox[work]" href="<?php print portfolio_thumbnail_url($post->ID) ?>">
        <div class="profile-photo"><div class="profile-icon">&#0102;</div><?php the_post_thumbnail(array('230','170'),array('alt' => '')); ?> </div>  
        <div class="project-name"><?php echo $title; ?></div>
        <div class="project-client"><?php echo $desc; ?></div>
    </a>
</div>  

<?php endwhile; endif; ?>
<!-- Sfârșit Bucla Elemente Portofoliu -->
7 aug. 2013 13:21:51
Comentarii

haideți să continuăm această discuție în chat

Laniakea Laniakea
7 aug. 2013 23:46:59