Question

Ok, donc je suis en utilisant class WPAlchemy pour créer panneaux d'écriture de champs personnalisés dans la page post-écriture, et jusqu'à présent, tout est allé très ... Cependant, il y a une question que je ne peux pas sembler figurer dehors. Je suis en train d'utiliser les valeurs de champs personnalisés de « dates de l'événement » à des événements de tri sur un modèle de page personnalisé.

J'ai suivi les instructions "requête basée sur un champ personnalisé et classés par valeur" trouve dans le codex pour essayer de configurer la requête personnalisée, mais il ne semble pas fonctionner?

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

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

Il est comme ça ne ramasser les clés de champs personnalisés ... La classe que je utilise pour créer ces panneaux écriture personnalisée stocke tous comme un tableau, d'où la raison pour laquelle je l'ai tenté d'accéder à eux en utilisant: _events_meta[event_date]

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

Toutes les idées?


EDIT: Voici une image de sorte que vous pouvez voir à quel point les champs personnalisés sont stockés dans la base de données. Espérons que cela vous aide à comprendre pourquoi le _events_meta[event_date] de la terre ne fonctionnera pas dans la requête?

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

Était-ce utile?

La solution

Josh, jetez un oeil à: http://farinspace.com/wpalchemy- Metabox-stockage de données-modes / ...

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

Autres conseils

J'ai aussi un blog avec des champs personnalisés en ce qui concerne l'événement. Voici la I requête 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 tous les messages avec un champ personnalisé nommé EVENT_DATE comparer avec la date actuelle (pour filtrer les événements anciens) et les trier par un autre champ personnalisé appelé event_start_date. J'espère que des spectacles de exmaple complexes vous, comment vous devez utiliser correctement la fonction (les query_posts).

Une sélection simple qui seul test pour l'existence d'un champ personnalisé ressemble à ceci:

query_posts('meta_key=event_date'); 

Une simple ORDER BY un look de champ personnalisé comme celui-ci:

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

Vous pouvez voir de nombreux exemples dans le .

Salut @Josh :

Votre requête fonctionne très bien. Il est sans doute que votre variable $events_metabox n'est pas dans la portée et la cause de votre code échouerait (étrangement, il court toujours le pied de page, je sais pas pourquoi.) Pour fixer essayer premier réglage à global au sommet de votre modèle:

global $events_metabox

Si cela ne d'une autre façon que je ne sais pas fonctionne pas, vous devrez traquer le problème ce que votre code est en train de faire avec $events_metabox.

Mise au point au moyen du prélèvement incrémental et print_r()

Lorsque vous rencontrez un problème comme celui-ci début enlever des morceaux jusqu'à ce que vous résoudre le problème. Si vous essayez de voir si votre requête fonctionne ou non, utilisez un print_r() pour vider les valeurs enveloppées dans les balises <pre> afin que vous puissiez voir ce qui se passe, i.e..

<?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 très vous recommandons de remplacer votre requête avec un appel get_posts(). Il est une meilleure pratique dans WordPress toujours utiliser l'API de WordPress et il est des fonctions de requête et ne jamais utiliser SQL directe à moins qu'il n'y a absolument rien autour de lui. Vous obtenez de nombreux avantages, notamment intégrés dans la mise en cache dans certains cas, ils traitent des choses comme assurant que les messages publiés sont affichés à moins que vous arrêtiez, et il est moins susceptible de se briser si elles changent la structure de base de données à l'avenir.

Voici l'appel get_posts() vous auriez besoin de remplacer votre hardcoded requête SQL (avec des 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',
));

mises en garde je l'ai mentionné sont que votre requête ne filtrent non publiés, les courants d'air, etc .; je suppose que get_posts() est-ce vraiment plus ce que vous voulez de toute façon.

Le Codex Docs pour get_posts()

La documentation get_posts() est ici:

Mais il est intéressant une meilleure documentation pour les arguments de get_posts() est sur la page query_posts() que vous pouvez utiliser aussi probablement pour vos besoins. Je préfère le contrôle plus de get_posts() mais YMMV .

Quoi qu'il en soit, en fait query_posts() appelle simplement get_posts() si les arguments sont vraiment identiques:

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top