/* ========================================== START BOOK AJAX ACTION ========================================== */ /** * Start a Monthly Book for the current logged-in member. * * @return void */ function mpp_ajax_start_cottage_book() { check_ajax_referer( 'mpp_cottage_room', 'nonce' ); if ( ! is_user_logged_in() ) { wp_send_json_error( array( 'message' => 'You must be logged in to start a book.', ), 401 ); } $book_id = isset( $_POST['book_id'] ) ? absint( $_POST['book_id'] ) : 0; if ( ! $book_id || 'cottage_book' !== get_post_type( $book_id ) ) { wp_send_json_error( array( 'message' => 'This Monthly Book could not be found.', ), 400 ); } if ( ! mpp_is_book_available( $book_id ) ) { wp_send_json_error( array( 'message' => 'This Monthly Book is not available yet.', ), 403 ); } $user_id = get_current_user_id(); if ( ! mpp_start_member_book( $user_id, $book_id ) ) { wp_send_json_error( array( 'message' => 'The Monthly Book could not be started.', ), 500 ); } wp_send_json_success( array( 'message' => 'Your Monthly Book has been started.', 'book_id' => $book_id, 'active_book' => mpp_get_member_active_book( $user_id ), ) ); } add_action( 'wp_ajax_mpp_start_cottage_book', 'mpp_ajax_start_cottage_book' ); /* ========================================== APPROVE PAGE 1 — ADMIN TEST TOOL ========================================== */ /** * Approve Page 1 of the current active Monthly Book. * * Temporary developer tool. * * @return void */ function mpp_ajax_approve_page_one() { check_ajax_referer( 'mpp_cottage_room', 'nonce' ); if ( ! is_user_logged_in() || ! current_user_can( 'manage_options' ) ) { wp_send_json_error( array( 'message' => 'Not allowed.', ), 403 ); } $user_id = get_current_user_id(); $book_id = mpp_get_member_active_book( $user_id ); if ( ! $book_id ) { wp_send_json_error( array( 'message' => 'No active Monthly Book.', ), 400 ); } if ( ! mpp_approve_member_page( $user_id, $book_id, 1 ) ) { wp_send_json_error( array( 'message' => 'Page could not be approved.', ), 500 ); } wp_send_json_success( array( 'message' => 'Page approved.', ) ); } add_action( 'wp_ajax_mpp_approve_page_one', 'mpp_ajax_approve_page_one' ); /* ========================================== MARK PAGE REWARD AS SEEN ========================================== */ /** * Mark one approved page reward celebration as seen. * * @return void */ function mpp_ajax_mark_reward_seen() { check_ajax_referer( 'mpp_cottage_room', 'nonce' ); if ( ! is_user_logged_in() ) { wp_send_json_error( array( 'message' => 'You must be logged in.', ), 401 ); } $user_id = get_current_user_id(); $book_id = isset( $_POST['book_id'] ) ? absint( $_POST['book_id'] ) : 0; $page_number = isset( $_POST['page_number'] ) ? absint( $_POST['page_number'] ) : 0; if ( ! $book_id || 'cottage_book' !== get_post_type( $book_id ) || $page_number < 1 || $page_number > 10 ) { wp_send_json_error( array( 'message' => 'Invalid Monthly Book page.', ), 400 ); } $page_data = mpp_get_member_page_progress_entry( $user_id, $book_id, $page_number ); if ( 'approved' !== $page_data['status'] ) { wp_send_json_error( array( 'message' => 'This page has not been approved.', ), 400 ); } $page_data['reward_seen'] = true; if ( ! mpp_save_member_page_progress( $user_id, $book_id, $page_number, $page_data ) ) { wp_send_json_error( array( 'message' => 'The reward could not be marked as seen.', ), 500 ); } wp_send_json_success( array( 'message' => 'Reward marked as seen.', ) ); } add_action( 'wp_ajax_mpp_mark_reward_seen', 'mpp_ajax_mark_reward_seen' ); /* ========================================== RESET MY BOOK PROGRESS — ADMIN TEST TOOL ========================================== */ /** * Reset the current administrator's Monthly Book progress. * * This removes: * - Started Monthly Books * - The currently active Monthly Book * * It does not affect other members. * * @return void */ function mpp_ajax_reset_my_cottage_books() { check_ajax_referer( 'mpp_cottage_room', 'nonce' ); if ( ! is_user_logged_in() || ! current_user_can( 'manage_options' ) ) { wp_send_json_error( array( 'message' => 'You are not allowed to reset book progress.', ), 403 ); } $user_id = get_current_user_id(); $started_meta_key = mpp_get_started_books_meta_key(); $active_meta_key = mpp_get_active_book_meta_key(); $page_progress_meta_key = mpp_get_page_progress_meta_key(); delete_user_meta( $user_id, $started_meta_key ); delete_user_meta( $user_id, $active_meta_key ); delete_user_meta( $user_id, $page_progress_meta_key ); delete_user_meta( $user_id, mpp_get_cottage_unlocked_meta_key() ); /* * Clear WordPress's cached user data so the reset is * reflected immediately on the next page load. */ clean_user_cache( $user_id ); $remaining_started = get_user_meta( $user_id, $started_meta_key, true ); $remaining_active = get_user_meta( $user_id, $active_meta_key, true ); $remaining_page_progress = get_user_meta( $user_id, $page_progress_meta_key, true ); if ( ! empty( $remaining_started ) || ! empty( $remaining_active ) || ! empty( $remaining_page_progress ) ) { wp_send_json_error( array( 'message' => 'The saved book progress was not fully cleared.', ), 500 ); } wp_send_json_success( array( 'message' => 'Your Monthly Book progress has been reset.', ) ); } add_action( 'wp_ajax_mpp_reset_my_cottage_books', 'mpp_ajax_reset_my_cottage_books' ); /* ========================================== SAVE MEMBER ROOM ========================================== */ /** * Save the current member's selected Decoration IDs. * * @return void */ function mpp_save_member_cottage_room() { check_ajax_referer( 'mpp_cottage_room', 'nonce' ); if ( ! is_user_logged_in() ) { wp_send_json_error( array( 'message' => 'You must be logged in.', ), 401 ); } $user_id = get_current_user_id(); $raw_room = isset( $_POST['room'] ) ? wp_unslash( $_POST['room'] ) : ''; $decoded_room = json_decode( $raw_room, true ); if ( ! is_array( $decoded_room ) ) { wp_send_json_error( array( 'message' => 'Invalid room data.', ), 400 ); } $clean_room = array(); foreach ( $decoded_room as $slot => $item_id ) { $slot = sanitize_key( $slot ); $item_id = absint( $item_id ); if ( ! $slot || ! $item_id ) { continue; } if ( 'cottage_item' !== get_post_type( $item_id ) ) { continue; } $is_hidden = (bool) mpp_get_cottage_field( 'hidden_item', $item_id ); if ( $is_hidden || ! mpp_member_owns_item( $user_id, $item_id ) ) { continue; } $clean_room[ $slot ] = $item_id; } update_user_meta( $user_id, 'mpp_cottage_library_room', $clean_room ); wp_send_json_success( array( 'room' => $clean_room, ) ); } add_action( 'wp_ajax_mpp_save_cottage_room', 'mpp_save_member_cottage_room' ); /* ========================================== LOAD MEMBER ROOM ========================================== */ /** * Load the current member's saved Decoration IDs. * * @return void */ function mpp_load_member_cottage_room() { check_ajax_referer( 'mpp_cottage_room', 'nonce' ); if ( ! is_user_logged_in() ) { wp_send_json_error( array( 'message' => 'You must be logged in.', ), 401 ); } $user_id = get_current_user_id(); $saved_room = get_user_meta( $user_id, 'mpp_cottage_library_room', true ); if ( ! is_array( $saved_room ) ) { $saved_room = array(); } $clean_room = array(); foreach ( $saved_room as $slot => $item_id ) { $slot = sanitize_key( $slot ); $item_id = absint( $item_id ); if ( ! $slot || ! $item_id || ! mpp_member_owns_item( $user_id, $item_id ) ) { continue; } $is_hidden = (bool) mpp_get_cottage_field( 'hidden_item', $item_id ); if ( $is_hidden ) { continue; } $clean_room[ $slot ] = $item_id; } wp_send_json_success( array( 'room' => $clean_room, ) ); } add_action( 'wp_ajax_mpp_load_cottage_room', 'mpp_load_member_cottage_room' ); https://dev.moonlightpaperpantry.com/wp-sitemap-posts-page-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-posts-freebies-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-posts-creative_hub-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-posts-info_hub-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-posts-cottage_item-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-posts-cottage_placement-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-posts-cottage_book-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-posts-courses-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-posts-lesson-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-posts-tutor_quiz-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-posts-tutor_assignments-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-taxonomies-freebie_category-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-taxonomies-freebie_tag-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-taxonomies-freebie_filter-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-taxonomies-freebie_use-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-taxonomies-creative_hub_category-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-taxonomies-creative_hub_topic-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-taxonomies-creative_hub_skill-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-taxonomies-info_category-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-taxonomies-item_category-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-taxonomies-dlm_download_category-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-taxonomies-course-category-1.xmlhttps://dev.moonlightpaperpantry.com/wp-sitemap-users-1.xml