Frage

Ok, also benutze ich die Wpalchemy -Klasse Um benutzerdefinierte Feldschreibpaneele auf der Seite "Schreiben" zu erstellen, und bisher ist alles großartig gelaufen ... Es gibt jedoch ein Problem, das ich nicht herausfinden kann. Ich versuche, die benutzerdefinierten Feldwerte von "Ereignisdaten" zu verwenden, um Ereignisse in einer benutzerdefinierten Seitenvorlage zu sortieren.

Ich folgte den Anweisungen "Abfragen basierend auf dem benutzerdefinierten Feld und nach Wert sortiert" Im Codex gefunden, um die benutzerdefinierte Abfrage einzurichten, aber es scheint nicht zu funktionieren?

Hier ist der Code aus der benutzerdefinierten Seitenvorlage für die "Veranstaltungen" Seite:

<?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 ist, als würde es die benutzerdefinierten Feldschlüssel nicht abholen ... die Klasse, mit der ich diese benutzerdefinierten Schreibpanels erstellt habe, speichert sie alle als Array. Daher habe ich versucht, auf sie zuzugreifen, indem ich verwendet habe: _events_meta[event_date]

Vielleicht ist das das Problem, aber ich weiß nicht, wie ich es beheben soll, wenn es ...

Irgendwelche Ideen?


BEARBEITEN: Hier ist ein Bild, sodass Sie sehen können, wie die benutzerdefinierten Felder in der Datenbank gespeichert werden. Hoffentlich hilft Ihnen das heraus, herauszufinden, warum um alles in der Welt _events_meta[event_date] Wird nicht in der Abfrage arbeiten?

Screenshot von PhpMyAdmin mit einer Einfügenabfrage für die WordPress -Datenbank http://staticloader.com/phpmyadmin.png

War es hilfreich?

Lösung

Josh, schau dir an: http://farinspace.com/wpalchemy-metabox-data-storage-modes/ ...

Ich denke, ich werde ändern, wie wpalchemy Werte standardmäßig speichert ... Extract -Modus standardmäßig ...

Andere Tipps

Ich habe auch einen Blog mit benutzerdefinierten Feldern bezüglich der Veranstaltung bekommen. Hier ist die Abfrage, die ich in Kombination mit der Funktion query_posts () verwendet habe:

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

Es wird alle Beiträge mit einem benutzerdefinierten Feld mit dem Namen Event_Date ausgewählt, vergleichen Sie es mit dem aktuellen Datum (um alte Ereignisse herauszufiltern) und sortieren sie nach einem anderen benutzerdefinierten Feld namens Event_Start_Date. Ich hoffe, dass das komplexe Exmaple Ihnen zeigt, wie Sie die Funktion query_posts () korrekt verwenden sollten.

Eine einfache Auswahl, die nur auf die Existenz eines benutzerdefinierten Feldes testet, sieht folgt aus:

query_posts('meta_key=event_date'); 

Eine einfache Reihenfolge eines benutzerdefinierten Feldes sieht Folgendes aus:

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

Sie können viele Beispiele in der sehen API -Beschreibung der Funktion query_posts ().

Hi @Josh:

Ihre Abfrage funktioniert gut. Es ist wahrscheinlich das, was deine $events_metabox Die Variable befindet sich nicht im Bereich und führt dazu, dass Ihr Code nur scheitert (seltsamerweise wird die Fußzeile immer noch ausgeführt, nicht warum.) Um ihn zuerst zu beheben, versuchen Sie es zuerst auf globaler Bestandteile Ihrer Vorlage:

global $events_metabox

Wenn das nicht funktioniert, müssen Sie das Problem auf andere Weise aufspüren, da ich nicht weiß, mit was Ihr Code macht $events_metabox.

Debuggen mit inkrementellem Entfernen und print_r()

Wenn Sie auf ein Problem wie diese stoßen, nehmen Sie Teile weg, bis Sie das Problem beheben. Wenn Sie versuchen zu sehen, ob Ihre Abfrage funktioniert oder nicht, verwenden Sie a print_r() um die in eingewickelten Werte abzuwerfen <pre> Tags, damit Sie sehen können, was passiert, dh:

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

Auch verwenden get_posts() anstelle von direkter SQL

Das heißt, ich würde höchst Empfehlen Sie, Ihre Abfrage durch a zu ersetzen get_posts() Anruf. Es ist eine beste Praxis in WordPress zu Verwenden Sie immer die WordPress -API und es ist Abfragefunktionen und Verwenden Sie niemals direkte SQL Es sei denn, es gibt absolut keinen Weg. Sie erhalten viele Vorteile, einschließlich integriertes Caching in einigen Fällen. Sie behandeln Dinge wie die Sicherstellung, dass nur veröffentlichte Beiträge angezeigt werden, es sei denn, Sie sagen es etwas anderes, und es ist weniger wahrscheinlich, dass sie in Zukunft die Datenbankstruktur ändern.

Hier ist die get_posts() Rufen Sie an, Sie müssen Ihre hartcodierte SQL -Abfrage ersetzen (mit Einige Einschränkungen):

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

Oder dieses Äquivalent tut genau das Gleiche:

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

Das Vorbehalte Ich erwähnte, dass Ihre Abfrage nicht nicht veröffentlicht, Entwürfe usw. herausgefiltert; Meine Vermutung ist was get_posts() Macht es eigentlich mehr, was Sie sowieso wollen?

Die Codex dokumentiert für get_posts()

Die Dokumentation für get_posts() ist hier:

Aber interessant die bessere Dokumentation für get_posts() Argumente sind auf der query_posts() Seite was Sie wahrscheinlich auch für Ihre Bedürfnisse verwenden könnten. Ich bevorzuge die größere Kontrolle von get_posts() aber Ymmv.

Wie auch immer, query_posts() Eigentlich ruft nur an get_posts() Die Argumente sind also wirklich identisch:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit wordpress.stackexchange
scroll top