Add guest management and GDPR privacy compliance (v0.4.0)
All checks were successful
Create Release Package / build-release (push) Successful in 1m26s
All checks were successful
Create Release Package / build-release (push) Successful in 1m26s
- Create Guest CPT with personal info, address, ID/passport tracking - Add guest-booking integration with AJAX search and linking - Implement GDPR compliance via WordPress Privacy API (export/erasure) - Update EmailNotifier to use Guest CPT data with new placeholders - Add CSS styles for guest search, linked display, and privacy UI Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -16,7 +16,9 @@ use Magdev\WpBnb\Booking\EmailNotifier;
|
||||
use Magdev\WpBnb\License\Manager as LicenseManager;
|
||||
use Magdev\WpBnb\PostTypes\Booking;
|
||||
use Magdev\WpBnb\PostTypes\Building;
|
||||
use Magdev\WpBnb\PostTypes\Guest;
|
||||
use Magdev\WpBnb\PostTypes\Room;
|
||||
use Magdev\WpBnb\Privacy\Manager as PrivacyManager;
|
||||
use Magdev\WpBnb\Pricing\Season;
|
||||
use Magdev\WpBnb\Taxonomies\Amenity;
|
||||
use Magdev\WpBnb\Taxonomies\RoomType;
|
||||
@@ -92,6 +94,7 @@ final class Plugin {
|
||||
Building::init();
|
||||
Room::init();
|
||||
Booking::init();
|
||||
Guest::init();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -144,8 +147,12 @@ final class Plugin {
|
||||
// Initialize email notifier.
|
||||
EmailNotifier::init();
|
||||
|
||||
// Initialize privacy manager for GDPR compliance.
|
||||
PrivacyManager::init();
|
||||
|
||||
// Register AJAX handlers.
|
||||
add_action( 'wp_ajax_wp_bnb_check_availability', array( $this, 'ajax_check_availability' ) );
|
||||
add_action( 'wp_ajax_wp_bnb_search_guest', array( $this, 'ajax_search_guest' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -181,7 +188,7 @@ final class Plugin {
|
||||
|
||||
// Check if we're on plugin pages or editing our custom post types.
|
||||
$is_plugin_page = strpos( $hook_suffix, 'wp-bnb' ) !== false;
|
||||
$is_our_post_type = in_array( $post_type, array( Building::POST_TYPE, Room::POST_TYPE, Booking::POST_TYPE ), true );
|
||||
$is_our_post_type = in_array( $post_type, array( Building::POST_TYPE, Room::POST_TYPE, Booking::POST_TYPE, Guest::POST_TYPE ), true );
|
||||
$is_edit_screen = in_array( $hook_suffix, array( 'post.php', 'post-new.php' ), true );
|
||||
|
||||
if ( ! $is_plugin_page && ! ( $is_our_post_type && $is_edit_screen ) ) {
|
||||
@@ -235,6 +242,10 @@ final class Plugin {
|
||||
'nights' => __( 'nights', 'wp-bnb' ),
|
||||
'night' => __( 'night', 'wp-bnb' ),
|
||||
'calculating' => __( 'Calculating price...', 'wp-bnb' ),
|
||||
'searchingGuests' => __( 'Searching...', 'wp-bnb' ),
|
||||
'noGuestsFound' => __( 'No guests found', 'wp-bnb' ),
|
||||
'selectGuest' => __( 'Select', 'wp-bnb' ),
|
||||
'guestBlocked' => __( 'Blocked', 'wp-bnb' ),
|
||||
),
|
||||
)
|
||||
);
|
||||
@@ -875,6 +886,68 @@ final class Plugin {
|
||||
wp_send_json_success( $result );
|
||||
}
|
||||
|
||||
/**
|
||||
* AJAX handler for searching guests by email.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function ajax_search_guest(): void {
|
||||
check_ajax_referer( 'wp_bnb_admin_nonce', 'nonce' );
|
||||
|
||||
if ( ! current_user_can( 'edit_posts' ) ) {
|
||||
wp_send_json_error(
|
||||
array( 'message' => __( 'You do not have permission to perform this action.', 'wp-bnb' ) )
|
||||
);
|
||||
}
|
||||
|
||||
$search = isset( $_POST['search'] ) ? sanitize_text_field( wp_unslash( $_POST['search'] ) ) : '';
|
||||
|
||||
if ( strlen( $search ) < 2 ) {
|
||||
wp_send_json_success( array( 'guests' => array() ) );
|
||||
}
|
||||
|
||||
// Search by email or name.
|
||||
$guests = get_posts(
|
||||
array(
|
||||
'post_type' => Guest::POST_TYPE,
|
||||
'post_status' => 'publish',
|
||||
'posts_per_page' => 10,
|
||||
'meta_query' => array(
|
||||
'relation' => 'OR',
|
||||
array(
|
||||
'key' => '_bnb_guest_email',
|
||||
'value' => $search,
|
||||
'compare' => 'LIKE',
|
||||
),
|
||||
array(
|
||||
'key' => '_bnb_guest_first_name',
|
||||
'value' => $search,
|
||||
'compare' => 'LIKE',
|
||||
),
|
||||
array(
|
||||
'key' => '_bnb_guest_last_name',
|
||||
'value' => $search,
|
||||
'compare' => 'LIKE',
|
||||
),
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
$results = array();
|
||||
foreach ( $guests as $guest ) {
|
||||
$status = get_post_meta( $guest->ID, '_bnb_guest_status', true ) ?: 'active';
|
||||
$results[] = array(
|
||||
'id' => $guest->ID,
|
||||
'name' => Guest::get_full_name( $guest->ID ),
|
||||
'email' => get_post_meta( $guest->ID, '_bnb_guest_email', true ),
|
||||
'phone' => get_post_meta( $guest->ID, '_bnb_guest_phone', true ),
|
||||
'status' => $status,
|
||||
);
|
||||
}
|
||||
|
||||
wp_send_json_success( array( 'guests' => $results ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Twig environment.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user