WordPress y filtrado con Isotope

8 mar 2012, 22:53:37
Vistas: 16K
Votos: 4

Estoy intentando usar Isotope (http://isotope.metafizzy.co/) para filtrar mis publicaciones de WordPress. http://i44.tinypic.com/fco55k.jpg así es como se ve mi sitio. Quiero filtrar las publicaciones según su categoría, por lo que necesito añadir un nombre de clase a cada post y luego filtrarlos usando Isotope.

  <li><a href="#" data-filter="*">mostrar todo</a></li>
  <li><a href="#" data-filter=".design">diseño</a></li>
  <li><a href="#" data-filter=".typo">tipografía</a></li>

Estos son los nombres de mis categorías, y luego quiero añadir el nombre de clase a cada publicación dependiendo de la categoría a la que pertenece.

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

Y el JavaScript que estoy 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
Comentarios

¡Bienvenido a WPSE! ¿Podrías aclarar tu pregunta para explicar mejor cuál es exactamente tu problema, inconveniente o pregunta? ¿Qué estás intentando lograr? ¿Qué no está funcionando correctamente o como esperabas?

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

No es realmente una pregunta sobre WordPress. Revisa la documentación de isotope. Tu marcado no es correcto, las publicaciones deben estar envueltas en un div con una clase que corresponda a las clases en el menú de filtros.

Chris_O Chris_O
8 mar 2012 23:32:17

isotope funciona perfectamente, todas mis publicaciones se muestran correctamente flotando usando isotope, pero me gustaría filtrar las publicaciones según la categoría del post, así que necesito agregar un nombre de clase a cada publicación y luego filtrarlo usando isotope

dinosauuur dinosauuur
8 mar 2012 23:41:23

"me gustaría filtrar publicaciones según una categoría de publicación, así que necesito agregar un nombre de clase a cada publicación y luego filtrarla usando isotope" - Por favor, actualiza tu pregunta con esta información, ya que articula de manera mucho más sucinta lo que estás tratando de lograr.

Chip Bennett Chip Bennett
9 mar 2012 00:18:16
Todas las respuestas a la pregunta 5
0

Puedes usar esta función:

Coloca esto en tu 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">Todos los elementos</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;
    }

y luego llama esta función en el archivo donde está tu contenedor de isotope.

Por ejemplo:

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

Generará el marcado correcto para isotope

Así que si creas nuevas publicaciones en el backend de WordPress y les asignas categorías, aparecerán y serán filtrables

16 sept 2012 13:57:16
1

Yo también he estado intentando integrar el plugin jQuery Isotope con WordPress cuando me encontré con este tema. Si todavía necesitas ayuda, aquí está cómo funcionó. Mi método fue un poco diferente ya que he creado un tipo de entrada personalizado de proyectos que quería filtrar por project_categories, que es una taxonomía personalizada.

La plantilla de página necesitaba el siguiente código PHP para generar la lista #projects-filter y el 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="*">Todos</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">Vista previa →</a> <a href="<?php the_permalink() ?>">Más detalles →</a></p>
            </div>

        <?php endwhile; else: ?>

        <div class="error-not-found">Lo sentimos, no hay entradas de portafolio por ahora.</div>

    <?php endif; ?>


    </div>

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

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

Y aquí está el javascript que hace 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 may 2013 17:50:30
Comentarios

Hola Curtis, estoy interesado en tu respuesta, probé tu código y parece que la transición no es tan genial, por favor revisa si me estoy perdiendo algo.

markyeoj markyeoj
13 ago 2013 10:52:20
3

Primero, envuelve la salida de tu publicación en un <div> y añade la etiqueta de plantilla <?php post_class(); ?> a ese <div>.

Así que cambia esto:

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

...por esto:

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

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

Ahora, si lees la entrada del Codex sobre post_class() (enlazada arriba), verás que, entre otras clases, esta etiqueta de plantilla aplica una clase category-{slug}. (Para tus categorías de ejemplo, post_class() añadiría category-design o category-typo).

Por lo tanto, solo necesitarás apuntar a category-{slug} para implementar el filtro de isotope.

9 mar 2012 00:33:01
Comentarios

Puedes usar post_class() para elementos a también. No es necesario un div adicional.

fuxia fuxia
9 mar 2012 00:48:17

Cierto; puedes colocar post_class() donde quieras, realmente - siempre y cuando esté dentro del Loop. :) Si el filtro de Isotope necesita que la clase se aplique a un enlace, por supuesto, ponlo dentro de una etiqueta <a>.

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

¡Colocar una etiqueta code dentro de la etiqueta div resolvió el problema para mí! ¡Muchas gracias!

dinosauuur dinosauuur
9 mar 2012 00:58:49
0

¿Aún no has logrado que Isotope y los filtros funcionen correctamente?

Hay 2 cosas que creo que pasaste por alto

  1. Los filtros necesitan estar envueltos en una clase (para que jQuery pueda actuar al hacer clic en los enlaces) así:

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

Nota: los data-filter distinguen entre mayúsculas y minúsculas (no funcionarán si no coinciden exactamente con tus categorías de WordPress o lo que estés usando).

  1. El jQuery de Isotope necesita adaptarse para WordPress - para que funcione en modo no-conflicto

Este es el código original de la documentación de Isotope

// filtrar elementos cuando se hace clic en el enlace de filtro
$('#filters a').click(function(){
var selector = $(this).attr('data-filter');
$container.isotope({ filter: selector });
return false;
});

Este es el código modificado para WordPress

// filtrar elementos cuando se hace clic en el enlace de filtro
jQuery('#options a').click(function(){
var selector = jQuery(this).attr('data-filter');
mycontainer.isotope({ filter: selector });
return false;
});

Nota: coloca esto después del resto de tu script de Isotope y ten en cuenta que #options es la clase de tu lista de filtros en el HTML :)

Puedes verlo funcionando en damien.co/isotope

¿Te ha sido de ayuda?

15 jun 2012 00:18:07
1

Añade animationEngnine: 'jquery' - y la animación será más suave.

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
Comentarios

Esto no es una respuesta a la pregunta...

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