So sortieren Sie eine ‘query_posts’-Funktion nach benutzerdefiniertem Feld, während Posts durch ein anderes benutzerdefiniertes Feld eingeschränkt werden

Lesezeit: 5 Minuten

So sortieren Sie eine query posts Funktion nach benutzerdefiniertem Feld wahrend Posts
nurein

Ich frage eine Reihe von Beiträgen in WP mit der folgenden Funktion ab:

<?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 einwandfrei. Es zieht im Grunde alle meine Immobilien-Beiträge, gibt aber nur Ergebnisse zurück, die eine „Verfügbare Zeit“ von 30 Tagen oder weniger haben.

Ich brauche dies, um die Posts auch in aufsteigender Reihenfolge von niedrig nach hoch zu ordnen, indem ich die Daten aus einem anderen benutzerdefinierten Feld, “Preis”, verwende.

Immer wenn ich den Standard hinzufüge 'orderby' => 'meta_value', 'meta_key' => 'Price' Es zeigt innerhalb von 30 Tagen keine Ergebnisse mehr an.

Kann ich die beiden irgendwie kombinieren? Und ist es möglich, eine Schaltfläche hinzuzufügen, die die Abfrage erneut ausführt und nach Preis, Schlafzimmer usw. sortiert? Oder ist das zu spezifisch für WP?

1646313548 92 So sortieren Sie eine query posts Funktion nach benutzerdefiniertem Feld wahrend Posts
Mike Scheinkel

Ich glaube, dies wird Ihnen das bieten, was Sie brauchen. Es ist eine Klasse namens PostsOrderedByMetaQuery das erstreckt sich WP_Query und akzeptiert 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;
  }
}

Du würdest 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 kopieren PostsOrderedByMetaQuery Klasse zu Ihrem Thema functions.php Datei, oder Sie können es innerhalb einer verwenden .php Datei eines Plugins, das Sie möglicherweise schreiben.

Wenn Sie es schnell testen möchten, habe ich es gepostet eine eigenständige Version des Codes zu Gist, die Sie herunterladen und in das Stammverzeichnis Ihres Webservers kopieren können test.phpändern Sie sie für Ihren Anwendungsfall und fordern Sie dann von Ihrem Browser mit einer URL wie an http://example.com/test.php.

Hoffe das hilft.

-Mike

PS Diese Antwort ist sehr ähnlich einer Antwort, die ich gerade bei WordPress Answers gegeben habe, das ist die Schwesterseite von StackOverflow, auf der viele WordPress-Enthusiasten wie ich täglich Fragen beantworten. Sie möchten vielleicht siehe auch diese Antwort weil es ein bisschen mehr Erklärung hat und weil Sie vielleicht sehen möchten WordPress-Antworten. Ich hoffe, Sie erwägen, Ihre WordPress-Fragen zu posten dort auch in zukunft?

  • Ich bin verwirrt, wie ich das umsetzen soll. Wenn ich den Code einfüge, wird nur ein Textblock mit Beitragsnamen angezeigt. Ich habe query_posts verwendet und Felder dynamisch für jeden Beitrag eingefügt (z. B. Ausgewähltes Bild, Titel, Beschreibung, andere benutzerdefinierte Felder usw.). Wie kann ich das hier machen? Ich habe versucht, das “Echo ” {$post->post_title}\n” zu ersetzen;” Teil, aber es funktioniert nicht ganz.

    – nurein

    8. November 2010 um 19:20 Uhr

  • Egal. Ich habe es funktioniert! Das einzige Problem ist, dass ich nicht herausfinden kann, warum die Paginierung nicht angezeigt wird.

    – nurrain

    8. November 2010 um 22:26 Uhr

  • @nurain – Stellen Sie vielleicht eine andere Frage zur Paginierung drüben bei wordpress.stackexchange.com? Stellen Sie sicher, dass Sie den von Ihnen verwendeten Designcode angeben, da Ihre Frage hier nicht genügend Informationen enthält, um Ihre Probleme mit der Paginierung zu verstehen.

    – MikeSchinkel

    9. November 2010 um 2:52 Uhr


Weil 'orderby' => 'meta_value' erfordert meta_keyund dein meta_key bereits für einen Vergleich verwendet wird, glaube ich nicht, dass Sie dies tun können. meta_key akzeptiert nur einen einzelnen Wert und kein Array von Optionen. Dies ist definitiv eine Einschränkung und ich ermutige Sie, eine Anfrage zu öffnen, wenn Sie keine Lösung finden.

Was die Schaltfläche zum erneuten Ausführen der Abfrage angeht, könnten Sie die Seite einfach neu laden und eine Abfragevariable übergeben, um die Sortierung zu ändern. Leider müssen Sie den ersten Teil Ihrer Frage noch lösen.

AKTUALISIEREN

Sie können das zurückgegebene Array jederzeit selbst mit PHP sortieren.

Sie sind sich auch nicht sicher, was Sie mit der verfügbaren Zeit überprüfen, aber Sie könnten einen Filter registrieren, der Ihnen helfen kann, die Abfrage etwas weiter anzupassen add_filter('posts_where', ...); http://codex.wordpress.org/Function_Reference/query_posts

923780cookie-checkSo sortieren Sie eine ‘query_posts’-Funktion nach benutzerdefiniertem Feld, während Posts durch ein anderes benutzerdefiniertes Feld eingeschränkt werden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy