it-swarm.com.de

Sortieren einer Abfrage nach benutzerdefiniertem Felddatum

EDIT: Die Frage für mehr Klarheit umformuliert

Ich versuche, nach benutzerdefinierten Meta-Box-Daten zu sortieren, die ich mit der Funktion strtotime in ein Datum konvertiere. Es treten jedoch einige Probleme auf.

Mein Hauptproblem scheint ein catch-22 mit der Funktion strtotime zu sein. Wenn ich strtotime innerhalb der Schleife verwende (siehe unten), kann ich die UNIX-Zeit nicht zum Sortieren nach Datum verwenden. Wenn ich jedoch die strtotime beim Speichern verarbeite (in functions.php), stoße ich auf eine Reihe von Problemen mit dem Aktualisieren/Nicht-Parsen der Meta-Box, wenn der Benutzer den Beitrag bearbeitet oder erneut speichert.

Gibt es eine einfache Lösung dafür? Hier ist der Code ... Ich möchte diese Posts nur in aufsteigender Reihenfolge nach dem benutzerdefinierten Datumsfeld (nicht nach dem Veröffentlichungsdatum) sortieren.

BEARBEITEN: Das Array wurde durch Hinzufügen eines Metaschlüssels korrigiert - Lösung steht noch aus

<!-- The args -->
<?php
$args = array(
    "post_type" => "podcasts",
    "meta-key" => "_date",
    "orderby" => "meta_value",
    "order" => "ASC"
    );
?>

<!-- The Query -->
<?php $podcasts = new WP_Query( $args ); ?>

<!-- The Loop -->
<?php if ( $podcasts->have_posts() ) : while ( $podcasts->have_posts() ) : $podcasts->the_post(); ?>

<!-- Convert Date to Date Stamp -->
<?php $podcast_date = get_post_meta($post->ID, '_date', true);?>
<?php $fixed_date = strtotime($podcast_date); ?>

<!-- Content -->

BEARBEITEN: Relevanten Meta-Box-Code (unten) aus functions.php hinzugefügt Hinweis - Dieser Code enthält die Strtotime-Funktion nirgendwo, da ich sie derzeit in der Seitenvorlage verwende. Ich könnte es hier einfügen, bin mir aber nicht sicher, was ich tun soll, damit der Benutzer Beiträge bearbeiten/erneut speichern kann. Wenn die Funktion strtotime beim Speichern ausgeführt wird, ändert sie dann nicht das Meta-Box-Datum in 1327248252? In diesem Fall wird der Beitrag beim nächsten Speichern nicht analysiert, wodurch Probleme entstehen.

// Create podcast Meta boxes

function add_podcast_metaboxes() {
add_meta_box('podcast_info', 'podcast Information', 'podcast_info', 'podcasts',  'normal', 'high');
}

// podcast Meta Box

function podcast_info() {
global $post;

// Noncename needed to verify where the data originated
echo '<input id="podcastmeta_noncename" name="podcastmeta_noncename" type="hidden" value="' .     wp_create_nonce( plugin_basename(__FILE__) ) . '" />';

// Get the data if its already been entered
$week = get_post_meta($post->ID, '_week', true);
$date = get_post_meta($post->ID, '_date', true);
$description = get_post_meta($post->ID, '_description', true);

// Echo out the field
echo '<strong>Week</strong><br /><em>What week of the series is this podcast?</em>';
echo '<input class="widefat" name="_week" type="text" value="' . $week  . '" />';
echo '<strong>Date</strong><br /><em>Enter the Date the podcast was recorded</em>';
echo '<input class="widefat" name="_date" type="text" value="' . $date  . '" />';
echo '<strong>Description</strong><br /><em>Enter the text you would like to display as a description on the media archives list.</em>';
echo '<input class="widefat" name="_description" type="text" value="' . $description  . '" />';

}

// Save the podcast Meta box Data

function save_podcast_meta($post_id, $post) {

// verify this came from the our screen and with proper authorization,
// because save_post can be triggered at other times
if ( !wp_verify_nonce( $_POST['podcastmeta_noncename'], plugin_basename(__FILE__) )) {
return $post->ID;
}

// Is the user allowed to edit the post or page?
if ( !current_user_can( 'edit_post', $post->ID ))
    return $post->ID;

// OK, we're authenticated: we need to find and save the data
// We'll put it into an array to make it easier to loop though.
$podcast_meta['_week'] = $_POST['_week']; 
$podcast_meta['_date'] = $_POST['_date'];
$podcast_meta['_thumbnail'] = $_POST['_thumbnail'];
$podcast_meta['_seriesimg'] = $_POST['_seriesimg'];
$podcast_meta['_description'] = $_POST['_description'];

// Add values of $podcast_meta as custom fields

foreach ($podcast_meta as $key => $value) { // Cycle through the $podcast_meta array!
    if( $post->post_type == 'revision' ) return; // Don't store custom data twice
    $value = implode(',', (array)$value); // If $value is an array, make it a CSV    (unlikely)
    if(get_post_meta($post->ID, $key, FALSE)) { // If the custom field already has a value
        update_post_meta($post->ID, $key, $value);
    } else { // If the custom field doesn't have a value
        add_post_meta($post->ID, $key, $value);
    }
    if(!$value) delete_post_meta($post->ID, $key); // Delete if blank
}

}
add_action('save_post', 'save_podcast_meta', 1, 2); // save the custom fields
4
timshutes

EDIT: Dein Problem ist folgendes:

Wenn Sie Ihre Metadaten speichern, soll das Datum als strtotime()-Datum gespeichert werden, das Datum soll jedoch wieder im alten Y-m-d-Format angezeigt werden. Sie müssen es als strtotime() speichern. Wenn Sie den Text dann wieder in der Eingabe anzeigen, müssen Sie diese strtotime() umkehren, damit er ordnungsgemäß angezeigt werden kann. Du kannst es so machen:

Ändern Sie in Ihrer Funktion add_podcasts_metaboxes() die Zeile, in der das Datum angezeigt wird, in diese Zeile (vorausgesetzt, das Datum ist immer ein UNIX-Zeitstempel, wenn es einen Satz gibt):

$date = get_post_meta( $post->ID, '_date', true );
if( $date != '' )
    $date = date( 'Y-m-d', $date );

Und wenn Sie das Meta in save_podcast_meta() speichern, tun Sie es wie Sie es mit strtotime() wollen:

$podcast_meta['_date'] = strtotime( $_POST['_date'] );

Dies würde das Datum in einen UNIX-Zeitstempel in der Datenbank umwandeln, aber mit der Funktion date() können Sie diesen UNIX-Zeitstempel wieder in ein Datum umwandeln, das Sie verwenden können.


Sie müssen einen Metaschlüssel angeben und dann nach meta_value wie folgt bestellen:

<!-- The args -->
<?php
$args = array(
    "post_type" => "podcasts",
    "meta_key" => "some_meta_key", // Change to the meta key you want to sort by
    "orderby" => "meta_value_num", // This stays as 'meta_value' or 'meta_value_num' (str sorting or numeric sorting)
    "order" => "ASC"
    );
?>

<!-- The Query -->
<?php $podcasts = new WP_Query( $args ); ?>

<!-- The Loop -->
<?php if ( $podcasts->have_posts() ) : while ( $podcasts->have_posts() ) : $podcasts->the_post(); ?>

<!-- Convert Date to Date Stamp -->
<?php $podcast_date = get_post_meta($post->ID, '_date', true);?>
<?php $fixed_date = strtotime($podcast_date); ?>

<!-- Content -->

Siehe diese Seite des Codex als Referenz: http://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters

BEARBEITEN: Ich sehe ein (mögliches) Problem mit Ihrem soeben hinzugefügten Meta-Box-Code. Nicht 100% sicher!

Versuchen Sie, Folgendes zu ersetzen:

echo '<input id="podcastmeta_noncename" name="podcastmeta_noncename" type="hidden" value="' .     wp_create_nonce( plugin_basename(__FILE__) ) . '" />';

mit:

wp_nonce_field( plugin_basename( __FILE__ ), 'podcastmeta_noncename' );

Ich bin mir nicht sicher, ob dies Ihr Problem löst oder einen großen Unterschied macht, aber so verwende ich nonce in meinen Meta-Boxen (obwohl ich glaube, dass es eine andere Möglichkeit gibt, um diese Notice loszuwerden, wenn Sie haben WP_DEBUG auf true gesetzt).

6
Jared

Sie sehen sich einem ähnlichen Problem gegenüber, und ich habe versucht, Ihre angebotenen Lösungen zu verarbeiten/zu manipulieren, ohne dass Ergebnisse erzielt wurden.

Am Ende habe ich http://tablesorter.com/docs verwendet und meine Meta-Box-Daten direkt in den Tabellenspalten abgefragt. Das hat einwandfrei funktioniert und auch Termine automatisch entsprechend sortiert.

Hoffe das hilft...

1
Dan

Die Antworten oben sind großartig. Eine weitere nützliche Taktik ist, dass Sie, wenn Sie bereits über ein Array von Daten verfügen, serverseitig (vs. datenbankseitig) sortieren können mit PHPs usort, uasort und uksort .

Dazu übergeben Sie das Array als erstes Argument und geben der Methode als zweites den Namen einer Funktion, die später als Rückruf verwendet wird. Diese Funktion muss nur 1, 0 oder -1 zurückgeben, um nach einem benutzerdefinierten Rezept zu sortieren.

1
editor

Mir ist klar, dass ich das in meinen ursprünglichen Beitrag einfügen sollte - aber es wird sehr voll, und dies bietet sich für eine Antwort an.

Ich suche so etwas:

http://www.designhammer.com/blog/sorting-events-date-using-wordpress-custom-post-types

Allerdings bin ich noch nicht so weit fortgeschritten, dass ich das, was er tut, auf meine Situation anwenden kann. Es scheint, als füge er der Datei functions.php eine Logik hinzu, bei der die Funktion strtotime nur ausgelöst wird, wenn die Zeit in einem guten Format vorliegt. Das würde mein Problem lösen und es mir ermöglichen, am vorderen Ende zu sortieren.

Gedanken?

0
timshutes