it-swarm.com.de

Wp_query: sortiere nach PHP Variable

Hier ist mein Problem:

Für meine Artikel verwende ich einen benutzerdefinierten Beitragstyp "Ausstellungen" und Beiträge für alle anderen Nachrichten. Ich zeige sie in einer Abfrage an ['post_type' = array ('exhibitions', 'posts')].

Der orderby-Parameter für Beiträge sollte dasVeröffentlichungsdatumsein, für Ausstellungen sollte essein/benutzerdefinierter Metawert(Enddatum des Projekts). Auf diese Weise werden Beiträge in der folgenden Reihenfolge angezeigt:

  1. Ausstellung 1 (Erscheinungsdatum: 2.1. 2013, Enddatum: 4.4. 2013)
  2. Beitrag 1 (Erscheinungsdatum: 13.3. 2013)
  3. Ausstellung 2 (Erscheinungsdatum: 1.4. 2012, Enddatum: 1.3. 2013)
  4. Post 2 (Erscheinungsdatum: 28.2. 2013)

PHP Variable aus Datum (Posts) und Enddatum (Ausstellungen) definieren und danach sortieren?

Ich hatte die Idee, die Variable PHP (Enddatum-Metawert für Ausstellungen, Veröffentlichungsdatum für Posts) zu definieren und die wp_query danach zu sortieren.

Gehe ich in die richtige Richtung oder nicht? Wenn ja, wie binde ich die Variable in wp_query ein? Ich habe einige verwandte Artikel/Fragen gefunden, aber bisher hat mir keiner geholfen.

Bestellung nach Filter?

Orderby-Filter klingt auch so: Orderby-Filter @ Wordpress.org-Foren

Vielen Dank!

///

Die Lösungen von Johaness sind genau das, wonach ich gesucht habe. Hier ist meine leicht veränderte Funktion:

function save_sort_meta( $post_id ) {
$prev_val = get_post_meta( $post_id, 'sort_date', true );
/* set value only if not set yet (i.e. if this is a new post and not an update ) */
if ( 'exhibitions' === $_POST['post_type'] ) {
        $my_meta = get_post_meta( $post_id, '_my_meta', true );
    $datum_end_hidden = $my_meta['datum-end-hidden'];
    update_post_meta( $post_id, 'sort_date', $datum_end_hidden);
} else {
    /* using time() assuming "end_date" is a unix timestamp, adjust if not */
    update_post_meta( $post_id, 'sort_date', time());
}
}
add_action( 'save_post', 'save_sort_meta' );

Und hier ist meine Frage:

$args = array(
'showposts' => '22',
'post_type' => array('post','exhibitions'),
'post_status' => 'publish',
'meta_key' => 'sort_date',
'order' => 'DESC',
'orderby' => 'meta_value_num'
);

Aus irgendeinem Grund bleiben "post" -Postings am Ende der wp_query (obwohl, wenn ich den benutzerdefinierten Wert "sort_date" wiedergebe, dieser korrekt angezeigt wird und größer als Ausstellungen ist, sollte dieser "bellow" bleiben).

Hat es einen Zusammenhang damit, dass ich die Aktualisierung des Posts nicht überprüft habe? Ich habe es getan, weil ich die Werte auch beim Update ändern möchte.

Edit: Code oben funktioniert!

Okay, ich habe herausgefunden, wo das Problem liegt - es ist ziemlich peinlich. :) Der Metawert "Enddatum" für "Ausstellung" -Posttypen wurde von jQuery UI Datepicker bereitgestellt, wodurch das Datum in Millisekunden gespeichert wird.

Alles was ich tun musste war, $ datum_end_hidden durch 1000 zu teilen. :)

Vielen Dank!

1
Petr Cibulka

Nach meinem besten Wissen können Sie eine Abfrage nicht nach zwei verschiedenen Parametern sortieren, ohne eine zusätzliche Iteration über die abgerufenen Beiträge durchzuführen.

Da dies im Idealfall vermieden werden sollte, möchte ich einen anderen Ansatz vorschlagen:

Wie wäre es, wenn Sie einen zusätzlichen Metawert "sort_date" oder ähnliches einfügen würden? Speichern Sie dann in Ihrer Speicherroutine entweder das Enddatum der Ausstellung oder das Veröffentlichungsdatum als "sort_date".

Speichern:

function save_sort_meta( $post_id ) {
    $prev_val = get_post_meta( $post_id, 'sort_date', true );
    /* set value only if not set yet (i.e. if this is a new post and not an update ) */
    if ( empty($prev_val) ) {
        if ( 'exhibitions' === $_POST['post_type'] ) {
            update_post_meta( $post_id, 'sort_date', $_POST['end_date'] );
        } else {
            /* using time() assuming "end_date" is a unix timestamp, adjust if not */
            update_post_meta( $post_id, 'sort_date', time() );
        }
    }
}
add_action( 'save_post', 'save_sort_meta' );

Die Abfrage:

$args = array(
    'post_status' => 'publish',
    'post_type' = array( 'exhibitions', 'posts' ),
    'meta_key' => 'sort_date',
    'order' => 'DESC',
    'orderby' => 'meta_value_num'
);
$exhibitions_and_posts = new WP_Query( $args );

Abgesehen davon würde ich empfehlen, dem Beitragstyp einen eindeutigen Namen zu geben.

1
Johannes Pille

Ich bin mir nicht sicher, ob Sie zwei Beitragstypen auf derselben Seite anzeigen möchten, die beide eine andere Sortierreihenfolge verwenden.

Wenn Sie Ausstellungen in einem eigenen Archiv anzeigen, z. B. archive-exhibitions.php, können Sie die Abfrage für diese Seite nach dem von Ihnen definierten Metawert sortieren.

$args = array(
    'post_status' => 'publish',
    'post_type' => 'exhibition',
    'meta_key' => 'project_end_date',
    'orderby' => 'meta_value',
    'order' => 'DESC'
);

$my_own_query = new WP_Query($args);

Ändern Sie natürlich project_end_date, um den Schlüsselnamen des Metawerts für das Projektenddatum wiederzugeben. Ändern Sie orderby in meta_value_num, je nachdem, wie Sie die Variable speichern. meta_value ist wahrscheinlich in Ordnung.

Für die Schleife müssen Sie Folgendes verwenden:

<?php if ($my_own_query->have_posts()) : while ($my_own_query->have_posts()) : $my_own_query->the_post(); ?>

Wenn Sie jetzt dieses Archiv laden ( http://example.com/exhibitions/ ), wird die reguläre WP_Query ignoriert und Ihr my_own_query für die Schleife verwendet.

0
Marc Dingena