PluginProbe
Booking Calendar / 11.8.4
Booking Calendar v11.8.4
11.8.4 11.8.3 11.8.2 11.8.1 11.8 11.7 11.6.1 11.6 11.5 11.4.3 11.4.2 11.4.1 11.4 11.3 11.2.1 11.2 11.1 11.0 10.15.7 10.15.6 10.1.3 10.10 10.10.1 10.10.2 10.11 All 204 releases
← All changes | includes/publish/wpbc-create-pages.php +568 -247 11.211.8.4 View file →
@@ -1,4 +1,4 @@
1 1 <?php
2 2 /**
3 3 * @version 1.0
4 4 * @package Booking Calendar
@@ -28,8 +28,13 @@
28 28 * @return false|int - ID of the page.
29 29 */
30 30 function wpbc_create_page( $page_params = array() ){ // FixIn: 9.6.2.10.
31 31
32 + /* Live demos must never create WordPress content through Booking Calendar. */
33 + if ( wpbc_is_booking_form_publishing_restricted() ) {
34 + return false;
35 + }
36 +
32 37 global $wp_rewrite;
33 38 if ( is_null( $wp_rewrite ) ) { // FixIn: 9.7.1.1.
34 39 return false;
35 40 }
@@ -369,10 +374,10 @@
369 374 * Create new page or add to existing page the shortcode
370 375 *
371 376 * @param array $params
372 377 *
373 - * @return array success: [ 'result' => true, 'relative_url' => $relative_post_url, 'message' => __( 'Booking form shortcode embedded into the page.', 'booking' ) ]
374 - * failed: [ 'result' => false, 'message' => __( 'We can not embed booking form shortcode into the page.', 'booking' ) ]
378 + * @return array Success or failure response. Publishing restrictions return a
379 + * failure before WordPress page lookup or mutation.
375 380 *
376 381 * Example:
377 382 * $result_arr = wpbc_add_shortcode_into_page( array(
378 383 * 'shortcode' => '[booking resource_id=1]',
@@ -379,8 +384,15 @@
379 384 * 'post_title' => 'Booking Form'
380 385 * ) );
381 386 */
382 387 function wpbc_add_shortcode_into_page( $params = array() ) {
388 + /* Enforce the publishing policy at the canonical writer for every caller. */
389 + if ( wpbc_is_booking_form_publishing_restricted() ) {
390 + return array(
391 + 'result' => false,
392 + 'message' => __( 'In the demo versions this operation is not allowed.', 'booking' ),
393 + );
394 + }
383 395
384 396 $defaults = array(
385 397 'page_post_name' => '', // 'wpbc-booking',
386 398 'post_title' => esc_html( __( 'Booking Form', 'booking' ) ),
@@ -531,46 +543,287 @@
531 543 * @return array
532 544 */
533 545 function wpbc_get_activation_booking_form_page_configs() {
534 546
535 - return array(
536 - 'full_day_booking' => array(
537 - 'template_key' => 'dates_advanced_3_steps_review_with_hints',
538 - 'form_slug' => 'full_day_booking',
539 - 'form_title' => esc_html__( 'Full Day Booking Form', 'booking' ),
540 - 'page_slug' => 'wp-booking-calendar-full-day',
541 - 'page_title' => esc_html__( 'Full Day Booking', 'booking' ),
542 - 'button_title' => esc_html__( 'Full day booking form', 'booking' ),
547 + return array(
548 + 'full_day_booking' => array(
549 + 'template_key' => 'dates_2_columns_hints_full_days', // 'dates_form_with_inline_hints', // FixIn: 11.8.1.1.
550 + 'form_slug' => 'full_day_booking',
551 + 'form_title' => esc_html__( 'Full Day Booking Form', 'booking' ),
552 + 'page_slug' => 'booking-calendar-full-day',
553 + 'legacy_page_slugs' => array( 'wp-booking-calendar-full-day' ),
554 + 'page_title' => esc_html__( 'Full Day Booking', 'booking' ),
555 + 'button_title' => esc_html__( 'Full day booking form', 'booking' ),
556 + ),
557 + 'time_slots_booking' => array(
558 + 'template_key' => 'time_slots_2_columns_hints',
559 + 'form_slug' => 'time_slots_booking',
560 + 'form_title' => esc_html__( 'Time Slots Booking Form', 'booking' ),
561 + 'page_slug' => 'booking-calendar-time-slots',
562 + 'legacy_page_slugs' => array( 'wp-booking-calendar-time-slots' ),
563 + 'page_title' => esc_html__( 'Time Slots Booking', 'booking' ),
564 + 'button_title' => esc_html__( 'Time slots booking form', 'booking' ),
543 565 ),
544 - 'time_slots_booking' => array(
545 - 'template_key' => 'time_slots_20_min_3_steps_review_with_hints',
546 - 'form_slug' => 'time_slots_booking',
547 - 'form_title' => esc_html__( 'Time Slots Booking Form', 'booking' ),
548 - 'page_slug' => 'wp-booking-calendar-time-slots',
549 - 'page_title' => esc_html__( 'Time Slots Booking', 'booking' ),
550 - 'button_title' => esc_html__( 'Time slots booking form', 'booking' ),
551 - ),
552 566 'time_appointments_booking' => array(
553 567 'template_key' => 'time_appointments_3_steps_review_with_hints',
554 568 'form_slug' => 'time_appointments_booking',
555 569 'form_title' => esc_html__( 'Time Appointments Booking Form', 'booking' ),
556 - 'page_slug' => 'wp-booking-calendar-time-appointments',
557 - 'page_title' => esc_html__( 'Time Appointments Booking', 'booking' ),
558 - 'button_title' => esc_html__( 'Time appointments booking form', 'booking' ),
570 + 'create_page' => false,
559 571 ),
560 - 'contact_form' => array(
561 - 'template_key' => 'contact_form_simple',
562 - 'form_slug' => 'contact_form',
563 - 'form_title' => esc_html__( 'Contact Form', 'booking' ),
564 - 'page_slug' => 'wp-booking-calendar-contact',
565 - 'page_title' => esc_html__( 'Contact Form', 'booking' ),
566 - 'button_title' => esc_html__( 'Contact form', 'booking' ),
572 + 'appointment_services_booking' => array(
573 + 'template_key' => 'appointments_services_flow',
574 + 'form_slug' => 'appointment_services_booking',
575 + 'form_title' => esc_html__( 'Appointment Services Booking Form', 'booking' ),
576 + 'create_page' => false,
577 + 'assign_to_default_appointment_service' => true,
567 578 ),
579 + 'contact_form' => array(
580 + 'template_key' => 'contact_form_simple',
581 + 'form_slug' => 'contact_form',
582 + 'form_title' => esc_html__( 'Contact Form', 'booking' ),
583 + 'page_slug' => 'booking-calendar-contact',
584 + 'legacy_page_slugs' => array( 'wp-booking-calendar-contact' ),
585 + 'page_title' => esc_html__( 'Contact Form', 'booking' ),
586 + 'button_title' => esc_html__( 'Contact form', 'booking' ),
587 + ),
568 588 );
569 589 }
570 590
571 591
572 592 /**
593 + * Get starter page definitions created during plugin activation.
594 + *
595 + * Legacy starter pages keep using their dedicated custom booking forms. The
596 + * old Time Appointments form and the dedicated Appointment Service form are
597 + * form-only fixtures because the Appointment workflow has one canonical page.
598 + *
599 + * @return array Starter page definitions keyed by stable purpose.
600 + */
601 +function wpbc_get_activation_booking_page_configs() {
602 +
603 + $page_configs = wpbc_get_activation_booking_form_page_configs();
604 +
605 + foreach ( $page_configs as $page_key => $page_config ) {
606 + if ( isset( $page_config['create_page'] ) && false === (bool) $page_config['create_page'] ) {
607 + unset( $page_configs[ $page_key ] );
608 + continue;
609 + }
610 +
611 + $form_slug = '';
612 + if ( isset( $page_config['form_slug'] ) ) {
613 + $form_slug = sanitize_text_field( (string) $page_config['form_slug'] );
614 + }
615 +
616 + if ( '' === $form_slug ) {
617 + unset( $page_configs[ $page_key ] );
618 + continue;
619 + }
620 +
621 + $shortcode = "[booking resource_id=1 form_type='{$form_slug}']";
622 + $page_configs[ $page_key ]['shortcode'] = $shortcode;
623 + $page_configs[ $page_key ]['shortcode_checks'] = array(
624 + $shortcode,
625 + '[booking resource_id=1 form_type="' . $form_slug . '"]',
626 + );
627 + $page_configs[ $page_key ]['resource_id'] = 1;
628 + }
629 +
630 + $page_configs['appointment_booking'] = array(
631 + 'page_slug' => 'booking-calendar-appointment',
632 + 'legacy_page_slugs' => array( 'wpbc-appointment-booking' ),
633 + 'page_title' => esc_html__( 'Book an Appointment', 'booking' ),
634 + 'button_title' => esc_html__( 'Appointment booking form', 'booking' ),
635 + 'shortcode' => '[booking_appointment]',
636 + 'shortcode_checks' => array( '[booking_appointment]', '[booking_appointment ' ),
637 + 'resource_id' => 0,
638 + );
639 + $page_configs['resource_selector_booking'] = array(
640 + 'page_slug' => 'booking-calendar-resource-selection',
641 + 'legacy_page_slugs' => array(),
642 + 'page_title' => esc_html__( 'Resource Selection', 'booking' ),
643 + 'button_title' => esc_html__( 'Resource selection', 'booking' ),
644 + 'shortcode' => '[booking_resource_selector]',
645 + 'shortcode_checks' => array( '[booking_resource_selector]', '[booking_resource_selector ' ),
646 + 'resource_id' => 0,
647 + );
648 +
649 + return $page_configs;
650 +}
651 +
652 +
653 +/**
654 + * Get the Free Booking Received page definition used during initial activation.
655 + *
656 + * The legacy slug remains lookup-only so a clean reinstall can reuse a retained
657 + * page without making legacy URLs canonical for new installations.
658 + *
659 + * @return array Confirmation page definition with canonical and legacy slugs.
660 + */
661 +function wpbc_get_activation_confirmation_page_config() {
662 +
663 + return array(
664 + 'page_slug' => 'booking-calendar-confirmation',
665 + 'legacy_page_slugs' => array( 'wpbc-booking-received' ),
666 + );
667 +}
668 +
669 +
670 +/**
671 + * Get the Personal-edition customer page definitions used during activation.
672 + *
673 + * @return array Personal page definitions keyed by stable purpose.
674 + */
675 +function wpbc_get_activation_personal_page_configs() {
676 +
677 + return array(
678 + 'manage_booking' => array(
679 + 'page_slug' => 'booking-calendar-manage-booking',
680 + 'legacy_page_slugs' => array( 'wpbc-my-booking' ),
681 + 'page_title' => esc_html__( 'My Booking', 'booking' ),
682 + 'shortcode' => '[bookingedit]',
683 + 'option_name' => 'booking_url_bookings_edit_by_visitors',
684 + ),
685 + 'my_bookings' => array(
686 + 'page_slug' => 'booking-calendar-my-bookings',
687 + 'legacy_page_slugs' => array( 'wpbc-my-bookings-listing' ),
688 + 'page_title' => esc_html__( 'My Bookings Listing', 'booking' ),
689 + 'shortcode' => '[bookingcustomerlisting]',
690 + 'option_name' => 'booking_url_bookings_listing_by_customer',
691 + ),
692 + );
693 +}
694 +
695 +
696 +/**
697 + * Get the Business Small payment-result page definitions used during activation.
698 + *
699 + * @return array Payment-result definitions keyed by stable outcome.
700 + */
701 +function wpbc_get_activation_payment_page_configs() {
702 +
703 + return array(
704 + 'success' => array(
705 + 'page_slug' => 'booking-calendar-payment-success',
706 + 'legacy_page_slugs' => array( 'wpbc-booking-payment-successful' ),
707 + 'page_title' => esc_html__( 'Booking Payment Confirmation', 'booking' ),
708 + 'page_content' => esc_html__( 'Thank you for your booking. Your payment for the booking has been successfully received.', 'booking' )
709 + . "\r\n\r\n[booking_confirm]",
710 + 'required_shortcode' => '[booking_confirm]',
711 + 'default_url' => '/successful',
712 + 'option_names' => array(
713 + 'booking_stripe_v3_order_successful',
714 + 'booking_paypal_std_co_order_successful',
715 + 'booking_paypal_return_url',
716 + 'booking_authorizenet_order_successful',
717 + 'booking_sage_order_successful',
718 + 'booking_redsys_order_successful',
719 + 'booking_ideal_return_url',
720 + 'booking_ipay88_return_url',
721 + ),
722 + ),
723 + 'failed' => array(
724 + 'page_slug' => 'booking-calendar-payment-failed',
725 + 'legacy_page_slugs' => array( 'wpbc-booking-payment-failed' ),
726 + 'page_title' => esc_html__( 'Booking Payment Failed', 'booking' ),
727 + 'page_content' => esc_html__( 'Payment Unsuccessful. Please contact us for assistance.', 'booking' ),
728 + 'required_shortcode' => '',
729 + 'default_url' => '/failed',
730 + 'option_names' => array(
731 + 'booking_stripe_v3_order_failed',
732 + 'booking_paypal_std_co_order_failed',
733 + 'booking_paypal_cancel_return_url',
734 + 'booking_authorizenet_order_failed',
735 + 'booking_sage_order_failed',
736 + 'booking_redsys_order_failed',
737 + 'booking_ideal_cancel_return_url',
738 + 'booking_ipay88_cancel_return_url',
739 + ),
740 + ),
741 + );
742 +}
743 +
744 +
745 +/**
746 + * Check whether an activation payment URL still contains its replaceable default.
747 + *
748 + * Missing options and the released placeholder paths may be connected to a
749 + * newly eligible payment page. Every other value is treated as administrator
750 + * configuration and must remain unchanged.
751 + *
752 + * @param mixed $configured_url Saved payment return URL, or false when absent.
753 + * @param string $default_url Released relative placeholder URL.
754 + *
755 + * @return bool True when activation may store the eligible payment page URL.
756 + */
757 +function wpbc_should_update_activation_payment_url( $configured_url, $default_url ) {
758 +
759 + if ( false === $configured_url ) {
760 + return true;
761 + }
762 +
763 + return (string) $default_url === wpbc_make_link_relative( $configured_url );
764 +}
765 +
766 +
767 +/**
768 + * Find an existing activation-owned page by its canonical or legacy slug.
769 + *
770 + * Canonical slugs are checked first. Legacy aliases are used only to preserve
771 + * existing pages and prevent duplicates after a full plugin-data reset.
772 + *
773 + * @param string $page_slug Canonical page slug.
774 + * @param array $legacy_page_slugs Previously released page slugs.
775 + *
776 + * @return WP_Post|null Existing WordPress page, or null when no slug matches.
777 + */
778 +function wpbc_get_activation_page_by_slugs( $page_slug, $legacy_page_slugs = array() ) {
779 +
780 + $page_slugs = array_merge( array( $page_slug ), (array) $legacy_page_slugs );
781 + $page_slugs = array_unique( array_filter( array_map( 'sanitize_title', $page_slugs ) ) );
782 +
783 + foreach ( $page_slugs as $candidate_page_slug ) {
784 + $wp_post = get_page_by_path( $candidate_page_slug, OBJECT, 'page' );
785 +
786 + if ( $wp_post instanceof WP_Post ) {
787 + return $wp_post;
788 + }
789 + }
790 +
791 + return null;
792 +}
793 +
794 +
795 +/**
796 + * Get the first published activation page matching a canonical or legacy slug.
797 + *
798 + * This read-only lookup is separate from the activation writer lookup because
799 + * activation must recognize retained non-published pages to avoid duplicates,
800 + * while public-page navigation must never advertise an inaccessible draft or
801 + * trashed canonical page when a published legacy page is still available.
802 + *
803 + * @param string $page_slug Canonical activation page slug.
804 + * @param array $legacy_page_slugs Previously released lookup-only slugs.
805 + *
806 + * @return WP_Post|null Published page, or null when no public match exists.
807 + */
808 +function wpbc_get_published_activation_page_by_slugs( $page_slug, $legacy_page_slugs = array() ) {
809 +
810 + $page_slugs = array_merge( array( $page_slug ), (array) $legacy_page_slugs );
811 + $page_slugs = array_unique( array_filter( array_map( 'sanitize_title', $page_slugs ) ) );
812 +
813 + foreach ( $page_slugs as $candidate_page_slug ) {
814 + $wp_post = get_page_by_path( $candidate_page_slug, OBJECT, 'page' );
815 +
816 + if ( $wp_post instanceof WP_Post && 'publish' === $wp_post->post_status ) {
817 + return $wp_post;
818 + }
819 + }
820 +
821 + return null;
822 +}
823 +
824 +
825 +/**
573 826 * Get a bundled BFB template record by template key.
574 827 *
575 828 * @param string $template_key Template key.
576 829 *
@@ -604,18 +857,16 @@
604 857 return array();
605 858 }
606 859
607 860
608 -/**
609 - * Create starter custom booking forms from bundled BFB templates.
861 +/**
862 + * Create starter custom booking forms from bundled BFB templates.
610 863 *
611 864 * @return bool
612 865 */
613 -function wpbc_create_activation_custom_booking_forms() {
866 +function wpbc_create_activation_custom_booking_forms() {
614 867
615 868 if (
616 - ! defined( 'WPBC_NEW_FORM_BUILDER' ) ||
617 - ! WPBC_NEW_FORM_BUILDER ||
618 869 ! function_exists( 'wpbc_is_table_exists' ) ||
619 870 ! wpbc_is_table_exists( 'booking_form_structures' ) ||
620 871 ! class_exists( 'WPBC_BFB_Form_Storage' )
621 872 ) {
@@ -645,8 +896,29 @@
645 896 if ( empty( $template_record ) ) {
646 897 continue;
647 898 }
648 899
900 + // The predefined Time Slots form must select one calendar day independently, // FixIn: 11.4.3.1
901 + // from the global/default Calendar Settings day-selection mode.
902 + if ( 'time_slots_booking' === $form_slug ) {
903 + $form_settings = array();
904 + if ( ! empty( $template_record['settings_json'] ) ) {
905 + $decoded_settings = json_decode( (string) $template_record['settings_json'], true );
906 + if ( is_array( $decoded_settings ) ) {
907 + $form_settings = $decoded_settings;
908 + }
909 + }
910 +
911 + if ( empty( $form_settings['options'] ) || ! is_array( $form_settings['options'] ) ) {
912 + $form_settings['options'] = array();
913 + }
914 +
915 + $form_settings['options']['booking_type_of_day_selections'] = 'single';
916 + $template_record['settings_json'] = function_exists( 'wpbc_form_config__encode_json' )
917 + ? wpbc_form_config__encode_json( $form_settings )
918 + : wp_json_encode( $form_settings );
919 + }
920 +
649 921 $template_record['form_slug'] = $form_slug;
650 922 $template_record['status'] = 'published';
651 923 $template_record['scope'] = 'global';
652 924 $template_record['owner_user_id'] = 0;
@@ -664,9 +936,105 @@
664 936 }
665 937 }
666 938
667 939 return $is_created;
668 -}
940 +}
941 +
942 +
943 +/**
944 + * Return the ordered activation-page level for a Booking Calendar edition.
945 + *
946 + * The ordering is intentionally limited to product editions. Page groups use
947 + * these levels to determine whether a paid activation has crossed the edition
948 + * boundary that first makes those pages available.
949 + *
950 + * @param string $edition_id Booking Calendar edition identifier.
951 + *
952 + * @return int Edition level, or -1 when the identifier is not supported.
953 + */
954 +function wpbc_get_activation_page_edition_level( $edition_id ) {
955 +
956 + $edition_levels = array(
957 + 'free' => 0,
958 + 'personal' => 1,
959 + 'biz_s' => 2,
960 + 'biz_m' => 3,
961 + 'biz_l' => 4,
962 + 'multiuser' => 5,
963 + );
964 +
965 + $edition_id = (string) $edition_id;
966 +
967 + return isset( $edition_levels[ $edition_id ] ) ? $edition_levels[ $edition_id ] : -1;
968 +}
969 +
970 +
971 +/**
972 + * Check whether a paid-edition transition newly unlocks one page group.
973 + *
974 + * This pure comparison keeps Free-to-Pro, lower-to-higher, reactivation,
975 + * update, and downgrade behavior deterministic and independently testable.
976 + *
977 + * @param string $previous_edition_id Previously provisioned or detected edition.
978 + * @param string $current_edition_id Edition active during this activation.
979 + * @param string $required_edition_id First edition that owns the page group.
980 + *
981 + * @return bool True when this activation crosses the required edition boundary.
982 + */
983 +function wpbc_is_activation_page_edition_transition( $previous_edition_id, $current_edition_id, $required_edition_id ) {
984 +
985 + $previous_edition_level = wpbc_get_activation_page_edition_level( $previous_edition_id );
986 + $current_edition_level = wpbc_get_activation_page_edition_level( $current_edition_id );
987 + $required_edition_level = wpbc_get_activation_page_edition_level( $required_edition_id );
988 +
989 + if ( 0 > $previous_edition_level || 0 > $current_edition_level || 1 > $required_edition_level ) {
990 + return false;
991 + }
992 +
993 + return $previous_edition_level < $required_edition_level
994 + && $required_edition_level <= $current_edition_level;
995 +}
996 +
997 +
998 +/**
999 + * Check whether activation-owned WordPress pages may be provisioned.
1000 + *
1001 + * Free-owned pages remain restricted to the immutable first-Free-install
1002 + * decision. Paid page groups can additionally opt into the exact Pro edition
1003 + * transition that first makes them available. The Pro activation layer owns
1004 + * that transition state and exposes it through a narrow filter; normal Free or
1005 + * Pro updates therefore remain fail-closed.
1006 + *
1007 + * @param string $required_edition_id First edition that owns the page group.
1008 + *
1009 + * @return bool True only during the qualifying initial activation request.
1010 + */
1011 +function wpbc_should_create_activation_pages( $required_edition_id = 'free' ) {
1012 + $required_edition_id = (string) $required_edition_id;
1013 + $required_edition_level = wpbc_get_activation_page_edition_level( $required_edition_id );
1014 +
1015 + if ( 0 > $required_edition_level ) {
1016 + return false;
1017 + }
1018 +
1019 + if ( function_exists( 'wpbc_is_plugin_initial_install' ) && wpbc_is_plugin_initial_install() ) {
1020 + return true;
1021 + }
1022 +
1023 + if ( 0 === $required_edition_level ) {
1024 + return false;
1025 + }
1026 +
1027 + /**
1028 + * Filter whether the current paid-edition activation newly owns a page group.
1029 + *
1030 + * @since 11.8.1
1031 + *
1032 + * @param bool $should_create_pages Fail-closed default decision.
1033 + * @param string $required_edition_id First edition that owns the page group.
1034 + */
1035 + return (bool) apply_filters( 'wpbc_should_create_paid_edition_activation_pages', false, $required_edition_id );
1036 +}
669 1037
670 1038
671 1039 /**
672 1040 * Build starter page content with a booking shortcode.
@@ -710,9 +1078,23 @@
710 1078 // -----------------------------------------------------------------------------------------------------------------
711 1079
712 1080 wpbc_create_activation_custom_booking_forms();
713 1081
714 - $configs = wpbc_get_activation_booking_form_page_configs();
1082 + /**
1083 + * Fires after activation starter custom forms are available.
1084 + *
1085 + * Appointment Services uses this boundary to finish its pending starter
1086 + * Service seed with the newly created form ID.
1087 + *
1088 + * @since 11.5.0
1089 + */
1090 + do_action( 'wpbc_activation_custom_booking_forms_created' );
1091 +
1092 + if ( ! wpbc_should_create_activation_pages() ) {
1093 + return;
1094 + }
1095 +
1096 + $configs = wpbc_get_activation_booking_page_configs();
715 1097 if ( empty( $configs ) || ! is_array( $configs ) ) {
716 1098 return;
717 1099 }
718 1100
@@ -719,28 +1101,36 @@
719 1101 $front_page_id = 0;
720 1102
721 1103 foreach ( $configs as $config ) {
722 1104
723 - $form_slug = sanitize_text_field( (string) $config['form_slug'] );
724 - $shortcode = "[booking resource_id=1 form_type='{$form_slug}']";
725 - $content = wpbc_get_activation_booking_page_content( $shortcode );
1105 + $shortcode = isset( $config['shortcode'] ) ? trim( (string) $config['shortcode'] ) : '';
1106 + $shortcode_checks = isset( $config['shortcode_checks'] ) && is_array( $config['shortcode_checks'] )
1107 + ? $config['shortcode_checks']
1108 + : array( $shortcode );
1109 + $resource_id = isset( $config['resource_id'] ) ? absint( $config['resource_id'] ) : 0;
726 1110
727 - $result_arr = wpbc_add_shortcode_into_page(
728 - array(
729 - 'page_post_name' => $config['page_slug'],
730 - 'post_title' => $config['page_title'],
1111 + if ( '' === $shortcode ) {
1112 + continue;
1113 + }
1114 +
1115 + $content = wpbc_get_activation_booking_page_content( $shortcode );
1116 + $legacy_page_slugs = isset( $config['legacy_page_slugs'] ) ? (array) $config['legacy_page_slugs'] : array();
1117 + $existing_page = wpbc_get_activation_page_by_slugs( $config['page_slug'], $legacy_page_slugs );
1118 +
1119 + $result_arr = wpbc_add_shortcode_into_page(
1120 + array(
1121 + 'page_post_name' => $config['page_slug'],
1122 + 'page_id' => $existing_page instanceof WP_Post ? $existing_page->ID : 0,
1123 + 'post_title' => $config['page_title'],
731 1124 'shortcode' => $content,
732 - 'check_exist_shortcode' => array(
733 - $shortcode,
734 - '[booking resource_id=1 form_type="' . $form_slug . '"]',
735 - ),
736 - 'resource_id' => 1,
1125 + 'check_exist_shortcode' => $shortcode_checks,
1126 + 'resource_id' => $resource_id,
737 1127 )
738 - );
739 -
740 - if ( WPBC_IS_PLAYGROUND && empty( $front_page_id ) && ! empty( $result_arr['relative_url'] ) ) {
741 - $wp_post = get_page_by_path( $config['page_slug'] );
742 - if ( ! empty( $wp_post ) ) {
1128 + );
1129 +
1130 + if ( WPBC_IS_PLAYGROUND && empty( $front_page_id ) && ! empty( $result_arr['relative_url'] ) ) {
1131 + $wp_post = wpbc_get_activation_page_by_slugs( $config['page_slug'], $legacy_page_slugs );
1132 + if ( ! empty( $wp_post ) ) {
743 1133 $front_page_id = $wp_post->ID;
744 1134 }
745 1135 }
746 1136 }
@@ -761,29 +1151,39 @@
761 1151 */
762 1152 function wpbc_get_published_activation_booking_pages() {
763 1153
764 1154 $pages = array();
765 - $configs = wpbc_get_activation_booking_form_page_configs();
1155 + $configs = wpbc_get_activation_booking_page_configs();
766 1156
767 1157 if ( empty( $configs ) || ! is_array( $configs ) ) {
768 1158 return $pages;
769 1159 }
770 1160
771 - foreach ( $configs as $key => $config ) {
1161 + foreach ( $configs as $key => $config ) {
1162 +
1163 + $legacy_page_slugs = isset( $config['legacy_page_slugs'] ) ? (array) $config['legacy_page_slugs'] : array();
1164 + $wp_post = wpbc_get_published_activation_page_by_slugs( $config['page_slug'], $legacy_page_slugs );
1165 + if ( ! ( $wp_post instanceof WP_Post ) ) {
1166 + continue;
1167 + }
772 1168
773 - $wp_post = get_page_by_path( $config['page_slug'] );
774 - if ( empty( $wp_post ) ) {
775 - continue;
1169 + $shortcode_checks = isset( $config['shortcode_checks'] ) && is_array( $config['shortcode_checks'] )
1170 + ? $config['shortcode_checks']
1171 + : array();
1172 + $is_shortcode_found = false;
1173 +
1174 + foreach ( $shortcode_checks as $shortcode_check ) {
1175 + if ( '' === (string) $shortcode_check ) {
1176 + continue;
1177 + }
1178 +
1179 + if ( wpbc_is_shortcode_exist_in_page_with_id( $wp_post->ID, $shortcode_check ) ) {
1180 + $is_shortcode_found = true;
1181 + break;
1182 + }
776 1183 }
777 1184
778 - $form_slug = sanitize_text_field( (string) $config['form_slug'] );
779 - $shortcode_single_quote = "[booking resource_id=1 form_type='{$form_slug}']";
780 - $shortcode_double_quote = '[booking resource_id=1 form_type="' . $form_slug . '"]';
781 -
782 - if (
783 - ! wpbc_is_shortcode_exist_in_page_with_id( $wp_post->ID, $shortcode_single_quote ) &&
784 - ! wpbc_is_shortcode_exist_in_page_with_id( $wp_post->ID, $shortcode_double_quote )
785 - ) {
1185 + if ( ! $is_shortcode_found ) {
786 1186 continue;
787 1187 }
788 1188
789 1189 $post_url = get_permalink( $wp_post->ID );
@@ -810,11 +1210,15 @@
810 1210 * @param $default_options_to_add
811 1211 *
812 1212 * @return void
813 1213 */
814 -function wpbc_create_page_thank_you( $default_options_to_add ) { // FixIn: 9.6.2.11.
815 -
816 - global $wp_rewrite;
1214 +function wpbc_create_page_thank_you( $default_options_to_add ) { // FixIn: 9.6.2.11.
1215 +
1216 + if ( ! wpbc_should_create_activation_pages() ) {
1217 + return false;
1218 + }
1219 +
1220 + global $wp_rewrite;
817 1221 if ( is_null( $wp_rewrite ) ) { // FixIn: 9.7.1.1.
818 1222
819 1223 // Maybe it was not init, yet
820 1224 if ( ! has_action( 'init', 'wpbc_create_page_thank_you' ) ) {
@@ -833,20 +1237,24 @@
833 1237 && ( empty( get_page_by_path( 'thank-you' ) ) ) // FixIn: 9.9.0.27.
834 1238 )
835 1239 || ( '/' == wpbc_make_link_relative( get_bk_option( 'booking_thank_you_page_URL' ) ) )
836 1240 ){
837 - $wp_post = get_page_by_path( 'wpbc-booking-received' );
1241 + $confirmation_page_config = wpbc_get_activation_confirmation_page_config();
1242 + $wp_post = wpbc_get_activation_page_by_slugs(
1243 + $confirmation_page_config['page_slug'],
1244 + $confirmation_page_config['legacy_page_slugs']
1245 + );
838 1246
839 1247 $post_url = '';
840 1248
841 1249 if ( empty( $wp_post ) ) { // No default page. Create it.
842 1250
843 - $page_params = array(
844 - 'post_title' => esc_html( __( 'Booking Received', 'booking' ) ),
845 - 'post_content' => esc_html( __( 'Thank you for your booking. Your booking has been successfully received.', 'booking' ) )
846 - . "\r\n" . ' [booking_confirm]',
847 - 'post_name' => 'wpbc-booking-received'
848 - );
1251 + $page_params = array(
1252 + 'post_title' => esc_html( __( 'Booking Received', 'booking' ) ),
1253 + 'post_content' => esc_html( __( 'Thank you for your booking. Your booking has been successfully received.', 'booking' ) )
1254 + . "\r\n" . ' [booking_confirm]',
1255 + 'post_name' => $confirmation_page_config['page_slug'],
1256 + );
849 1257 $post_id = wpbc_create_page( $page_params );
850 1258
851 1259 if ( ! empty( $post_id ) ) {
852 1260 $post_url = wpbc_make_link_relative( get_permalink( $post_id ) );
@@ -880,11 +1288,15 @@
880 1288 * to some pages different from homepage.
881 1289 *
882 1290 * @return void
883 1291 */
884 -function wpbc_create_page_bookingedit(){ // FixIn: 9.6.2.10.
885 -
886 - global $wp_rewrite;
1292 +function wpbc_create_page_bookingedit(){ // FixIn: 9.6.2.10.
1293 +
1294 + if ( ! wpbc_should_create_activation_pages( 'personal' ) ) {
1295 + return false;
1296 + }
1297 +
1298 + global $wp_rewrite;
887 1299 if ( is_null( $wp_rewrite ) ) { // FixIn: 9.7.1.1.
888 1300 // Maybe it was not init, yet
889 1301 if ( ! has_action( 'init', 'wpbc_create_page_bookingedit' ) ) {
890 1302 add_action( 'init', 'wpbc_create_page_bookingedit', 99 ); // <- priority to load it last
@@ -891,182 +1303,91 @@
891 1303 }
892 1304 return false;
893 1305 }
894 1306
895 - // Booking Edit page - set default page and URL ---------------------------------------------------------------
896 - $url_booking_edit = get_bk_option( 'booking_url_bookings_edit_by_visitors' );
897 - if (
898 - ( site_url() == $url_booking_edit )
899 - && ( empty( get_page_by_path( 'wpbc-my-booking' ) ) )
900 - ){
901 - $page_params = array(
902 - 'post_content' => '[bookingedit]', // The post content
903 - 'post_name' => 'wpbc-my-booking', // sanitize_title( $post_title )
904 - 'post_title' => esc_html__( 'My Booking', 'booking' ) // Title
905 - );
1307 + $page_configs = wpbc_get_activation_personal_page_configs();
1308 +
1309 + foreach ( $page_configs as $page_config ) {
1310 + $configured_page_url = get_bk_option( $page_config['option_name'] );
1311 + $existing_page = wpbc_get_activation_page_by_slugs(
1312 + $page_config['page_slug'],
1313 + $page_config['legacy_page_slugs']
1314 + );
1315 +
1316 + if ( site_url() === $configured_page_url && ! ( $existing_page instanceof WP_Post ) ) {
1317 + $page_id = wpbc_create_page(
1318 + array(
1319 + 'post_content' => $page_config['shortcode'],
1320 + 'post_name' => $page_config['page_slug'],
1321 + 'post_title' => $page_config['page_title'],
1322 + )
1323 + );
1324 +
1325 + if ( ! empty( $page_id ) ) {
1326 + update_bk_option( $page_config['option_name'], get_permalink( $page_id ) );
1327 + }
1328 + } elseif (
1329 + ( site_url() === $configured_page_url || empty( $configured_page_url ) )
1330 + && $existing_page instanceof WP_Post
1331 + ) {
1332 + update_bk_option( $page_config['option_name'], get_permalink( $existing_page->ID ) );
1333 + }
1334 +
1335 + $relative_page_url = wpbc_make_link_relative( get_bk_option( $page_config['option_name'] ) );
1336 + wpbc_add_shortcode_to_exist_page( $relative_page_url, $page_config['shortcode'] );
1337 + }
906 1338
907 - $post_id = wpbc_create_page( $page_params );
908 -
909 - if ( ! empty( $post_id ) ) {
910 - $post_url = get_permalink( $post_id );
911 - update_bk_option( 'booking_url_bookings_edit_by_visitors', $post_url );
912 - }
913 - } else if (
914 - (
915 - ( site_url() == $url_booking_edit )
916 - || ( empty( $url_booking_edit ) )
917 - )
918 - && ( ! empty( get_page_by_path( 'wpbc-my-booking' ) ) )
919 - ){
920 - $wp_post = get_page_by_path( 'wpbc-my-booking' );
921 - if ( ! empty( $wp_post ) ) {
922 - update_bk_option( 'booking_url_bookings_edit_by_visitors', get_permalink( $wp_post->ID ) );
923 - }
924 - }
925 -
926 - // -----------------------------------------------------------------------------------------------------------------
927 - // Check if existing page has our shortcode
928 - // -----------------------------------------------------------------------------------------------------------------
929 - $booking_edit_relative_url = wpbc_make_link_relative( get_bk_option( 'booking_url_bookings_edit_by_visitors' ) );
930 - $is_added = wpbc_add_shortcode_to_exist_page( $booking_edit_relative_url, '[bookingedit]' );
931 -
932 -
933 - // =================================================================================================================
934 - // =================================================================================================================
935 - // =================================================================================================================
936 -
937 -
938 - // Booking Listing page - set default page and URL ---------------------------------------------------------------
939 - $url_booking_edit = get_bk_option( 'booking_url_bookings_listing_by_customer' );
940 - if (
941 - ( site_url() == $url_booking_edit )
942 - && ( empty( get_page_by_path( 'wpbc-my-bookings-listing' ) ) )
943 - ){
944 -
945 - $page_params = array(
946 - 'post_content' => '[bookingcustomerlisting]', // The post content
947 - 'post_name' => 'wpbc-my-bookings-listing', // sanitize_title( $post_title )
948 - 'post_title' => esc_html__( 'My Bookings Listing', 'booking' ) // Title
949 - );
950 -
951 - $post_id = wpbc_create_page( $page_params );
952 -
953 - if ( ! empty( $post_id ) ) {
954 - $post_url = get_permalink( $post_id );
955 - update_bk_option( 'booking_url_bookings_listing_by_customer', $post_url );
956 - }
957 - } else if (
958 - (
959 - ( site_url() == $url_booking_edit )
960 - || ( empty( $url_booking_edit ) )
961 - )
962 - && ( ! empty( get_page_by_path( 'wpbc-my-bookings-listing' ) ) )
963 - ){
964 - $wp_post = get_page_by_path( 'wpbc-my-bookings-listing' );
965 - if ( ! empty( $wp_post ) ){
966 - update_bk_option( 'booking_url_bookings_listing_by_customer', get_permalink( $wp_post->ID ) );
967 - }
968 - }
969 -
970 -
971 - // -----------------------------------------------------------------------------------------------------------------
972 - // Check if existing page has our shortcode
973 - // -----------------------------------------------------------------------------------------------------------------
974 - $booking_listing_relative_url = wpbc_make_link_relative( get_bk_option( 'booking_url_bookings_listing_by_customer' ) );
975 - $is_added = wpbc_add_shortcode_to_exist_page( $booking_listing_relative_url, '[bookingcustomerlisting]' );
976 -
977 1339 }
978 1340
979 1341
980 -function wpbc_create_page_booking_payment_status(){ // FixIn: 9.6.2.13.
981 -
982 - global $wp_rewrite;
1342 +function wpbc_create_page_booking_payment_status(){ // FixIn: 9.6.2.13.
1343 +
1344 + if ( ! wpbc_should_create_activation_pages( 'biz_s' ) ) {
1345 + return false;
1346 + }
1347 +
1348 + global $wp_rewrite;
983 1349 if ( is_null( $wp_rewrite ) ) { // FixIn: 9.7.1.1.
984 1350 return false;
985 1351 }
986 1352
987 - // Successful Payment page options ---------------------------------------------------------------------------------
988 -
989 - $post_url_relative = false;
990 - $slug = 'wpbc-booking-payment-successful';
991 - if ( empty( get_page_by_path( $slug ) ) ) {
992 - // Create page
993 - $page_params = array(
994 - 'post_title' => esc_html( __( 'Booking Payment Confirmation', 'booking' ) ),
995 - 'post_content' => esc_html( __( 'Thank you for your booking. Your payment for the booking has been successfully received.', 'booking' ) ),
996 - 'post_name' => $slug
997 - );
998 -
999 - $post_id = wpbc_create_page( $page_params );
1000 -
1001 - if ( ! empty( $post_id ) ) {
1002 - $post_url = get_permalink( $post_id );
1003 - $post_url_relative = str_replace( site_url(), '', $post_url );
1004 - }
1005 - }
1006 - if ( ! empty( $post_url_relative ) ) {
1007 -
1008 - //$post_url_relative = wpbc_make_link_absolute( $post_url_relative );
1009 -
1010 - $payment_systems = array(
1011 - 'booking_stripe_v3_order_successful',
1012 - 'booking_paypal_return_url',
1013 - 'booking_authorizenet_order_successful',
1014 - 'booking_sage_order_successful',
1015 - 'booking_ideal_return_url',
1016 - 'booking_ipay88_return_url'
1017 - );
1018 -
1019 - foreach ( $payment_systems as $payment_system ) {
1020 -
1021 - if (
1022 - ( false === get_bk_option( $payment_system ) )
1023 - || ( '/successful' == wpbc_make_link_relative( get_bk_option( $payment_system ) ) )
1024 - ) {
1025 - update_bk_option( $payment_system, wpbc_make_link_relative( $post_url_relative ) );
1026 - }
1027 - }
1028 - }
1029 -
1030 - // Failed Payment page options -------------------------------------------------------------------------------------
1031 -
1032 - $post_url_relative = false;
1033 - $slug = 'wpbc-booking-payment-failed';
1034 - if ( empty( get_page_by_path( $slug ) ) ) {
1035 - // Create page
1036 - $page_params = array(
1037 - 'post_title' => esc_html( __( 'Booking Payment Failed', 'booking' ) ),
1038 - 'post_content' => esc_html( __( 'Payment Unsuccessful. Please contact us for assistance.', 'booking' ) ),
1039 - 'post_name' => $slug
1040 - );
1041 -
1042 - $post_id = wpbc_create_page( $page_params );
1043 -
1044 - if ( ! empty( $post_id ) ) {
1045 - $post_url = get_permalink( $post_id );
1046 - $post_url_relative = str_replace( site_url(), '', $post_url );
1047 - }
1048 - }
1049 - if ( ! empty( $post_url_relative ) ) {
1050 -
1051 - //$post_url_relative = wpbc_make_link_absolute( $post_url_relative );
1052 -
1053 - $payment_systems = array(
1054 - 'booking_stripe_v3_order_failed',
1055 - 'booking_paypal_cancel_return_url',
1056 - 'booking_authorizenet_order_failed',
1057 - 'booking_sage_order_failed',
1058 - 'booking_ideal_cancel_return_url',
1059 - 'booking_ipay88_cancel_return_url'
1060 - );
1061 -
1062 - foreach ( $payment_systems as $payment_system ) {
1063 -
1064 - if (
1065 - ( false === get_bk_option( $payment_system ) )
1066 - || ( '/failed' == wpbc_make_link_relative( get_bk_option( $payment_system ) ) )
1067 - ) {
1068 - update_bk_option( $payment_system, wpbc_make_link_relative( $post_url_relative ) );
1069 - }
1070 - }
1071 - }
1353 + $page_configs = wpbc_get_activation_payment_page_configs();
1354 +
1355 + foreach ( $page_configs as $page_config ) {
1356 + $existing_page = wpbc_get_activation_page_by_slugs(
1357 + $page_config['page_slug'],
1358 + $page_config['legacy_page_slugs']
1359 + );
1360 +
1361 + if ( ! ( $existing_page instanceof WP_Post ) ) {
1362 + $page_id = wpbc_create_page(
1363 + array(
1364 + 'post_title' => $page_config['page_title'],
1365 + 'post_content' => $page_config['page_content'],
1366 + 'post_name' => $page_config['page_slug'],
1367 + )
1368 + );
1369 + $existing_page = ! empty( $page_id ) ? get_post( $page_id ) : null;
1370 + }
1371 +
1372 + if ( ! ( $existing_page instanceof WP_Post ) || 'publish' !== $existing_page->post_status ) {
1373 + continue;
1374 + }
1375 +
1376 + $page_url_relative = wpbc_make_link_relative( get_permalink( $existing_page->ID ) );
1377 + if ( empty( $page_url_relative ) ) {
1378 + continue;
1379 + }
1380 +
1381 + if ( ! empty( $page_config['required_shortcode'] ) ) {
1382 + wpbc_add_shortcode_to_exist_page( $page_url_relative, $page_config['required_shortcode'] );
1383 + }
1384 +
1385 + foreach ( $page_config['option_names'] as $option_name ) {
1386 + $configured_url = get_bk_option( $option_name );
1387 +
1388 + if ( wpbc_should_update_activation_payment_url( $configured_url, $page_config['default_url'] ) ) {
1389 + update_bk_option( $option_name, $page_url_relative );
1390 + }
1391 + }
1392 + }
1072 1393 }