WordPress și filtrarea cu Isotope

8 mar. 2012, 22:53:37
Vizualizări: 16K
Voturi: 4

Încerc să utilizez Isotope(http://isotope.metafizzy.co/) pentru a filtra postările mele WordPress, http://i44.tinypic.com/fco55k.jpg așa arată site-ul meu și aș dori să filtrez postările în funcție de categoria postării, așa că trebuie să adaug un nume de clasă fiecărui post și apoi să le filtrez folosind Isotope.

  <li><a href="#" data-filter="*">arată toate</a></li>
  <li><a href="#" data-filter=".design">design</a></li>
  <li><a href="#" data-filter=".typo">tipografie</a></li>

acestea sunt numele categoriilor mele, iar apoi aș dori să adaug numele clasei unui post în funcție de categoria în care se află.

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

și JavaScript-ul pe care îl folosesc

    <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
Comentarii

Bine ați venit pe WPSE! Puteți, vă rog, să clarificați întrebarea dumneavoastră pentru a explica mai bine care este exact problema, problema sau întrebarea dumneavoastră? Ce încercați să realizați? Ce nu funcționează corect/conform așteptărilor?

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

Nu este chiar o întrebare despre WordPress. Verificați documentația isotope. Marcajul dumneavoastră nu este corect, postările trebuie să fie înfășurate într-un div cu o clasă care corespunde claselor din meniul de filtrare.

Chris_O Chris_O
8 mar. 2012 23:32:17

isotope funcționează perfect, toate postările mele sunt aliniate frumos folosind-o, dar aș dori să filtrez postările în funcție de o categorie de postare, așa că trebuie să adaug un nume de clasă fiecărei postări și apoi să o filtrez folosind isotope

dinosauuur dinosauuur
8 mar. 2012 23:41:23

"aș dori să filtrez postări în funcție de o categorie de postare, așa că trebuie să adaug un nume de clasă fiecărei postări și apoi să le filtrez folosind isotope" - Te rog actualizează întrebarea ta cu această informație, deoarece exprimă mult mai concis ceea ce încerci să realizezi.

Chip Bennett Chip Bennett
9 mar. 2012 00:18:16
Toate răspunsurile la întrebare 5
0

Poți dori să utilizezi această funcție:

Plasează acest cod în fișierul tău 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">Toate elementele</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;
    }

și apoi apelează această funcție în fișierul unde se află containerul tău Isotope.

De exemplu:

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

Va afișa marcajul corect pentru Isotope

Astfel, dacă creezi articole noi în administrarea WordPress și le asociezi categorii, acestea vor apărea și vor putea fi filtrate

16 sept. 2012 13:57:16
1

Și eu am încercat să integrez pluginul jQuery Isotope cu WordPress când am dat peste acest subiect. Dacă mai ai nevoie de ajutor, iată cum am reușit. Metoda mea a fost puțin diferită, deoarece am creat un tip personalizat de postări pentru proiecte pe care voiam să le filtrez după project_categories, care este o taxonomie personalizată.

Șablonul de pagină avea nevoie de următorul cod PHP pentru a genera lista #projects-filter și div-ul #projects.

<?php
$terms = get_terms('project_categories');
$count = count($terms);
if ( $count > 0 ){
echo '<ul id="projects-filter">';
echo '<li><a href="#" data-filter="*">Toate</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">Previzualizare live →</a> <a href="<?php the_permalink() ?>">Detalii →</a></p>
            </div>

        <?php endwhile; else: ?>

        <div class="error-not-found">Ne pare rău, nu există intrări în portofoliu momentan.</div>

    <?php endif; ?>


    </div>

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

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

Și iată JavaScript-ul care face 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 mai 2013 17:50:30
Comentarii

Salut Curtis, sunt interesat de răspunsul tău, am încercat codul tău și se pare că tranziția nu este atât de mișto, te rog verifică dacă am omis ceva.

markyeoj markyeoj
13 aug. 2013 10:52:20
3

Mai întâi, înfășurați ieșirea postării într-un <div> și adăugați eticheta de șablon <?php post_class(); ?> acelui <div>.

Deci, schimbați asta:

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

...în asta:

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

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

Acum, dacă citiți intrarea Codex pentru post_class() (legată mai sus), veți vedea că, printre alte clase, această etichetă de șablon aplică o clasă category-{slug}. (Pentru categoriile din exemplul dvs., post_class() ar adăuga category-design sau category-typo.

Deci, atunci ar trebui doar să țintiți category-{slug} pentru a implementa filtrul isotope.

9 mar. 2012 00:33:01
Comentarii

Poți folosi post_class() și pentru elementele a. Nu este nevoie de un div suplimentar.

fuxia fuxia
9 mar. 2012 00:48:17

Adevărat; poți pune post_class() oriunde dorești, de fapt - atâta timp cât este în cadrul Loop-ului. :) Dacă filtrul Isotope necesită ca clasa să fie aplicată pe un anchor, cu siguranță, poți să o pui în interiorul unui tag <a>.

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

Am rezolvat problema punând un tag code în interiorul tag-ului div! Mulțumesc mult!

dinosauuur dinosauuur
9 mar. 2012 00:58:49
0

Nu ești sigur că ai reușit să faci Isotope și filtrele să funcționeze încă??

Cred că ai omis 2 lucruri importante:

  1. Filtrele trebuie să fie încadrate într-o clasă (pentru ca jQuery să poată acționa la click pe linkurile a) astfel:

    <ul id="options">
    <li><a href="#" data-filter="*">arată toate</a></li>
    <li><a href="#" data-filter=".web">web</a></li>
    <li><a href="#" data-filter=".mobile">mobile</a></li>
    </ul>
    

ATENȚIE: valorile data-filter sunt sensibile la majuscule/minuscule (nu vor funcționa dacă nu se potrivesc cu categoriile din WordPress sau cu cele folosite de tine).

  1. Codul jQuery pentru Isotope trebuie adaptat pentru WordPress - să ruleze în modul no-conflict

Iată codul original din documentația Isotope:

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

Iată codul modificat pentru WordPress:

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

ATENȚIE: pune acest cod după restul scriptului tău Isotope și observă că #options este clasa din lista ta de filtre din HTML :)

Poți vedea cum funcționează la damien.co/isotope

Sper că te-am ajutat?

15 iun. 2012 00:18:07
1

Adaugă animationEngnine: 'jquery' - iar animația va fi mai 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
Comentarii

Acesta nu este un răspuns la întrebare...

Nicolai Grossherr Nicolai Grossherr
15 dec. 2013 00:34:15