it-swarm-es.com

¿Ordenar publicaciones de WordPress a través de valores de campos personalizados?

Ok, entonces estoy usando la clase de WPAlchemy para crear paneles de escritura de campos personalizados en la publicación de escritura página, y hasta ahora todo ha ido bien ... Sin embargo, hay un problema que parece que no puedo resolver. Estoy tratando de usar los valores de campo personalizados de "fechas de eventos" para ordenar eventos en una plantilla de página personalizada.

Seguí las instrucciones "Consulta basada en campo personalizado y ordenadas por valor" que se encuentran en el códice para probar y ¿Configurar la consulta personalizada, pero no parece estar funcionando?

Aquí está el código de la plantilla de página personalizada para la página " Eventos ":

<?php
/* 
  Template Name: Events
*/
get_header();
?>
<div id="depthead" class="grid_12">
  <h2>Upcoming Events</h2>
</div><!--/depthead-->
<?php

$querystr = "
  SELECT wposts.* 
  FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
  WHERE wposts.ID = wpostmeta.post_id 
  AND wpostmeta.meta_key = '_events_meta[event_date]' 
  AND wposts.post_type = 'post'

  ORDER BY wpostmeta.meta_value DESC
";
$pageposts = $wpdb->get_results($querystr, OBJECT);

?>
<?php if ($pageposts): global $post; $cnt=0; foreach ($pageposts as $post): $cnt++; setup_postdata($post); ?>
<div id="article-<?php echo get_the_ID(); ?>" class="listingbox grid_3">
  <div class="deptpostimg">
    <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><img src="<?php echo $events_metabox->get_the_value('event_thumbnail'); ?>" style="outline:1px solid #000" alt="<?php the_title_attribute(); ?>" /><span class="event-date"><?php $events_metabox->the_value('event_date'); ?></span></a>
  </div><!--/deptpostimg-->
  <h4 class="listing-titles"><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h4>
  <div class="excerpt">
    <?php the_excerpt(); ?>
  </div><!--/excerpt-->
</div><!--/article-<?php echo get_the_ID(); ?>-->
<?php if($cnt % 4 == 0) { ?>
<div class="grid_12 rowseparator">
  <hr />
</div><!--/rowseparator-->
<?php } ?>
<?php endforeach; endif; ?>
</div><!--/wrapper-->
<?php get_footer(); ?>

Es como si no estuviera recogiendo las teclas de campo personalizadas ... La clase que estoy usando para crear estos paneles de escritura personalizados los almacena todos como una matriz, de ahí la razón por la que he intentado acceder a ellos usando: _events_meta[event_date]

Tal vez ese sea el problema, pero no sé cómo solucionarlo si es ...

¿Algunas ideas?


EDITAR: Aquí hay una imagen para que pueda ver cómo se almacenan los campos personalizados en la base de datos. Esperemos que eso te ayude a descubrir por qué en la tierra _events_meta[event_date] no funciona en la consulta.

Captura de pantalla de PHPMyAdmin con una consulta de inserción para la base de datos de WordPress http://staticloader.com/phpmyadmin.png

1
Josh

Josh, echa un vistazo a: http://farinspace.com/wpalchemy-metabox-data-storage-modes/ ...

Estoy pensando que cambiaré la forma en que WPAlchemy almacena los valores de forma predeterminada ... haciendo que el modo EXTRACT sea el predeterminado ...

0
farinspace

También tengo un blog con campos personalizados con respecto al evento. Aquí está la consulta que utilicé en combinación con la función query_posts ():

query_posts($query_string . "&meta_key=event_date_end&meta_compare=>=&meta_value=".date('Y-m-d')."&meta_key=event_date_start&orderby=meta_value&order=ASC");

Seleccionará todas las publicaciones con un campo personalizado llamado event_date, lo compara con la fecha actual (para filtrar los eventos antiguos) y los clasificará por otro campo personalizado llamado event_start_date. Espero que el ejemplo complejo le muestre cómo debe usar la función query_posts () correctamente.

Una selección simple que solo prueba la existencia de un campo personalizado se ve así:

query_posts('meta_key=event_date'); 

Un simple ORDER BY un campo personalizado se ve así:

query_posts('meta_key=event_date&orderby=meta_value&order=ASC');

Puede ver muchos ejemplos en la descripción de la API de la función query_posts () .

2
2ndkauboy

Hola @ Josh :

Su consulta funciona bien. Es probable que su variable $events_metabox no esté dentro del alcance y que su código simplemente falle (extrañamente aún corre el pie de página, no sé por qué). Para solucionarlo primero intente configurarlo como global en la parte superior de su plantilla:

global $events_metabox

Si eso no funciona, tendrá que rastrear el problema de otra manera, ya que no sé qué está haciendo su código con $events_metabox.

Depuración usando eliminación incremental y print_r()

Cuando te encuentras con un problema como este, comienza a quitar las piezas hasta que resuelvas el problema. Si está intentando ver si su consulta está funcionando o no, use print_r() para volcar los valores envueltos en las etiquetas <pre> para que pueda ver lo que está sucediendo, es decir:

<?php
$pageposts = $wpdb->get_results($querystr, OBJECT);
echo '<pre>';
print_r($pageposts);
echo '<pre>';

Además, use get_posts() en lugar de Direct SQL

Dicho esto, yo altamente recomiendo que reemplace su consulta con una llamada get_posts(). Es una práctica recomendada en WordPress que use siempre la API de WordPress y sus funciones de consulta y nunca use SQL directo a menos que no haya absolutamente ninguna forma alrededor. Obtiene muchos beneficios, incluido el almacenamiento en caché incorporado en algunos casos, manejan cosas como asegurarse de que solo se muestren las publicaciones publicadas a menos que usted indique lo contrario, y es menos probable que se rompa si cambian la estructura de la base de datos en el futuro.

Aquí está la llamada get_posts() que necesitaría para reemplazar su consulta SQL codificada (con algunas advertencias ):

$pageposts = get_posts('meta_key=_events_meta[event_date]&orderby=meta_value&order=ASC');

O este equivalente hace exactamente lo mismo:

$pageposts = get_posts(array(
  'meta_key' => '_events_meta[event_date]',
  'orderby'  => 'meta_value',
  'order'    => 'ASC',
));

Las advertencias que mencioné son que su consulta no eliminó borradores, borradores, etc. mi conjetura es lo que get_posts() hace en realidad más de lo que querrías de todos modos.

El Codex Docs para get_posts()

La documentación para get_posts() está aquí:

Pero curiosamente la mejor documentación para los argumentos de get_posts() está en la página query_posts() que probablemente también podría usar para sus necesidades. Prefiero el mayor control de get_posts() pero YMMV .

De todos modos, query_posts() en realidad solo llama a get_posts() por lo que los argumentos son realmente idénticos:

0
MikeSchinkel