Wie schließe ich eine $ wpdb-Abfrage mit Benutzer-Meta an, die den Standardwert verwendet, wenn nicht vorhanden?

Ich implementiere eine neue function auf einer Website, die den Benutzern jede Woche eine bestimmte Menge an Credits zur Verfügung stellt, wenn sie eine bestimmte Mitgliederzahl haben.

Wir verwenden Paid Memberships Pro und MyCred . Beide sind großartige Plugins, die wunderbar funktionieren.

Ich habe eine Routine, die alle Benutzer auf einer bestimmten Ebene abruft, und dann den Benutzermeta nach dem letzten Datum, an dem die Punkte bekannt waren. Diese function wird täglich in einer Cron-Aktion ausgeführt.

Die Abfrage zum Abrufen von Benutzern, die in eine function namens dt_get_pmro_users_at_level und korrekt vorbereitet ist:

 SELECT user_id, startdate FROM wp_pmpro_memberships_users WHERE membership_id IN ( SELECT id FROM wp_pmpro_membership_levels WHERE name = 'Premium' ) AND status = 'active' ???? INNER JOIN wp_usermeta ????? 

Wie schließe ich mich der obigen Abfrage mit der Benutzer-Meta-Prüfung für last_awarded_points_date , wobei startdate als Standardwert verwendet wird (falls nicht vorhanden)?

Der Haken: Es muss abwärtskompatibel sein. Ich muss davon ausgehen, dass einige Benutzer kein last_awarded_points_date Meta haben werden.

Ich bin sicher, es ist ein Spaziergang in einem Park für SQL-Assistenten. Was ich definitiv nicht bin.

Im Moment ziehe ich alle Benutzer aus der database, mache einen anderen DB-Aufruf, um usermeta zu ziehen, konvertiere Daten von MySQL in Unix-Zeitstempel und überprüfe sie einzeln … was sloooooow ist .

Für den Kontext ist dies die ganze Routine:

 function dt_membership_credit_cron( $level_name, $credits ) { // fetches all users // using the query above $users = dt_get_pmpro_users_at_level( $level_name ); // get current time $time_now = current_time( 'timestamp' ); // for each user... foreach ( $users as $user ) { // each $user is a stdClass with // user_id Int // startdate MySQL formated timestamp // get last time $last_time = get_user_meta( $user->user_id, 'dt_last_awarded_points_date', true); // If no last time if ( empty( $last_time ) ) { $last_time = $user->startdate; } // get differece between last time and now $diff = $time_now - strtotime( $last_time); // if difference is smaller than a week in seconds // its not time ... yet. Skip if ( $diff user_id, $credits, 'Credit' ); // update new date update_user_meta( $user->user_id, 'dt_last_awarded_points_date', date( 'Ymd H:i:s', $time_now) ); } } 

Jede Hilfe wird sehr geschätzt. Ich bin sehr offen für Vorschläge, wie dieser Code verbessert werden kann!

Prost!

Solutions Collecting From Web of "Wie schließe ich eine $ wpdb-Abfrage mit Benutzer-Meta an, die den Standardwert verwendet, wenn nicht vorhanden?"