").append(e.siblings(".um-hidden-multi-selects").clone()).html()+'
'+wp.i18n.__("Remove","ultimate-member")+"",e.append(i),e.find("li:last .um-hidden-multi-selects").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-multi-selects").attr("id",e.data("id_attr")+"-"+t))});var t,e=-(new Date).getTimezoneOffset()/60,i=(jQuery('input[name="um-gmt-offset"]').val(e),jQuery(".um-admin-metabox").find(".um-slider").each(function(){var e=jQuery(this),a=parseInt(e.data("min")),t=parseInt(e.data("max")),a=[a=void 0!==jQuery("#"+e.data("field_name")+"_min").val()?jQuery("#"+e.data("field_name")+"_min").val():a,t=void 0!==jQuery("#"+e.data("field_name")+"_max").val()?jQuery("#"+e.data("field_name")+"_max").val():t];e.slider({range:!0,min:parseInt(e.data("min")),max:parseInt(e.data("max")),values:a,create:function(e,a){},step:1,slide:function(e,a){s(jQuery(this),a)},stop:function(e,a){}}),s(e)}),jQuery(".um-admin-metabox").find(".um-datepicker-filter").each(function(){var e=jQuery(this),a=new Date(1e3*e.data("date_min")),t=new Date(1e3*e.data("date_max"));e.pickadate({selectYears:!0,min:a,max:t,formatSubmit:"yyyy/mm/dd",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(e){}}).pickadate("picker").set("select",1e3*e.data("value"))}),jQuery(".um-admin-metabox").find(".um-timepicker-filter").each(function(){var e=jQuery(this),a=e.data("min"),t=e.data("max"),a=a.split(":"),t=t.split(":");e.pickatime({format:e.data("format"),interval:parseInt(e.data("intervals")),min:[a[0],a[1]],max:[t[0],t[1]],formatSubmit:"HH:i",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(e){}})}),!1);function s(e,a){var t,i="",s=e.siblings(".um-slider-range").data("placeholder-s"),l=e.siblings(".um-slider-range").data("placeholder-p"),a=a?(i=(a.values[0]===a.values[1]?s.replace("{value}",a.values[0]):l.replace("{min_range}",a.values[0]).replace("{max_range}",a.values[1])).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=a.values[0],a.values[1]):(i=(e.slider("values",0)===e.slider("values",1)?s.replace("{value}",e.slider("values",0)):l.replace("{min_range}",e.slider("values",0)).replace("{max_range}",e.slider("values",1))).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=e.slider("values",0),e.slider("values",1));e.siblings(".um-slider-range").html(i),e.siblings(".um_range_min").val(t),e.siblings(".um_range_max").val(a)}function a(){jQuery(".um-forms-line").removeClass("um-forms-line-conditioned").each(function(){void 0===jQuery(this).data("conditional")||jQuery(this).hasClass("um-forms-line-conditioned")||(!function i(e){e.addClass("um-forms-line-conditioned");var a=e.data("conditional");var t=a[1];var s=a[2];var l=e.data("prefix");var n=!0;{var r,u;"="===t||"!="===t?-1===a[0].indexOf("||")&&void 0!==(u=jQuery("#"+l+"_"+a[0])).parents(".um-forms-line").data("conditional")&&(n=i(u.parents(".um-forms-line"))):"~"===t?(m=a[0].split("|"),r=[],jQuery.each(m,function(e){r.push(jQuery("#"+l+"_"+m[e]))}),void 0!==r[0].parents(".um-forms-line").data("conditional")&&(n=i(r[0].parents(".um-forms-line")))):"><"===t&&void 0!==(u=jQuery("#"+l+"_"+a[0]+"_"+a[2])).parents(".um-forms-line").data("conditional")&&(n=i(u.parents(".um-forms-line")))}var d=!1;{var m,o,c,p,f,_,g,h;if("="===t)return-1!==a[0].indexOf("||")?(m=a[0].split("||"),o=!1,jQuery.each(m,function(e){var a,e=jQuery("#"+l+"_"+m[e]),t=(n=!(d=!1),void 0!==e.parents(".um-forms-line").data("conditional")&&(n=i(e.parents(".um-forms-line"))),e.prop("tagName").toLowerCase());"input"===t?(a=e.attr("type"),d="checkbox"===a?"1"==s?e.is(":checked"):!e.is(":checked"):Array.isArray(s)?-1!==s.indexOf(e.val()):e.val()==s):"select"===t&&(d=Array.isArray(s)?-1!==s.indexOf(e.val()):e.val()==s),d&&n&&(o=!0)}),o):("input"==(g=u.prop("tagName").toLowerCase())?(h=u.attr("type"),d="checkbox"==h?"1"==s?u.is(":checked"):!u.is(":checked"):Array.isArray(s)?-1!==s.indexOf(u.val()):u.val()==s):"select"==g&&(d=Array.isArray(s)?-1!==s.indexOf(u.val()):u.val()==s),d&&n);if("!="===t)return-1!==a[0].indexOf("||")?(m=a[0].split("||"),o=!1,jQuery.each(m,function(e){var a,e=jQuery("#"+l+"_"+m[e]),t=(n=!(d=!1),void 0!==e.parents(".um-forms-line").data("conditional")&&(n=i(e.parents(".um-forms-line"))),e.prop("tagName").toLowerCase());"input"===t?(a=e.attr("type"),d="checkbox"===a?"1"==s?!e.is(":checked"):e.is(":checked"):e.val()!=s):"select"===t&&(d=e.val()!=s),d&&n&&(o=!0)}),o):("input"==(g=u.prop("tagName").toLowerCase())?(h=u.attr("type"),d="checkbox"==h?"1"==s?!u.is(":checked"):u.is(":checked"):u.val()!=s):"select"==g&&(d=u.val()!=s),d&&n);if("~"===t)return p=[],"sortable_items"===e.data("field_type")?(c=e.find(".um-sortable-items-value").data("field_id"),jQuery.each(r,function(e){var e=r[e],a=e.prop("tagName").toLowerCase();"input"===a?"checkbox"===e.attr("type")&&"1"==s&&e.is(":checked")&&p.push(e.data("fill_"+c)):"select"==a&&!s&&e.val()&&(p=(p=p.concat(e.val())).filter(y))}),f=jQuery('[data-field_id="'+c+'"]'),p.length?(f.siblings(".um-sortable-items-field").find("li").addClass("um-hidden-item"),jQuery.each(p,function(e){f.siblings(".um-sortable-items-field").find('li[data-tab-id="'+p[e]+'"]').removeClass("um-hidden-item")}),_=[],f.siblings(".um-sortable-items-field").find("li").each(function(){jQuery(this).hasClass("um-hidden-item")||_.push(jQuery(this).data("tab-id"))}),f.val(_.join(",")),f.siblings(".um-sortable-items-field").sortable("refresh"),d=!0):f.val(null)):(c=e.find(e.data("field_type")).data("field_id"),jQuery.each(r,function(e){var e=r[e],a=e.prop("tagName").toLowerCase();"input"===a?"checkbox"===e.attr("type")&&"1"==s&&e.is(":checked")&&p.push(e.data("fill_"+c)):"select"==a&&!s&&e.val()&&(p=(p=p.concat(e.val())).filter(y))}),f=jQuery('[data-field_id="'+c+'"]'),p.length?(f.find("option").hide(),jQuery.each(p,function(e){f.find('option[value="'+p[e]+'"]').show()}),-1===p.indexOf(f.val())&&(f.val(p[0]),f.find("option").attr("selected",!1).prop("selected",!1),f.find('option[value="'+p[0]+'"]').attr("selected",!0).prop("selected",!0)),d=!0):(f.val(null),f.find("option").attr("selected",!1).prop("selected",!1))),d&&n;if("><"===t)return g=u.prop("tagName").toLowerCase(),(d="input"==g&&"checkbox"==(h=u.attr("type"))?u.is(":checked"):d)&&n}return!1}(jQuery(this))?jQuery(this).hide():(jQuery(this).show(),um_admin_init_users_select()))})}function y(e,a,t){return t.indexOf(e)===a}jQuery(document.body).on("change",".um-md-default-filters-option-line .um-field-wrapper select",function(){var t,e,a;i||(e=(t=jQuery(this)).val(),a=t.data("member_directory"),i=!0,wp.ajax.send("um_member_directory_default_filter_settings",{data:{key:e,directory_id:a,nonce:um_admin_scripts.nonce},success:function(e){var a=t.parents(".um-md-default-filters-option-line").find(".um-field-wrapper2");a.html(e.field_html),i=!1,a.find(".um-slider").each(function(){var e=jQuery(this),a=[parseInt(e.data("min")),parseInt(e.data("max"))];e.slider({range:!0,min:parseInt(e.data("min")),max:parseInt(e.data("max")),values:a,create:function(e,a){},step:1,slide:function(e,a){s(jQuery(this),a)},stop:function(e,a){}}),s(e)}),a.find(".um-datepicker-filter").each(function(){var e=jQuery(this),a=new Date(1e3*e.data("date_min")),t=new Date(1e3*e.data("date_max"));e.pickadate({selectYears:!0,min:a,max:t,formatSubmit:"yyyy/mm/dd",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(e){}})}),a.find(".um-timepicker-filter").each(function(){var e=jQuery(this),a=e.data("min"),t=e.data("max"),a=a.split(":"),t=t.split(":");e.pickatime({format:e.data("format"),interval:parseInt(e.data("intervals")),min:[a[0],a[1]],max:[t[0],t[1]],formatSubmit:"HH:i",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(e){}})})},error:function(e){return!1}}))}),jQuery(".um-md-default-filters-add-option").on("click",function(){var e,a,t;i||((e=jQuery(this).siblings("ul.um-md-default-filters-list")).data("field_id"),(a=0)
").append(e.siblings(".um-hidden-md-default-filters").clone()).html(),e.append(''+t+''+wp.i18n.__("Remove","ultimate-member")+''),e.find("li:last .um-hidden-md-default-filters").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-md-default-filters").attr("id",e.data("id_attr")+"-"+a),e.find("li:last .um-field-wrapper select").trigger("change"))}),jQuery(document.body).on("click",".um-text-delete",function(){jQuery(this).parents("li.um-multi-text-option-line").remove()}),jQuery(".um-multi-text-add-option").on("click",function(){var e=jQuery(this).siblings("ul.um-multi-text-list"),a=0,t=(0").append(e.siblings(".um-hidden-multi-text").clone()).html()),i=e.data("item_class");e.append(''+t+''+wp.i18n.__("Remove","ultimate-member")+""),e.find("li:last .um-hidden-multi-text").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-multi-text").attr("id",e.data("id_attr")+"-"+a)}),jQuery(".um-media-upload").each(function(){var e=jQuery(this).find(".um-forms-field"),a=e.data("default");""!=e.val()&&e.val()!=a?(e.siblings(".um-set-image").hide(),e.siblings(".um-clear-image").show(),e.siblings(".icon_preview").show()):(e.val()==a&&e.siblings(".icon_preview").show(),e.siblings(".um-set-image").show(),e.siblings(".um-clear-image").hide())}),"undefined"!=typeof wp&&wp.media&&wp.media.editor&&(jQuery(".um-set-image").on("click",function(e){var a=jQuery(this);e.preventDefault(),t&&t.remove(),(t=wp.media({title:a.data("upload_frame"),button:{text:wp.i18n.__("Select","ultimate-member")},multiple:!1})).on("select",function(){var e=t.state().get("selection").first().toJSON();a.siblings(".icon_preview").attr("src",e.url).show(),a.siblings(".um-forms-field").val(e.url),a.siblings(".um-media-upload-data-id").val(e.id),a.siblings(".um-media-upload-data-width").val(e.width),a.siblings(".um-media-upload-data-height").val(e.height),a.siblings(".um-media-upload-data-thumbnail").val(e.thumbnail),a.siblings(".um-media-upload-data-url").trigger("change"),a.siblings(".um-media-upload-url").val(e.url),a.siblings(".um-clear-image").show(),a.hide(),jQuery(document).trigger("um_media_upload_select",[a,e])}),t.open()}),jQuery(".icon_preview").on("click",function(e){jQuery(this).siblings(".um-set-image").trigger("click")}),jQuery(".um-clear-image").on("click",function(e){var a=jQuery(this),t=a.siblings(".um-forms-field").data("default");a.siblings(".um-set-image").show(),a.hide(),a.siblings(".icon_preview").attr("src",t),a.siblings(".um-media-upload-data-id").val(""),a.siblings(".um-media-upload-data-width").val(""),a.siblings(".um-media-upload-data-height").val(""),a.siblings(".um-media-upload-data-thumbnail").val(""),a.siblings(".um-forms-field").val(t),a.siblings(".um-media-upload-data-url").trigger("change"),a.siblings(".um-media-upload-url").val(t),jQuery(document).trigger("um_media_upload_clear",a)})),jQuery(document.body).on("change",".um-forms-field",function(){(0form_data['prefix_id'] ) ? sanitize_title( $this->form_data['prefix_id'] ) : '' ) . '_' . $field_data['id'];
+ $id_attr = ' id="' . esc_attr( $id ) . '" ';
+
+ $class = ! empty( $field_data['class'] ) ? $field_data['class'] . ' ' : ' ';
+ $class .= ! empty( $field_data['size'] ) ? 'um-' . $field_data['size'] . '-field' : 'um-long-field';
+ $class_attr = ' class="um-forms-field um-pages-select2 ' . esc_attr( $class ) . '" ';
+
+ $data = array(
+ 'field_id' => $field_data['id'],
+ );
+
+ if ( ! empty( $field_data['placeholder'] ) ) {
+ $data['placeholder'] = $field_data['placeholder'];
+ }
+
+ $data_attr = '';
+ foreach ( $data as $key => $value ) {
+ $data_attr .= ' data-' . $key . '="' . esc_attr( $value ) . '" ';
+ }
+
+ $name = $field_data['id'];
+ $name = ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] . '[' . $name . ']' : $name;
+ $hidden_name_attr = ' name="' . $name . '" ';
+ $name = $name . ( ! empty( $field_data['multi'] ) ? '[]' : '' );
+ $name_attr = ' name="' . $name . '" ';
+
+ $value = $this->get_field_value( $field_data );
+
+ $options = '';
+ if ( ! empty( $field_data['options'] ) ) {
+ foreach ( $field_data['options'] as $key => $option ) {
+ if ( ! empty( $field_data['multi'] ) ) {
+
+ if ( ! is_array( $value ) || empty( $value ) ) {
+ $value = array();
+ }
+
+ $options .= '';
+ } else {
+ $options .= '';
+ }
+ }
+ }
+
+ $hidden = '';
+ if ( ! empty( $multiple ) ) {
+ $hidden = "";
+ }
+
+ $button = '';
+ $slug = str_replace( 'core_', '', $field_data['id'] );
+ if ( ! um_get_predefined_page_id( $slug ) || 'publish' !== get_post_status( um_get_predefined_page_id( $slug ) ) ) {
+ $button = ' ' . esc_html__( 'Create Default', 'ultimate-member' ) . '';
+ }
+
+ $html = "$hidden$button";
+
+ return $html;
+ }
/**
* @param $field_data
diff --git a/includes/admin/core/class-admin-settings.php b/includes/admin/core/class-admin-settings.php
index 6cb5320c..6acfddd7 100644
--- a/includes/admin/core/class-admin-settings.php
+++ b/includes/admin/core/class-admin-settings.php
@@ -253,37 +253,131 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
),
);
- $core_pages = UM()->config()->core_pages;
-
- foreach ( $core_pages as $page_s => $page ) {
- $have_pages = UM()->query()->wp_pages();
- $page_id = UM()->options()->get_core_page_id( $page_s );
+// $core_pages = UM()->config()->core_pages;
+//
+// foreach ( $core_pages as $page_s => $page ) {
+// $have_pages = UM()->query()->wp_pages();
+// $page_id = UM()->options()->get_core_page_id( $page_s );
+//
+// $page_title = ! empty( $page['title'] ) ? $page['title'] : '';
+//
+// if ( 'reached_maximum_limit' === $have_pages ) {
+// $general_pages_fields[] = array(
+// 'id' => $page_id,
+// 'type' => 'text',
+// // translators: %s: Page title
+// 'label' => sprintf( __( '%s page', 'ultimate-member' ), $page_title ),
+// 'placeholder' => __( 'Add page ID', 'ultimate-member' ),
+// 'compiler' => true,
+// 'size' => 'small',
+// );
+// } else {
+// $general_pages_fields[] = array(
+// 'id' => $page_id,
+// 'type' => 'select',
+// // translators: %s: Page title
+// 'label' => sprintf( __( '%s page', 'ultimate-member' ), $page_title ),
+// 'options' => UM()->query()->wp_pages(),
+// 'placeholder' => __( 'Choose a page...', 'ultimate-member' ),
+// 'compiler' => true,
+// 'size' => 'small',
+// );
+// }
+//
+// $settings_map[ $page_id ] = array(
+// 'sanitize' => 'absint',
+// );
+// }
+ foreach ( UM()->config()->get( 'predefined_pages' ) as $slug => $page ) {
+ $page_id = UM()->options()->get_predefined_page_option_key( $slug );
$page_title = ! empty( $page['title'] ) ? $page['title'] : '';
- if ( 'reached_maximum_limit' === $have_pages ) {
- $general_pages_fields[] = array(
- 'id' => $page_id,
- 'type' => 'text',
- // translators: %s: Page title
- 'label' => sprintf( __( '%s page', 'ultimate-member' ), $page_title ),
- 'placeholder' => __( 'Add page ID', 'ultimate-member' ),
- 'compiler' => true,
- 'size' => 'small',
- );
+ $options = array();
+ $page_value = '';
+
+ $pre_result = apply_filters( 'um_admin_settings_pages_list_value', false, $page_id );
+ if ( false === $pre_result ) {
+ if ( ! empty( $opt_value = UM()->options()->get( $page_id ) ) ) {
+ if ( 'publish' === get_post_status( $opt_value ) ) {
+ $title = get_the_title( $opt_value );
+ $title = ( mb_strlen( $title ) > 50 ) ? mb_substr( $title, 0, 49 ) . '...' : $title;
+ $title = sprintf( __( '%s (ID: %s)', 'ultimate-member' ), $title, $opt_value );
+
+ $options = array( $opt_value => $title );
+ $page_value = $opt_value;
+ }
+ }
} else {
- $general_pages_fields[] = array(
- 'id' => $page_id,
- 'type' => 'select',
- // translators: %s: Page title
- 'label' => sprintf( __( '%s page', 'ultimate-member' ), $page_title ),
- 'options' => UM()->query()->wp_pages(),
- 'placeholder' => __( 'Choose a page...', 'ultimate-member' ),
- 'compiler' => true,
- 'size' => 'small',
- );
+ // `page_value` variable that we transfer from 3rd-party hook for getting filtered option value also
+ $page_value = $pre_result['page_value'];
+ unset( $pre_result['page_value'] );
+
+ $options = $pre_result;
}
+ $page_setting_description = '';
+ if ( ! empty( $page_value ) ) {
+ $content = get_the_content( null, false, $page_value );
+ switch ( $slug ) {
+ case 'account':
+ if ( $page_value === um_get_predefined_page_id( 'user' ) ) {
+ $page_setting_description = __( 'Warning: Account page and User page must be separate pages.', 'ultimate-member' );
+ } elseif ( ! has_shortcode( $content, 'ultimatemember_account' ) ) {
+ $page_setting_description = __( 'Warning: Account page must contain shortcode [ultimatemember_account].', 'ultimate-member' );
+ } elseif ( function_exists( 'wc_get_page_id' ) && wc_get_page_id( 'myaccount' ) === um_get_predefined_page_id( 'account' ) ) {
+ $page_setting_description = __( 'Warning: Account page and WooCommerce "My account" page should be separate pages.', 'ultimate-member' );
+ }
+ break;
+ case 'login':
+ if ( $page_value === um_get_predefined_page_id( 'logout' ) ) {
+ $page_setting_description = __( 'Warning: Login page and Logout page must be separate pages.', 'ultimate-member' );
+ } elseif ( ! has_shortcode( $content, 'ultimatemember' ) ) {
+ $page_setting_description = __( 'Warning: Login page must contain a login form shortcode. You can get existing shortcode or create a new one here.', 'ultimate-member' );
+ }
+ break;
+ case 'logout':
+ if ( $page_value === (int) get_option( 'page_on_front' ) ) {
+ $page_setting_description = __( 'Warning: Home page and Logout page must be separate pages.', 'ultimate-member' );
+ } elseif ( $page_value === um_get_predefined_page_id( 'login' ) ) {
+ $page_setting_description = __( 'Warning: Login page and Logout page must be separate pages.', 'ultimate-member' );
+ }
+ break;
+ case 'password-reset':
+ if ( ! has_shortcode( $content, 'ultimatemember_password' ) ) {
+ $page_setting_description = __( 'Warning: Password Reset page must contain shortcode [ultimatemember_password].', 'ultimate-member' );
+ }
+ break;
+ case 'register':
+ if ( ! has_shortcode( $content, 'ultimatemember' ) ) {
+ $page_setting_description = __( 'Warning: Register page must contain a registration form shortcode. You can get existing shortcode or create a new one here.', 'ultimate-member' );
+ }
+ break;
+ case 'user':
+ if ( $page_value === um_get_predefined_page_id( 'account' ) ) {
+ $description = __( 'Warning: Account page and User page must be separate pages.', 'ultimate-member' );
+ } elseif ( ! has_shortcode( $content, 'ultimatemember' ) ) {
+ $page_setting_description = __( 'Warning: User page must contain a profile form shortcode. You can get existing shortcode or create a new one here.', 'ultimate-member' );
+ }
+ break;
+ default:
+ $page_setting_description = apply_filters( 'um_pages_settings_description', $page_setting_description, $content, $slug );
+ break;
+ }
+ }
+
+ $general_pages_fields[] = array(
+ 'id' => $page_id,
+ 'type' => 'page_select',
+ // translators: %s: Page title
+ 'label' => sprintf( __( '%s page', 'ultimate-member' ), $page_title ),
+ 'options' => $options,
+ 'value' => $page_value,
+ 'placeholder' => __( 'Choose a page...', 'ultimate-member' ),
+ 'size' => 'small',
+ 'description' => $page_setting_description,
+ );
+
$settings_map[ $page_id ] = array(
'sanitize' => 'absint',
);
diff --git a/includes/ajax/class-init.php b/includes/ajax/class-init.php
index 4772a48c..45ae7e2c 100644
--- a/includes/ajax/class-init.php
+++ b/includes/ajax/class-init.php
@@ -20,9 +20,22 @@ if ( ! class_exists( 'um\ajax\Init' ) ) {
* @used-by \UM::includes()
*/
public function includes() {
+ $this->pages();
$this->secure();
}
+ /**
+ * @since 2.8.3
+ *
+ * @return Pages
+ */
+ public function pages() {
+ if ( empty( UM()->classes['um\ajax\pages'] ) ) {
+ UM()->classes['um\ajax\pages'] = new Pages();
+ }
+ return UM()->classes['um\ajax\pages'];
+ }
+
/**
* @since 2.6.8
*
diff --git a/includes/ajax/class-pages.php b/includes/ajax/class-pages.php
new file mode 100644
index 00000000..60bd674b
--- /dev/null
+++ b/includes/ajax/class-pages.php
@@ -0,0 +1,69 @@
+admin()->check_ajax_nonce();
+
+ // we will pass post IDs and titles to this array
+ $return = array();
+
+ $pre_result = apply_filters( 'um_admin_settings_get_pages_list', false );
+
+ if ( false === $pre_result ) {
+ $query_args = array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish', // if you don't want drafts to be returned
+ 'ignore_sticky_posts' => 1,
+ 'posts_per_page' => 10, // how much to show at once
+ 'paged' => absint( $_GET['page'] ),
+ 'orderby' => 'title',
+ 'order' => 'asc',
+ );
+
+ if ( ! empty( $_GET['search'] ) ) {
+ $query_args['s'] = sanitize_text_field( $_GET['search'] ); // the search query
+ }
+
+ $search_results = new \WP_Query( $query_args );
+
+ if ( $search_results->have_posts() ) {
+ while ( $search_results->have_posts() ) {
+ $search_results->the_post();
+
+ // shorten the title a little
+ $title = ( mb_strlen( $search_results->post->post_title ) > 50 ) ? mb_substr( $search_results->post->post_title, 0, 49 ) . '...' : $search_results->post->post_title;
+ $title = sprintf( __( '%s (ID: %s)', 'ultimate-member' ), $title, $search_results->post->ID );
+ $return[] = array( $search_results->post->ID, $title ); // array( Post ID, Post Title )
+ }
+ }
+
+ $return['total_count'] = $search_results->found_posts;
+ } else {
+ // got already calculated posts array from 3rd-party integrations (e.g. WPML, Polylang)
+ $return = $pre_result;
+ }
+
+ wp_send_json( $return );
+ }
+}
diff --git a/includes/class-config.php b/includes/class-config.php
index 2b570c3b..44bd055d 100644
--- a/includes/class-config.php
+++ b/includes/class-config.php
@@ -31,6 +31,13 @@ if ( ! class_exists( 'um\Config' ) ) {
*/
public $core_pages;
+ /**
+ * @since 2.8.3
+ *
+ * @var array
+ */
+ public $predefined_pages;
+
/**
* @var array
*/
@@ -841,6 +848,90 @@ if ( ! class_exists( 'um\Config' ) ) {
'password-reset' => array( 'title' => __( 'Password Reset', 'ultimate-member' ) ),
) );
}
- //end class
+
+ /**
+ * Get variable from config
+ *
+ * @param string $key
+ *
+ * @return mixed
+ *
+ * @since 2.8.3
+ */
+ public function get( $key ) {
+ if ( empty( $this->$key ) ) {
+ $this->{'init_' . $key}();
+ }
+ return apply_filters( 'um_config_get', $this->$key, $key );
+ }
+
+ /**
+ * Init plugin core pages.
+ *
+ * @since 2.8.3
+ */
+ public function init_predefined_pages() {
+ $core_forms = get_option( 'um_core_forms', array() );
+ $setup_shortcodes = array_merge(
+ array(
+ 'profile' => '',
+ 'login' => '',
+ 'register' => '',
+ ),
+ $core_forms
+ );
+
+ $this->predefined_pages = array(
+ 'user' => array(
+ 'title' => __( 'User', 'ultimate-member' ),
+ 'content' => ! empty( $setup_shortcodes['profile'] ) ? '[ultimatemember form_id="' . $setup_shortcodes['profile'] . '"]' : '',
+ ),
+ 'login' => array(
+ 'title' => __( 'Login', 'ultimate-member' ),
+ 'content' => ! empty( $setup_shortcodes['login'] ) ? '[ultimatemember form_id="' . $setup_shortcodes['login'] . '"]' : '',
+ ),
+ 'register' => array(
+ 'title' => __( 'Register', 'ultimate-member' ),
+ 'content' => ! empty( $setup_shortcodes['register'] ) ? '[ultimatemember form_id="' . $setup_shortcodes['register'] . '"]' : '',
+ ),
+ 'logout' => array(
+ 'title' => __( 'Logout', 'ultimate-member' ),
+ 'content' => '',
+ ),
+ 'account' => array(
+ 'title' => __( 'Account', 'ultimate-member' ),
+ 'content' => '[ultimatemember_account]',
+ ),
+ 'password-reset' => array(
+ 'title' => __( 'Password Reset', 'ultimate-member' ),
+ 'content' => '[ultimatemember_password]',
+ ),
+ );
+
+ /**
+ * Filters Ultimate Member predefined pages.
+ *
+ * @param {array} $pages Predefined pages.
+ *
+ * @return {array} Predefined pages.
+ *
+ * @since 2.8.3
+ * @hook um_predefined_pages
+ *
+ * @example Extend UM core pages.
+ * function my_predefined_pages( $pages ) {
+ * // your code here
+ * $pages['my_page_key'] = array( 'title' => __( 'My Page Title', 'my-translate-key' ) );
+ * return $pages;
+ * }
+ * add_filter( 'um_predefined_pages', 'my_predefined_pages' );
+ */
+ $this->predefined_pages = apply_filters( 'um_predefined_pages', $this->predefined_pages );
+
+ // since 2.8.3 legacy hook
+ // @todo remove in 3.0 version
+ $this->predefined_pages = apply_filters( 'um_core_pages', $this->predefined_pages );
+ $this->core_pages = $this->predefined_pages;
+ }
}
}
diff --git a/includes/class-init.php b/includes/class-init.php
index 210caebf..0a7d33b4 100644
--- a/includes/class-init.php
+++ b/includes/class-init.php
@@ -228,7 +228,8 @@ if ( ! class_exists( 'UM' ) ) {
// init widgets
add_action( 'widgets_init', array( &$this, 'widgets_init' ) );
- //include short non class functions
+ // Include short non-class functions
+ require_once 'um-core-functions.php';
require_once 'um-short-functions.php';
require_once 'um-deprecated-functions.php';
}
@@ -585,8 +586,6 @@ if ( ! class_exists( 'UM' ) ) {
$this->theme_updater();
} elseif ( $this->is_request( 'frontend' ) ) {
$this->frontend()->includes();
- $this->account();
- $this->password();
$this->login();
$this->register();
$this->user_posts();
@@ -594,6 +593,8 @@ if ( ! class_exists( 'UM' ) ) {
}
//common includes
+ $this->account();
+ $this->password();
$this->rewrite();
$this->mail();
$this->rest_api();
diff --git a/includes/core/class-options.php b/includes/core/class-options.php
index a453e1f9..66a0ca97 100644
--- a/includes/core/class-options.php
+++ b/includes/core/class-options.php
@@ -1,8 +1,9 @@
config()->get( 'predefined_pages' );
+ return array_key_exists( $slug, $predefined_pages );
+}
+
+/**
+ * @param string $slug
+ *
+ * @return false|int
+ */
+function um_get_predefined_page_id( $slug ) {
+ if ( ! um_predefined_page_slug_exists( $slug ) ) {
+ return false;
+ }
+
+ $option_key = UM()->options()->get_predefined_page_option_key( $slug );
+ return apply_filters( 'um_get_predefined_page_id', UM()->options()->get( $option_key ), $slug );
+}
+
+/**
+ *
+ * @param string $slug
+ * @param null|int|\WP_Post $post
+ *
+ * @return bool
+ */
+function um_is_predefined_page( $slug, $post = null ) {
+ // handle $post inside, just we need make $post as \WP_Post. Otherwise something is wrong and return false
+ if ( ! $post ) {
+ global $post;
+
+ if ( empty( $post ) ) {
+ return false;
+ }
+ } else {
+ if ( is_numeric( $post ) ) {
+ $post = get_post( $post );
+
+ if ( empty( $post ) ) {
+ return false;
+ }
+ }
+ }
+
+ if ( empty( $post->ID ) ) {
+ return false;
+ }
+
+ return um_get_predefined_page_id( $slug ) === $post->ID;
+}
+
+/**
+ * Get predefined page URL
+ *
+ * @param string $slug
+ *
+ * @return false|string
+ */
+function um_get_predefined_page_url( $slug ) {
+ $url = false;
+
+ if ( $page_id = um_get_predefined_page_id( $slug ) ) {
+ $url = get_permalink( $page_id );
+ }
+
+ return $url;
+}