WordPress y filtrado con Isotope
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>

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

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;
});
});

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.

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.

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

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

¿Aún no has logrado que Isotope y los filtros funcionen correctamente?
Hay 2 cosas que creo que pasaste por alto
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).
- 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?

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;
});
