PluginProbe
Booking Calendar / 11.8.3
Booking Calendar v11.8.3
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 +543 -328 11.511.8.3 View file →
@@ -26,16 +26,16 @@
26 26 )
27 27 *
28 28 * @return false|int - ID of the page.
29 29 */
30 -function wpbc_create_page( $page_params = array() ){ // FixIn: 9.6.2.10.
31 -
32 - /* Live demos must never create WordPress content through Booking Calendar. */
33 - if ( function_exists( 'wpbc_is_this_demo' ) && wpbc_is_this_demo() ) {
34 - return false;
35 - }
36 -
37 - global $wp_rewrite;
30 +function wpbc_create_page( $page_params = array() ){ // FixIn: 9.6.2.10.
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 +
37 + global $wp_rewrite;
38 38 if ( is_null( $wp_rewrite ) ) { // FixIn: 9.7.1.1.
39 39 return false;
40 40 }
41 41
@@ -374,10 +374,10 @@
374 374 * Create new page or add to existing page the shortcode
375 375 *
376 376 * @param array $params
377 377 *
378 - * @return array success: [ 'result' => true, 'relative_url' => $relative_post_url, 'message' => __( 'Booking form shortcode embedded into the page.', 'booking' ) ]
379 - * 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.
380 380 *
381 381 * Example:
382 382 * $result_arr = wpbc_add_shortcode_into_page( array(
383 383 * 'shortcode' => '[booking resource_id=1]',
@@ -384,8 +384,15 @@
384 384 * 'post_title' => 'Booking Form'
385 385 * ) );
386 386 */
387 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 + }
388 395
389 396 $defaults = array(
390 397 'page_post_name' => '', // 'wpbc-booking',
391 398 'post_title' => esc_html( __( 'Booking Form', 'booking' ) ),
@@ -534,107 +541,290 @@
534 541 * Get starter booking form/page definitions created during plugin activation.
535 542 *
536 543 * @return array
537 544 */
538 -function wpbc_get_activation_booking_form_page_configs() {
545 +function wpbc_get_activation_booking_form_page_configs() {
539 546
540 - return array(
541 - 'full_day_booking' => array(
542 - 'template_key' => 'dates_advanced_3_steps_review_with_hints',
543 - 'form_slug' => 'full_day_booking',
544 - 'form_title' => esc_html__( 'Full Day Booking Form', 'booking' ),
545 - 'page_slug' => 'wp-booking-calendar-full-day',
546 - 'page_title' => esc_html__( 'Full Day Booking', 'booking' ),
547 - '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' ),
548 565 ),
549 - 'time_slots_booking' => array(
550 - 'template_key' => 'time_slots_20_min_3_steps_review_with_hints',
551 - 'form_slug' => 'time_slots_booking',
552 - 'form_title' => esc_html__( 'Time Slots Booking Form', 'booking' ),
553 - 'page_slug' => 'wp-booking-calendar-time-slots',
554 - 'page_title' => esc_html__( 'Time Slots Booking', 'booking' ),
555 - 'button_title' => esc_html__( 'Time slots booking form', 'booking' ),
566 + 'time_appointments_booking' => array(
567 + 'template_key' => 'time_appointments_3_steps_review_with_hints',
568 + 'form_slug' => 'time_appointments_booking',
569 + 'form_title' => esc_html__( 'Time Appointments Booking Form', 'booking' ),
570 + 'create_page' => false,
556 571 ),
557 - 'time_appointments_booking' => array(
558 - 'template_key' => 'time_appointments_3_steps_review_with_hints',
559 - 'form_slug' => 'time_appointments_booking',
560 - 'form_title' => esc_html__( 'Time Appointments Booking Form', 'booking' ),
561 - 'create_page' => false,
562 - ),
563 - 'appointment_services_booking' => array(
564 - 'template_key' => 'appointments_services_flow',
565 - 'form_slug' => 'appointment_services_booking',
566 - 'form_title' => esc_html__( 'Appointment Services Booking Form', 'booking' ),
567 - 'create_page' => false,
568 - 'assign_to_default_appointment_service' => true,
569 - ),
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,
578 + ),
570 579 'contact_form' => array(
571 - 'template_key' => 'contact_form_simple',
572 - 'form_slug' => 'contact_form',
573 - 'form_title' => esc_html__( 'Contact Form', 'booking' ),
574 - 'page_slug' => 'wp-booking-calendar-contact',
575 - 'page_title' => esc_html__( 'Contact Form', 'booking' ),
576 - 'button_title' => esc_html__( 'Contact form', 'booking' ),
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' ),
577 587 ),
588 + );
589 +}
590 +
591 +
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,
578 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;
579 650 }
580 651
581 652
582 653 /**
583 - * Get starter page definitions created during plugin activation.
654 + * Get the Free Booking Received page definition used during initial activation.
584 655 *
585 - * Legacy starter pages keep using their dedicated custom booking forms. The
586 - * old Time Appointments form and the dedicated Appointment Service form are
587 - * form-only fixtures because the Appointment workflow has one canonical page.
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.
588 658 *
589 - * @return array Starter page definitions keyed by stable purpose.
659 + * @return array Confirmation page definition with canonical and legacy slugs.
590 660 */
591 -function wpbc_get_activation_booking_page_configs() {
661 +function wpbc_get_activation_confirmation_page_config() {
592 662
593 - $page_configs = wpbc_get_activation_booking_form_page_configs();
663 + return array(
664 + 'page_slug' => 'booking-calendar-confirmation',
665 + 'legacy_page_slugs' => array( 'wpbc-booking-received' ),
666 + );
667 +}
594 668
595 - foreach ( $page_configs as $page_key => $page_config ) {
596 - if ( isset( $page_config['create_page'] ) && false === (bool) $page_config['create_page'] ) {
597 - unset( $page_configs[ $page_key ] );
598 - continue;
599 - }
600 669
601 - $form_slug = '';
602 - if ( isset( $page_config['form_slug'] ) ) {
603 - $form_slug = sanitize_text_field( (string) $page_config['form_slug'] );
604 - }
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() {
605 676
606 - if ( '' === $form_slug ) {
607 - unset( $page_configs[ $page_key ] );
608 - continue;
609 - }
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 +}
610 694
611 - $shortcode = "[booking resource_id=1 form_type='{$form_slug}']";
612 - $page_configs[ $page_key ]['shortcode'] = $shortcode;
613 - $page_configs[ $page_key ]['shortcode_checks'] = array(
614 - $shortcode,
615 - '[booking resource_id=1 form_type="' . $form_slug . '"]',
616 - );
617 - $page_configs[ $page_key ]['resource_id'] = 1;
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;
618 761 }
619 762
620 - if ( function_exists( 'wpbc_is_11_5_features_enabled' ) && wpbc_is_11_5_features_enabled() ) {
621 - $page_configs['appointment_booking'] = array(
622 - 'page_slug' => 'wpbc-appointment-booking',
623 - 'page_title' => esc_html__( 'Book an Appointment', 'booking' ),
624 - 'button_title' => esc_html__( 'Appointment booking form', 'booking' ),
625 - 'shortcode' => '[booking_appointment]',
626 - 'shortcode_checks' => array( '[booking_appointment]', '[booking_appointment ' ),
627 - 'resource_id' => 0,
628 - );
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 + }
629 789 }
630 790
631 - return $page_configs;
791 + return null;
632 792 }
633 793
634 794
635 795 /**
636 - * Get a bundled BFB template record by template key.
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 +/**
826 + * Get a bundled BFB template record by template key.
637 827 *
638 828 * @param string $template_key Template key.
639 829 *
640 830 * @return array
@@ -667,14 +857,14 @@
667 857 return array();
668 858 }
669 859
670 860
671 -/**
672 - * Create starter custom booking forms from bundled BFB templates.
861 +/**
862 + * Create starter custom booking forms from bundled BFB templates.
673 863 *
674 864 * @return bool
675 865 */
676 -function wpbc_create_activation_custom_booking_forms() {
866 +function wpbc_create_activation_custom_booking_forms() {
677 867
678 868 if (
679 869 ! function_exists( 'wpbc_is_table_exists' ) ||
680 870 ! wpbc_is_table_exists( 'booking_form_structures' ) ||
@@ -746,9 +936,105 @@
746 936 }
747 937 }
748 938
749 939 return $is_created;
750 -}
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 +}
751 1037
752 1038
753 1039 /**
754 1040 * Build starter page content with a booking shortcode.
@@ -790,54 +1076,61 @@
790 1076 }
791 1077
792 1078 // -----------------------------------------------------------------------------------------------------------------
793 1079
794 - wpbc_create_activation_custom_booking_forms();
1080 + wpbc_create_activation_custom_booking_forms();
1081 +
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' );
795 1091
796 - /**
797 - * Fires after activation starter custom forms are available.
798 - *
799 - * Appointment Services uses this boundary to finish its pending starter
800 - * Service seed with the newly created form ID.
801 - *
802 - * @since 11.5.0
803 - */
804 - do_action( 'wpbc_activation_custom_booking_forms_created' );
805 -
806 - $configs = wpbc_get_activation_booking_page_configs();
807 - if ( empty( $configs ) || ! is_array( $configs ) ) {
1092 + if ( ! wpbc_should_create_activation_pages() ) {
808 1093 return;
809 1094 }
1095 +
1096 + $configs = wpbc_get_activation_booking_page_configs();
1097 + if ( empty( $configs ) || ! is_array( $configs ) ) {
1098 + return;
1099 + }
810 1100
811 1101 $front_page_id = 0;
812 1102
813 - foreach ( $configs as $config ) {
1103 + foreach ( $configs as $config ) {
1104 +
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;
1110 +
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 );
814 1118
815 - $shortcode = isset( $config['shortcode'] ) ? trim( (string) $config['shortcode'] ) : '';
816 - $shortcode_checks = isset( $config['shortcode_checks'] ) && is_array( $config['shortcode_checks'] )
817 - ? $config['shortcode_checks']
818 - : array( $shortcode );
819 - $resource_id = isset( $config['resource_id'] ) ? absint( $config['resource_id'] ) : 0;
820 -
821 - if ( '' === $shortcode ) {
822 - continue;
823 - }
824 -
825 - $content = wpbc_get_activation_booking_page_content( $shortcode );
826 -
827 1119 $result_arr = wpbc_add_shortcode_into_page(
828 - array(
1120 + array(
829 1121 'page_post_name' => $config['page_slug'],
1122 + 'page_id' => $existing_page instanceof WP_Post ? $existing_page->ID : 0,
830 1123 'post_title' => $config['page_title'],
831 - 'shortcode' => $content,
832 - 'check_exist_shortcode' => $shortcode_checks,
833 - 'resource_id' => $resource_id,
834 - )
1124 + 'shortcode' => $content,
1125 + 'check_exist_shortcode' => $shortcode_checks,
1126 + 'resource_id' => $resource_id,
1127 + )
835 1128 );
836 -
837 - if ( WPBC_IS_PLAYGROUND && empty( $front_page_id ) && ! empty( $result_arr['relative_url'] ) ) {
838 - $wp_post = get_page_by_path( $config['page_slug'] );
839 - if ( ! empty( $wp_post ) ) {
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 ) ) {
840 1133 $front_page_id = $wp_post->ID;
841 1134 }
842 1135 }
843 1136 }
@@ -858,41 +1151,42 @@
858 1151 */
859 1152 function wpbc_get_published_activation_booking_pages() {
860 1153
861 1154 $pages = array();
862 - $configs = wpbc_get_activation_booking_page_configs();
1155 + $configs = wpbc_get_activation_booking_page_configs();
863 1156
864 1157 if ( empty( $configs ) || ! is_array( $configs ) ) {
865 1158 return $pages;
866 1159 }
867 1160
868 - 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 + }
869 1168
870 - $wp_post = get_page_by_path( $config['page_slug'] );
871 - if ( empty( $wp_post ) ) {
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 + }
1183 + }
1184 +
1185 + if ( ! $is_shortcode_found ) {
872 1186 continue;
873 1187 }
874 1188
875 - $shortcode_checks = isset( $config['shortcode_checks'] ) && is_array( $config['shortcode_checks'] )
876 - ? $config['shortcode_checks']
877 - : array();
878 - $is_shortcode_found = false;
879 -
880 - foreach ( $shortcode_checks as $shortcode_check ) {
881 - if ( '' === (string) $shortcode_check ) {
882 - continue;
883 - }
884 -
885 - if ( wpbc_is_shortcode_exist_in_page_with_id( $wp_post->ID, $shortcode_check ) ) {
886 - $is_shortcode_found = true;
887 - break;
888 - }
889 - }
890 -
891 - if ( ! $is_shortcode_found ) {
892 - continue;
893 - }
894 -
895 1189 $post_url = get_permalink( $wp_post->ID );
896 1190 if ( empty( $post_url ) ) {
897 1191 continue;
898 1192 }
@@ -916,11 +1210,15 @@
916 1210 * @param $default_options_to_add
917 1211 *
918 1212 * @return void
919 1213 */
920 -function wpbc_create_page_thank_you( $default_options_to_add ) { // FixIn: 9.6.2.11.
921 -
922 - 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;
923 1221 if ( is_null( $wp_rewrite ) ) { // FixIn: 9.7.1.1.
924 1222
925 1223 // Maybe it was not init, yet
926 1224 if ( ! has_action( 'init', 'wpbc_create_page_thank_you' ) ) {
@@ -939,20 +1237,24 @@
939 1237 && ( empty( get_page_by_path( 'thank-you' ) ) ) // FixIn: 9.9.0.27.
940 1238 )
941 1239 || ( '/' == wpbc_make_link_relative( get_bk_option( 'booking_thank_you_page_URL' ) ) )
942 1240 ){
943 - $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 + );
944 1246
945 1247 $post_url = '';
946 1248
947 1249 if ( empty( $wp_post ) ) { // No default page. Create it.
948 1250
949 - $page_params = array(
950 - 'post_title' => esc_html( __( 'Booking Received', 'booking' ) ),
951 - 'post_content' => esc_html( __( 'Thank you for your booking. Your booking has been successfully received.', 'booking' ) )
952 - . "\r\n" . ' [booking_confirm]',
953 - 'post_name' => 'wpbc-booking-received'
954 - );
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 + );
955 1257 $post_id = wpbc_create_page( $page_params );
956 1258
957 1259 if ( ! empty( $post_id ) ) {
958 1260 $post_url = wpbc_make_link_relative( get_permalink( $post_id ) );
@@ -986,11 +1288,15 @@
986 1288 * to some pages different from homepage.
987 1289 *
988 1290 * @return void
989 1291 */
990 -function wpbc_create_page_bookingedit(){ // FixIn: 9.6.2.10.
991 -
992 - 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;
993 1299 if ( is_null( $wp_rewrite ) ) { // FixIn: 9.7.1.1.
994 1300 // Maybe it was not init, yet
995 1301 if ( ! has_action( 'init', 'wpbc_create_page_bookingedit' ) ) {
996 1302 add_action( 'init', 'wpbc_create_page_bookingedit', 99 ); // <- priority to load it last
@@ -997,182 +1303,91 @@
997 1303 }
998 1304 return false;
999 1305 }
1000 1306
1001 - // Booking Edit page - set default page and URL ---------------------------------------------------------------
1002 - $url_booking_edit = get_bk_option( 'booking_url_bookings_edit_by_visitors' );
1003 - if (
1004 - ( site_url() == $url_booking_edit )
1005 - && ( empty( get_page_by_path( 'wpbc-my-booking' ) ) )
1006 - ){
1007 - $page_params = array(
1008 - 'post_content' => '[bookingedit]', // The post content
1009 - 'post_name' => 'wpbc-my-booking', // sanitize_title( $post_title )
1010 - 'post_title' => esc_html__( 'My Booking', 'booking' ) // Title
1011 - );
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 + }
1012 1338
1013 - $post_id = wpbc_create_page( $page_params );
1014 -
1015 - if ( ! empty( $post_id ) ) {
1016 - $post_url = get_permalink( $post_id );
1017 - update_bk_option( 'booking_url_bookings_edit_by_visitors', $post_url );
1018 - }
1019 - } else if (
1020 - (
1021 - ( site_url() == $url_booking_edit )
1022 - || ( empty( $url_booking_edit ) )
1023 - )
1024 - && ( ! empty( get_page_by_path( 'wpbc-my-booking' ) ) )
1025 - ){
1026 - $wp_post = get_page_by_path( 'wpbc-my-booking' );
1027 - if ( ! empty( $wp_post ) ) {
1028 - update_bk_option( 'booking_url_bookings_edit_by_visitors', get_permalink( $wp_post->ID ) );
1029 - }
1030 - }
1031 -
1032 - // -----------------------------------------------------------------------------------------------------------------
1033 - // Check if existing page has our shortcode
1034 - // -----------------------------------------------------------------------------------------------------------------
1035 - $booking_edit_relative_url = wpbc_make_link_relative( get_bk_option( 'booking_url_bookings_edit_by_visitors' ) );
1036 - $is_added = wpbc_add_shortcode_to_exist_page( $booking_edit_relative_url, '[bookingedit]' );
1037 -
1038 -
1039 - // =================================================================================================================
1040 - // =================================================================================================================
1041 - // =================================================================================================================
1042 -
1043 -
1044 - // Booking Listing page - set default page and URL ---------------------------------------------------------------
1045 - $url_booking_edit = get_bk_option( 'booking_url_bookings_listing_by_customer' );
1046 - if (
1047 - ( site_url() == $url_booking_edit )
1048 - && ( empty( get_page_by_path( 'wpbc-my-bookings-listing' ) ) )
1049 - ){
1050 -
1051 - $page_params = array(
1052 - 'post_content' => '[bookingcustomerlisting]', // The post content
1053 - 'post_name' => 'wpbc-my-bookings-listing', // sanitize_title( $post_title )
1054 - 'post_title' => esc_html__( 'My Bookings Listing', 'booking' ) // Title
1055 - );
1056 -
1057 - $post_id = wpbc_create_page( $page_params );
1058 -
1059 - if ( ! empty( $post_id ) ) {
1060 - $post_url = get_permalink( $post_id );
1061 - update_bk_option( 'booking_url_bookings_listing_by_customer', $post_url );
1062 - }
1063 - } else if (
1064 - (
1065 - ( site_url() == $url_booking_edit )
1066 - || ( empty( $url_booking_edit ) )
1067 - )
1068 - && ( ! empty( get_page_by_path( 'wpbc-my-bookings-listing' ) ) )
1069 - ){
1070 - $wp_post = get_page_by_path( 'wpbc-my-bookings-listing' );
1071 - if ( ! empty( $wp_post ) ){
1072 - update_bk_option( 'booking_url_bookings_listing_by_customer', get_permalink( $wp_post->ID ) );
1073 - }
1074 - }
1075 -
1076 -
1077 - // -----------------------------------------------------------------------------------------------------------------
1078 - // Check if existing page has our shortcode
1079 - // -----------------------------------------------------------------------------------------------------------------
1080 - $booking_listing_relative_url = wpbc_make_link_relative( get_bk_option( 'booking_url_bookings_listing_by_customer' ) );
1081 - $is_added = wpbc_add_shortcode_to_exist_page( $booking_listing_relative_url, '[bookingcustomerlisting]' );
1082 -
1083 1339 }
1084 1340
1085 1341
1086 -function wpbc_create_page_booking_payment_status(){ // FixIn: 9.6.2.13.
1087 -
1088 - 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;
1089 1349 if ( is_null( $wp_rewrite ) ) { // FixIn: 9.7.1.1.
1090 1350 return false;
1091 1351 }
1092 1352
1093 - // Successful Payment page options ---------------------------------------------------------------------------------
1094 -
1095 - $post_url_relative = false;
1096 - $slug = 'wpbc-booking-payment-successful';
1097 - if ( empty( get_page_by_path( $slug ) ) ) {
1098 - // Create page
1099 - $page_params = array(
1100 - 'post_title' => esc_html( __( 'Booking Payment Confirmation', 'booking' ) ),
1101 - 'post_content' => esc_html( __( 'Thank you for your booking. Your payment for the booking has been successfully received.', 'booking' ) ),
1102 - 'post_name' => $slug
1103 - );
1104 -
1105 - $post_id = wpbc_create_page( $page_params );
1106 -
1107 - if ( ! empty( $post_id ) ) {
1108 - $post_url = get_permalink( $post_id );
1109 - $post_url_relative = str_replace( site_url(), '', $post_url );
1110 - }
1111 - }
1112 - if ( ! empty( $post_url_relative ) ) {
1113 -
1114 - //$post_url_relative = wpbc_make_link_absolute( $post_url_relative );
1115 -
1116 - $payment_systems = array(
1117 - 'booking_stripe_v3_order_successful',
1118 - 'booking_paypal_return_url',
1119 - 'booking_authorizenet_order_successful',
1120 - 'booking_sage_order_successful',
1121 - 'booking_ideal_return_url',
1122 - 'booking_ipay88_return_url'
1123 - );
1124 -
1125 - foreach ( $payment_systems as $payment_system ) {
1126 -
1127 - if (
1128 - ( false === get_bk_option( $payment_system ) )
1129 - || ( '/successful' == wpbc_make_link_relative( get_bk_option( $payment_system ) ) )
1130 - ) {
1131 - update_bk_option( $payment_system, wpbc_make_link_relative( $post_url_relative ) );
1132 - }
1133 - }
1134 - }
1135 -
1136 - // Failed Payment page options -------------------------------------------------------------------------------------
1137 -
1138 - $post_url_relative = false;
1139 - $slug = 'wpbc-booking-payment-failed';
1140 - if ( empty( get_page_by_path( $slug ) ) ) {
1141 - // Create page
1142 - $page_params = array(
1143 - 'post_title' => esc_html( __( 'Booking Payment Failed', 'booking' ) ),
1144 - 'post_content' => esc_html( __( 'Payment Unsuccessful. Please contact us for assistance.', 'booking' ) ),
1145 - 'post_name' => $slug
1146 - );
1147 -
1148 - $post_id = wpbc_create_page( $page_params );
1149 -
1150 - if ( ! empty( $post_id ) ) {
1151 - $post_url = get_permalink( $post_id );
1152 - $post_url_relative = str_replace( site_url(), '', $post_url );
1153 - }
1154 - }
1155 - if ( ! empty( $post_url_relative ) ) {
1156 -
1157 - //$post_url_relative = wpbc_make_link_absolute( $post_url_relative );
1158 -
1159 - $payment_systems = array(
1160 - 'booking_stripe_v3_order_failed',
1161 - 'booking_paypal_cancel_return_url',
1162 - 'booking_authorizenet_order_failed',
1163 - 'booking_sage_order_failed',
1164 - 'booking_ideal_cancel_return_url',
1165 - 'booking_ipay88_cancel_return_url'
1166 - );
1167 -
1168 - foreach ( $payment_systems as $payment_system ) {
1169 -
1170 - if (
1171 - ( false === get_bk_option( $payment_system ) )
1172 - || ( '/failed' == wpbc_make_link_relative( get_bk_option( $payment_system ) ) )
1173 - ) {
1174 - update_bk_option( $payment_system, wpbc_make_link_relative( $post_url_relative ) );
1175 - }
1176 - }
1177 - }
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 + }
1178 1393 }