Wie eine ‚query_posts‘ Funktion von benutzerdefinierten Feld zu sortieren, während Beiträge von anderen benutzerdefinierten Feldbegrenzungs

StackOverflow https://stackoverflow.com/questions/4111255

  •  29-09-2019
  •  | 
  •  

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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top