web-dev-qa-db-fra.com

Trier les publications WordPress via des valeurs de champ personnalisées?

Ok, j'utilise donc la classe de la classe WPAlchemy pour créer des panneaux d'écriture de champs personnalisés dans la page d'écriture de l'article. et jusqu’à présent, tout s’est très bien passé ... Cependant, il ya un problème que je n'arrive pas à résoudre. J'essaie d'utiliser les valeurs de champ personnalisées de "dates d'événement" pour trier les événements sur un modèle de page personnalisé.

J'ai suivi les instructions "Requête basée sur un champ personnalisé et trié par valeur" trouvées dans le codex pour essayer configurer la requête personnalisée, mais cela ne semble pas fonctionner?

Voici le code du modèle de page personnalisé pour la page " Événements ":

<?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(); ?>

C'est comme si on ne récupérait pas les clés de champs personnalisés ... La classe que j'utilise pour créer ces panneaux d'écriture personnalisés les stocke tous sous forme de tableau, d'où la raison pour laquelle j'ai tenté d'y accéder à l'aide de: _events_meta[event_date]

Peut-être que c'est le problème, mais je ne sais pas comment le résoudre si c'est ...

Des idées?


EDIT:Voici une image pour que vous puissiez voir comment les champs personnalisés sont stockés dans la base de données. J'espère que cela vous aidera à comprendre pourquoi _events_meta[event_date] ne fonctionnera pas dans la requête?

Capture d'écran de PHPMyAdmin avec une requête d'insertion pour la base de données WordPress http://staticloader.com/phpmyadmin.png

1
Josh

Josh, regardez: http://farinspace.com/wpalchemy-metabox-data-storage-modes/ ...

Je pense que je vais changer la façon dont WPAlchemy stocke les valeurs par défaut ... rendant le mode EXTRACT par défaut ...

0
farinspace

J'ai aussi eu un blog avec des champs personnalisés concernant l'événement. Voici la requête que j'ai utilisée en combinaison avec la fonction 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");

Il sélectionnera toutes les publications ayant un champ personnalisé nommé event_date, le comparera à la date du jour (pour filtrer les anciens événements) et les triera selon un autre champ personnalisé appelé event_start_date. J'espère que cet exemple complexe vous montre comment utiliser correctement la fonction query_posts ().

Une sélection simple qui teste uniquement l'existence d'un champ personnalisé ressemble à ceci:

query_posts('meta_key=event_date'); 

Un simple ORDER BY un champ personnalisé ressemble à ceci:

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

Vous pouvez voir de nombreux exemples dans la description de l'API de la fonction query_posts () .

2
2ndkauboy

Bonjour @ Josh :

Votre requête fonctionne correctement. Il est probable que votre variable $events_metabox ne soit pas dans la portée et que votre code échoue (étrangement, il exécute toujours le pied de page, mais je ne sais pas pourquoi.) essayez de le définir en tant que global en haut de votre modèle:

global $events_metabox

Si cela ne fonctionne pas, vous devrez suivre le problème d'une autre manière, car je ne sais pas ce que votre code fait avec $events_metabox.

Débogage à l'aide de la suppression incrémentielle et de print_r()

Lorsque vous rencontrez un problème comme celui-ci, commencez par enlever des morceaux jusqu'à ce que vous résolviez le problème. Si vous essayez de voir si votre requête fonctionne ou non, utilisez une print_r() pour vider les valeurs encapsulées dans les balises <pre> afin de voir ce qui se passe, c'est-à-dire:

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

Utilisez également get_posts() au lieu de Direct SQL

Cela dit, je vous recommande vivement de remplacer votre requête par un appel get_posts(). Dans WordPress, il est recommandé d’utiliser toujours l’API WordPress et ses fonctions de requête et n’utilisent jamais le code SQL direct , sauf s’il n’ya absolument aucun moyen de le faire. autour de. Vous bénéficiez de nombreux avantages, y compris la mise en cache intégrée dans certains cas, ils veillent notamment à ce que seules les publications publiées soient affichées, sauf indication contraire de votre part, et il est moins susceptible de se rompre si elles modifient la structure de la base de données à l'avenir.

Voici l'appel get_posts() dont vous auriez besoin pour remplacer votre requête SQL codée en dur (avec certaines mises en garde ):

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

Ou cet équivalent fait exactement la même chose:

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

Les mises en garde que j'ai mentionnées sont que votre requête n'a pas filtré les brouillons, non publiés, etc.; Je suppose que ce que get_posts() fait réellement de plus que ce que vous voudriez de toute façon.

Documents du Codex pour get_posts()

La documentation de get_posts() est ici:

Mais il est intéressant de noter que la meilleure documentation pour les arguments get_posts() se trouve sur la page query_posts() que vous pourriez également utiliser pour vos besoins. Je préfère le plus grand contrôle de get_posts() mais YMMV .

Quoi qu'il en soit, query_posts() appelle en réalité get_posts() et les arguments sont donc identiques:

0
MikeSchinkel