get_results( $wpdb->prepare( "SELECT p.ID, p.post_title FROM {$wpdb->posts} p INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id WHERE p.post_type = 'easy_quote' AND p.post_status IN ('publish', 'draft') AND pm.meta_key = '_easy_invoice_quote_expiry_date' AND pm.meta_value < %s AND p.ID NOT IN ( SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_easy_invoice_quote_status' AND meta_value = 'expired' )", $current_date ) ); if ( empty( $expired_quotes ) ) { return; } $updated_count = 0; foreach ( $expired_quotes as $quote ) { // Update the quote status to expired update_post_meta( $quote->ID, '_easy_invoice_quote_status', 'expired' ); $updated_count++; } } /** * Manually trigger quote expiration check * * @since 2.0.0 */ public static function manual_check_expired_quotes() { self::check_expired_quotes(); } /** * Clear the scheduled event on plugin deactivation * * @since 2.0.0 */ public static function clear_schedule() { wp_clear_scheduled_hook( 'easy_invoice_quote_expiration_check' ); } }