web-dev-qa-db-de.com

Posts, die nach einem Datum verfallen (gelöscht)

Ich erstelle eine Coupon-Site von Grund auf neu. Ich habe viele Codebeispiele im Internet überprüft, aber nichts gefunden, das funktioniert, da meine Anforderungen sich kaum unterscheiden.

Ich benötige Hilfe beim Erstellen einer Ablauffunktion, mit der der "Gutschein" (post_type) automatisch gelöscht wird.

Als Coupon-Site werden alle Coupons in großen Mengen importiert. Daher unterscheidet sich das Ablaufdatum (z. B. 01.12.2014, 01.12.2014 oder 01.12.2014) von Coupon zu Coupon in einem bestimmten Import (einer bestimmten Sitzung). Dies führt zu einem Problem, wenn sich das Datumsformat unterscheidet und es nie dasselbe ist.

Das benutzerdefinierte Feld lautet "expiry_date" und speichert das Datum.

Hat jemand eine gute Lösung für dieses Problem?

1
user2506619

Ich habe vor einiger Zeit etwas Ähnliches gemacht. Ich bin nicht sicher, ob das Löschen eines Beitrags eine gute Lösung ist. Vielleicht können Sie nur den Beitragsstatus in einen benutzerdefinierten Status mit dem Namen "Abgelaufen" ändern. Im folgenden Beispiel wird der Beitrag jedoch gelöscht.

Erstellen Sie zuerst einen täglichen Cron-Job:

add_action( 'wp', 'delete_expired_coupons_daily' );
function delete_expired_coupons_daily() {
    if ( ! wp_next_scheduled( 'delete_expired_coupons' ) ) {
        wp_schedule_event( time(), 'daily', 'delete_expired_coupons');
    }
}
add_action( 'delete_expired_coupons', 'delete_expired_coupons_callback' );

Verwenden Sie dann die Funktion delete_expired_coupons_callback, um die Coupon-Posts zu durchlaufen, nach dem Datum zu suchen und gegebenenfalls zu löschen:

function delete_expired_coupons_callback() {
    $args = array(
        'post_type' => 'coupon',
        'posts_per_page' => -1
    );

    $coupons = new WP_Query($args);
    if ($coupons->have_posts()):
        while($coupons->have_posts()): $coupons->the_post();    

            $expiration_date = get_post_meta( get_the_ID(), 'expiry_date', true );
            $expiration_date_time = strtotime($expiration_date);

            if ($expiration_date_time < time()) {
                wp_delete_post(get_the_ID());
                //Use wp_delete_post(get_the_ID(),true) to delete the post from the trash too.                  
            }

        endwhile;
    endif;
}

Einige Vorschläge: Wenn Sie die Gutscheine importieren, können Sie eine strtotime-Konvertierung durchführen, sodass das Datumsformat in der Datenbank identisch ist. Auf diese Weise müssen Sie nicht alle Posts durchlaufen, um das Ablaufdatum zu überprüfen. Sie können eine benutzerdefinierte Abfrage verwenden, um zu überprüfen, ob das Ablaufdatum abgelaufen ist, sodass der tägliche Job viel schneller ausgeführt wird:

    $args = array(
        'post_type' => 'coupon',
        'posts_per_page' => -1,
        'meta_query' => array(
            array(
               'key' => 'expiry_date',
               'value' => time(),
               'compare' => '<'
            )
        )
    );

Sie können einen Ablaufstatus für Posts erstellen, um diese Posts einfach zu deaktivieren, ohne sie zu löschen: http://codex.wordpress.org/Function_Reference/register_post_status

Und Sie können den Post-Status wie folgt anstelle der Funktion wp_delete_post ändern:

// Update post
$my_post = array();
$my_post['ID'] = get_the_ID();
$my_post['post_status'] = 'expired';

// Update the post into the database
wp_update_post( $my_post );
6
passatgt

Ich würde vorschlagen, CSV in Excel zu öffnen und die Formatierung zu verwenden, um alle Daten in dasselbe Format zu konvertieren und CSV zu speichern, bevor diese für den Import verwendet werden. Dies sollte jegliche Entwicklungsbemühungen vermeiden.

1
AlexG