Wordpress e filtraggio con Isotope

8 mar 2012, 22:53:37
Visualizzazioni: 16K
Voti: 4

Sto cercando di utilizzare Isotope (http://isotope.metafizzy.co/) per filtrare i miei post Wordpress. http://i44.tinypic.com/fco55k.jpg questo è come appare il mio sito, vorrei filtrare i post in base alla categoria e per farlo devo aggiungere un nome di classe a ciascun post per poi filtrarli usando Isotope.

  <li><a href="#" data-filter="*">mostra tutto</a></li>
  <li><a href="#" data-filter=".design">design</a></li>
  <li><a href="#" data-filter=".typo">tipografia</a></li>

Questi sono i nomi delle mie categorie, e poi vorrei aggiungere il nome della classe al post in base alla categoria a cui appartiene.

<div id="main">
          <?php
          $args = array('orderby' => 'rand' );
          $random = new WP_Query($args); ?>
          <?php if(have_posts()) : ?><?php while($random->have_posts()) : $random->the_post(); ?>
         <a href="<?php the_permalink() ?>"> <div id="img" class="<?php  $category = get_the_category(); 
                echo $category[0]->cat_name; ?>">
            <?php 
                the_post_thumbnail();?>

            <h1><?php the_title(); ?></h1>
</div></a>

E questo è il JavaScript che sto usando:

    <script type="text/javascript">
jQuery(window).load(function(){
jQuery('#main').isotope({
  masonry: {
    columnWidth: 20
  },

});
$('#filters a').click(function(event){
  var selector = $(this).attr('data-filter');
  $('#main').isotope({ filter: selector });
  return false;
});
});

</script>
4
Commenti

Benvenuto su WPSE! Potresti chiarire la tua domanda, per spiegare meglio qual è esattamente il tuo problema, questione o domanda? Cosa stai cercando di ottenere? Cosa non funziona correttamente/come previsto?

Chip Bennett Chip Bennett
8 mar 2012 23:03:15

Non è proprio una domanda su WordPress. Dai un'occhiata alla documentazione di isotope. Il tuo markup non è corretto, i post devono essere racchiusi in un div con una classe che corrisponda alle classi nel menu dei filtri.

Chris_O Chris_O
8 mar 2012 23:32:17

isotope funziona benissimo, tutti i miei post sono correttamente fluttuati utilizzandolo, ma vorrei filtrare i post in base a una categoria del post, quindi ho bisogno di aggiungere un nome di classe a ogni post e poi filtrarlo usando isotope

dinosauuur dinosauuur
8 mar 2012 23:41:23

"vorrei filtrare i post in base a una categoria di post, quindi ho bisogno di aggiungere un nome di classe a ciascun post e poi filtrarlo utilizzando isotope" - Per favore aggiorna la tua domanda con queste informazioni, poiché esprime in modo molto più conciso ciò che stai cercando di ottenere.

Chip Bennett Chip Bennett
9 mar 2012 00:18:16
Tutte le risposte alla domanda 5
0

Potresti voler utilizzare questa funzione:

Inserisci questo nel tuo functions.php

function isotope_categories() {

        $categories = get_categories();

        $html = '<ul class="filters option-set" data-option-key="filter">';
        $html .= '<li><a href="#filter" data-option-value="*" class="selected">Tutti gli elementi</a></li>';

        foreach ($categories as $category) {

            $html .= "<li><a href='#filter' data-option-value='.category-{$category->category_nicename}'>{$category->cat_name}</a></li>";   
        }

        $html .= '</ul>';

        echo $html;
    }

e poi chiama questa funzione nel file dove si trova il tuo contenitore isotope.

Ad esempio:

<nav class="options">                       
    <?php isotope_categories() ?>
</nav>  

Produrrà il markup corretto per isotope

Quindi se crei nuovi post nel backend di WordPress e associ delle categorie, verranno visualizzati e saranno filtrabili

16 set 2012 13:57:16
1

Anch'io ho cercato di integrare il plugin jQuery Isotope con WordPress quando mi sono imbattuto in questo argomento. Se hai ancora bisogno di aiuto, ecco come ho fatto funzionare il tutto. Il mio metodo era leggermente diverso poiché ho creato un custom post type per i progetti che volevo filtrare per project_categories, una tassonomia personalizzata.

Il template della pagina necessitava del seguente codice PHP per generare la lista #projects-filter e il div #projects.

<?php
$terms = get_terms('project_categories');
$count = count($terms);
if ( $count > 0 ){
echo '<ul id="projects-filter">';
echo '<li><a href="#" data-filter="*">Tutti</a></li>';
foreach ( $terms as $term ) {
    $termname = strtolower($term->name);  
    $termname = str_replace(' ', '-', $termname);  
    echo '<li><a href="#" data-filter="' . '.' . $termname . '">' . $term->name . '</a></li>';
}
echo '</ul>';
}
?>

<?php 
    $loop = new WP_Query(array('post_type' => 'projects', 'posts_per_page' => -1));
    $count =0;
?>

<div id="project-wrapper">
    <div id="projects">

    <?php if ( $loop ) : 

        while ( $loop->have_posts() ) : $loop->the_post(); ?>

            <?php
            $terms = get_the_terms( $post->ID, 'project_categories' );

            if ( $terms && ! is_wp_error( $terms ) ) : 
                $links = array();

                foreach ( $terms as $term ) 
                {
                    $links[] = $term->name;
                }
                $links = str_replace(' ', '-', $links); 
                $tax = join( " ", $links );     
            else :  
                $tax = '';  
            endif;
            ?>

            <?php $infos = get_post_custom_values('wpcf-proj_url'); ?>

            <div class="project-item <?php echo strtolower($tax); ?>">
                <div class="thumb"><a href="<?php the_permalink() ?>"><?php the_post_thumbnail( 'projects-thumb' ); ?></a></div>
                <h3><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h3>
                <p class="excerpt"><a href="<?php the_permalink() ?>"><?php echo get_the_excerpt(); ?></a></p>
                <p class="links"><a href="<?php echo $infos[0]; ?>" target="_blank">Anteprima Live →</a> <a href="<?php the_permalink() ?>">Dettagli →</a></p>
            </div>

        <?php endwhile; else: ?>

        <div class="error-not-found">Spiacenti, al momento non ci sono voci nel portfolio.</div>

    <?php endif; ?>


    </div>

    <div class="clearboth"></div>

</div> <!-- end #project-wrapper-->

Ed ecco il javascript che fa la magia.

jQuery(document).ready(function(){
    var mycontainer = jQuery('#projects');
    mycontainer.isotope({ 
        filter: '*',
        animationOptions: {
            duration: 750,
            easing: 'liniar',
            queue: false,
        }
    }); 

    jQuery('#projects-filter a').click(function(){ 
        var selector = jQuery(this).attr('data-filter'); 
        mycontainer.isotope({ 
            filter: selector,
            animationOptions: {
                duration: 750,
                easing: 'liniar',
                queue: false,
            } 
        }); 
      return false; 
    });
});
1 mag 2013 17:50:30
Commenti

Ciao Curtis, sono interessato alla tua risposta, ho provato il tuo codice e sembra che la transizione non sia così fluida, per favore controlla se sto tralasciando qualcosa.

markyeoj markyeoj
13 ago 2013 10:52:20
3

Per prima cosa, avvolgi l'output del post in un <div> e aggiungi il tag template <?php post_class(); ?> a quel <div>.

Quindi, cambia questo:

<a href="<?php the_permalink() ?>"> <div id="img" class="<?php  $category = get_the_category(); echo $category[0]->cat_name; ?>">
    <?php the_post_thumbnail();?>

    <h1><?php the_title(); ?></h1>
</div></a>

...in questo:

<div <?php post_class(); ?>
    <a href="<?php the_permalink() ?>"> <div id="img">
        <?php the_post_thumbnail();?>

        <h1><?php the_title(); ?></h1>
    </div></a>
</div>

Ora, se leggi la documentazione di post_class() sul Codex (linkata sopra), vedrai che, tra le altre classi, questo tag template applica una classe category-{slug}. (Per le tue categorie di esempio, post_class() aggiungerebbe category-design o category-typo.

Quindi, dovresti solo aver bisogno di puntare a category-{slug} per implementare il filtro isotope.

9 mar 2012 00:33:01
Commenti

Puoi usare post_class() anche per gli elementi a. Non c'è bisogno di un div aggiuntivo.

fuxia fuxia
9 mar 2012 00:48:17

Vero; puoi mettere post_class() dove vuoi, davvero - purché sia all'interno del Loop. :) Se il filtro Isotope ha bisogno che la classe sia applicata a un anchor, allora mettilo pure dentro un tag <a>.

Chip Bennett Chip Bennett
9 mar 2012 00:53:35

Mettere un tag code dentro il tag div ha risolto il problema per me! Grazie mille!

dinosauuur dinosauuur
9 mar 2012 00:58:49
0

Non sei sicuro di aver fatto funzionare Isotope e i filtri ??

Ci sono 2 cose che penso ti siano sfuggite

  1. I Filtri devono essere racchiusi in una classe (in modo che il jquery possa essere attivato dal click sui link a) in questo modo:

    <ul id="options">
    <li><a href="#" data-filter="*">mostra tutto</a></li>
    <li><a href="#" data-filter=".web">web</a></li>
    <li><a href="#" data-filter=".mobile">mobile</a></li>
    </ul>
    

NB i data-filter sono sensibili alle maiuscole/minuscole (quindi non funzioneranno se non corrispondono alle tue categorie di WordPress o a qualsiasi altra cosa tu usi.

  1. Il jquery di isotope deve essere reso sicuro per WordPress - per essere eseguito in modalità no-conflict

Ecco il codice originale dalla documentazione di Isotope

// filtra gli elementi quando viene cliccato il link del filtro
$('#filters a').click(function(){
var selector = $(this).attr('data-filter');
$container.isotope({ filter: selector });
return false;
});

Ecco il codice modificato per WordPress

// filtra gli elementi quando viene cliccato il link del filtro
jQuery('#options a').click(function(){
var selector = jQuery(this).attr('data-filter');
mycontainer.isotope({ filter: selector });
return false;
});

NB inserisci questo dopo il resto del tuo script isotope e nota che #options è la classe della tua lista di filtri nell'HTML :)

Puoi vederlo funzionare su damien.co/isotope

Spero che ti sia stato utile?

15 giu 2012 00:18:07
1

Aggiungi animationEngnine: 'jquery' - e l'animazione sarà più fluida.

var mycontainer = jQuery('#projects');
mycontainer.isotope({ 
    filter: '*',
    animationEngine: 'jquery',
    animationOptions: {
    duration: 350,
    easing: 'linear',
    queue: true
    }
}); 

jQuery('#projects-filter a').click(function(){ 
    var selector = jQuery(this).attr('data-filter'); 
    mycontainer.isotope({ 
        filter: selector,
        animationOptions: {
            duration: 350,
            easing: 'linear',
            queue: true,
        } 
    }); 
  return false; 
});
5 nov 2013 05:05:31
Commenti

Questa non è una risposta alla domanda...

Nicolai Grossherr Nicolai Grossherr
15 dic 2013 00:34:15