Wie eine ‚query_posts‘ Funktion von benutzerdefinierten Feld zu sortieren, während Beiträge von anderen benutzerdefinierten Feldbegrenzungs
Frage
Ich bin eine Reihe von Beiträgen in WP mit der folgenden Funktion Abfrage:
<?php
$thirtydays = date('Y/m/d', strtotime('+30 days'));
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts( array(
'post_type' => array('post', 'real-estate'),
'meta_key' => 'Time Available',
'meta_compare' => '<=',
'meta_value' => $thirtydays,
'paged' => $paged ));
?>
Dieser Teil funktioniert gut. Es zieht im Grunde alle meine Real Estate Beiträge, sondern nur Ergebnisse der Rückkehr, die eine ‚Zeit verfügbar‘ von 30 Tagen oder weniger.
Ich muß das auch die Beiträge in aufsteigender Reihenfolge von niedrig bis hoch, um die Daten von einem anderen benutzerdefinierten Feld verwenden, ‚Preis.‘
Jedes Mal, wenn ich fügen Sie den Standard 'orderby' => 'meta_value', 'meta_key' => 'Price'
es nicht mehr zeigt die Ergebnisse innerhalb von 30 Tagen.
Gibt es eine Möglichkeit, diese beiden kombinieren? Und ist es möglich, eine Schaltfläche hinzufügen, die wieder führt die Abfrage und sortiert nach Preis, Schlafzimmer, etc? Oder ist das zu spezifisch für WP?
Lösung
ich glaube, das wird Ihnen wollen Sie brauchen. Es ist eine Klasse namens PostsOrderedByMetaQuery
die WP_Query
erweitert und nimmt neue Argumente 'orderby_meta_key'
und ‚orderby_order'
:
class PostsOrderedByMetaQuery extends WP_Query {
var $posts_ordered_by_meta = true;
var $orderby_order = 'ASC';
var $orderby_meta_key;
function __construct($args=array()) {
add_filter('posts_join',array(&$this,'posts_join'),10,2);
add_filter('posts_orderby',array(&$this,'posts_orderby'),10,2);
$this->posts_ordered_by_meta = true;
$this->orderby_meta_key = $args['orderby_meta_key'];
unset($args['orderby_meta_key']);
if (!empty($args['orderby_order'])) {
$this->orderby_order = $args['orderby_order'];
unset($args['orderby_order']);
}
parent::query($args);
}
function posts_join($join,$query) {
if (isset($query->posts_ordered_by_meta)) {
global $wpdb;
$join .=<<<SQL
INNER JOIN {$wpdb->postmeta} postmeta_price ON postmeta_price.post_id={$wpdb->posts}.ID
AND postmeta_price.meta_key='{$this->orderby_meta_key}'
SQL;
}
return $join;
}
function posts_orderby($orderby,$query) {
if (isset($query->posts_ordered_by_meta)) {
global $wpdb;
$orderby = "postmeta_price.meta_value {$this->orderby_order}";
}
return $orderby;
}
}
Sie würde es so nennen:
$thirtydays = date('Y/m/d', strtotime('+30 days'));
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$query = new PostsOrderedByMetaQuery(array(
'post_type' => array('post', 'real-estate'),
'meta_key' => 'Time Available',
'meta_compare' => '<=',
'meta_value' => $thirtydays,
'paged' => $paged,
'orderby_meta_key' => 'Price',
'orderby_order' => 'DESC',
));
foreach($query->posts as $post) {
echo " {$post->post_title}\n";
}
Sie können die PostsOrderedByMetaQuery
Klasse zu Ihrem Thema des functions.php
Datei kopieren, oder Sie können es innerhalb einer .php
Datei eines Plugins verwenden Sie mit dem Schreiben sein kann.
Wenn Sie es testen wollen schnell habe ich geschrieben eine in sich geschlossene Version des Codes zu Gist, die Sie und kopieren Sie auf Ihren Webserver root als test.php
herunterladen können, für Ihren Anwendungsfall ändern, und dann fordern Sie von Ihrem Browser eine URL wie http://example.com/test.php
verwendet wird.
Hope, das hilft.
-Mike
P. S. Diese Antwort ist sehr ähnlich wie eine Antwort auf Wordpress über gab ich nur antworten , die die Schwester-Site von Stackoverflow ist, wo viele Wordpress-Enthusiasten wie ich Fragen täglich beantworten. Vielleicht möchten Sie dass auch beantworten, weil es ein bisschen mehr Erklärung hat und weil Sie vielleicht sehen Wordpress antworten . Hoffnung, die Sie betrachten werden Ihre Wordpress Fragen über es auch in Zukunft veröffentlichen?
Andere Tipps
Da 'orderby' => 'meta_value'
meta_key
erfordert, und Ihre meta_key
ist bereits im Einsatz für einen Vergleich, ich glaube nicht, dass Sie dies tun können. meta_key
akzeptiert nur einen einzigen Wert und nicht eine Reihe von Optionen. Dies ist definitiv eine Einschränkung, und ich ermutige Sie eine Anfrage zu öffnen, wenn Sie nicht eine Lösung finden.
Was die Taste erneut ausführen, um die Abfrage, können Sie einfach die Seite neu zu laden und eine Abfrage Variable übergeben, die Art zu ändern. Leider müssen Sie noch den ersten Teil Ihrer Frage lösen.
UPDATE
Sie können immer sortieren das zurückgegebene Array selbst PHP.
Auch nicht sicher, was Sie mit der Zeit verfügbar sind, überprüft, aber man könnte einen Filter registrieren, die Sie anpassen die Abfrage ein bisschen weiter add_filter('posts_where', ...);
http://codex.wordpress.org/Function_Reference/query_posts