id, array( $this, 'get_settings' ), 100 );
$this->type = $type;
if ( 'module' === $this->type ) {
$this->parent_id = '';
}
add_action( 'init', array( $this, 'add_settings' ) );
add_action( 'init', array( $this, 'reset_settings' ), PHP_INT_MAX );
}
/**
* save_meta_box_validate_value.
*
* @version 2.9.1
* @since 2.9.1
*/
function save_meta_box_validate_value( $option_value, $option_name, $module_id ) {
if ( true === apply_filters( 'booster_option', false, true ) ) {
return $option_value;
}
if ( 'no' === $option_value ) {
return $option_value;
}
if ( $this->id === $module_id && $this->meta_box_validate_value === $option_name ) {
$args = array(
'post_type' => 'product',
'post_status' => 'any',
'posts_per_page' => 1,
'meta_key' => '_' . $this->meta_box_validate_value,
'meta_value' => 'yes',
'post__not_in' => array( get_the_ID() ),
);
$loop = new WP_Query( $args );
$c = $loop->found_posts + 1;
if ( $c >= 2 ) {
add_filter( 'redirect_post_location', array( $this, 'validate_value_add_notice_query_var' ), 99 );
return 'no';
}
}
return $option_value;
}
/**
* validate_value_add_notice_query_var.
*
* @version 2.9.1
* @since 2.9.1
*/
function validate_value_add_notice_query_var( $location ) {
remove_filter( 'redirect_post_location', array( $this, 'validate_value_add_notice_query_var' ), 99 );
return add_query_arg( array( 'wcj_' . $this->id . '_meta_box_admin_notice' => true ), $location );
}
/**
* validate_value_admin_notices.
*
* @version 2.9.1
* @since 2.9.1
*/
function validate_value_admin_notices() {
if ( ! isset( $_GET[ 'wcj_' . $this->id . '_meta_box_admin_notice' ] ) ) {
return;
}
echo '
' . '
' . '
' .
sprintf(
__( 'Booster: Free plugin\'s version is limited to only one "%1$s" product with settings on per product basis enabled at a time. You will need to get
Booster Plus to add unlimited number of "%1$s" products.', 'woocommerce-jetpack' ),
$this->short_desc, 'https://booster.io/plus/'
) .
'
' . '' . '
';
}
/**
* get_meta_box_options.
*
* @version 2.8.0
* @since 2.8.0
*/
function get_meta_box_options() {
$filename = wcj_plugin_path() . '/includes/settings/meta-box/wcj-settings-meta-box-' . str_replace( '_', '-', $this->id ) . '.php';
return ( file_exists ( $filename ) ? require( $filename ) : array() );
}
/**
* maybe_fix_settings.
*
* @version 3.2.1
* @since 3.2.1
*/
function maybe_fix_settings( $settings ) {
if ( ! WCJ_IS_WC_VERSION_BELOW_3_2_0 ) {
foreach ( $settings as &$setting ) {
if ( isset( $setting['type'] ) && 'select' === $setting['type'] ) {
if ( ! isset( $setting['class'] ) || '' === $setting['class'] ) {
$setting['class'] = 'wc-enhanced-select';
} else {
$setting['class'] .= ' ' . 'wc-enhanced-select';
}
}
if ( isset( $setting['type'] ) && 'text' === $setting['type'] && isset( $setting['class'] ) && 'widefat' === $setting['class'] ) {
if ( ! isset( $setting['css'] ) || '' === $setting['css'] ) {
$setting['css'] = 'width:100%;';
} else {
$setting['css'] .= ' ' . 'width:100%;';
}
}
}
}
return $settings;
}
/**
* add_settings_from_file.
*
* @version 3.2.1
* @since 2.8.0
*/
function add_settings_from_file( $settings ) {
$filename = wcj_plugin_path() . '/includes/settings/wcj-settings-' . str_replace( '_', '-', $this->id ) . '.php';
$settings = ( file_exists ( $filename ) ? require( $filename ) : $settings );
return $this->maybe_fix_settings( $settings );
}
/*
* add_settings.
*
* @version 2.8.0
* @since 2.8.0
*/
function add_settings() {
add_filter( 'wcj_' . $this->id . '_settings', array( $this, 'add_settings_from_file' ) );
}
/**
* save_meta_box_value.
*
* @version 2.5.3
* @since 2.5.3
*/
function save_meta_box_value( $option_value, $option_name, $module_id ) {
if ( true === apply_filters( 'booster_option', false, true ) ) {
return $option_value;
}
if ( 'no' === $option_value ) {
return $option_value;
}
if ( $this->id === $module_id && $this->co === $option_name ) {
$args = array(
'post_type' => 'product',
'post_status' => 'any',
'posts_per_page' => 3,
'meta_key' => '_' . $this->co,
'meta_value' => 'yes',
'post__not_in' => array( get_the_ID() ),
);
$loop = new WP_Query( $args );
$c = $loop->found_posts + 1;
if ( $c >= 4 ) {
add_filter( 'redirect_post_location', array( $this, 'add_notice_query_var' ), 99 );
return 'no';
}
}
return $option_value;
}
/**
* add_notice_query_var.
*
* @version 2.5.3
* @since 2.5.3
*/
function add_notice_query_var( $location ) {
remove_filter( 'redirect_post_location', array( $this, 'add_notice_query_var' ), 99 );
return add_query_arg( array( 'wcj_' . $this->id . '_admin_notice' => true ), $location );
}
/**
* admin_notices.
*
* @version 2.5.3
* @since 2.5.3
*/
function admin_notices() {
if ( ! isset( $_GET[ 'wcj_' . $this->id . '_admin_notice' ] ) ) {
return;
}
echo '
' . $this->get_the_notice() . '
';
}
/**
* reset_settings.
*
* @version 3.7.0
* @since 2.4.0
* @todo (maybe) always `delete_option()` (instead of `update_option()`)
*/
function reset_settings() {
if ( isset( $_GET['wcj_reset_settings'] ) && $this->id === $_GET['wcj_reset_settings'] && wcj_is_user_role( 'administrator' ) && ! isset( $_POST['save'] ) ) {
foreach ( $this->get_settings() as $settings ) {
if ( false !== strpos( $settings['id'], '[' ) ) {
$id = explode( '[', $settings['id'] );
$id = $id[0];
delete_option( $id );
} else {
$default_value = isset( $settings['default'] ) ? $settings['default'] : '';
update_option( $settings['id'], $default_value );
}
}
wp_safe_redirect( remove_query_arg( 'wcj_reset_settings' ) );
exit();
}
}
/**
* add_standard_settings.
*
* @version 2.4.0
* @since 2.3.10
*/
function add_standard_settings( $settings = array(), $module_desc = '' ) {
if ( isset( $this->tools_array ) && ! empty( $this->tools_array ) ) {
$settings = $this->add_tools_list( $settings );
}
$settings = $this->add_reset_settings_button( $settings );
return $this->add_enable_module_setting( $settings, $module_desc );
}
/**
* get_settings.
*
* @version 2.7.0
* @since 2.2.6
*/
function get_settings() {
return $this->add_standard_settings( apply_filters( 'wcj_' . $this->id . '_settings', array() ) );
}
/**
* save_meta_box.
*
* @version 3.6.0
* @since 2.5.0
* @todo (maybe) also order_id in `$the_post_id = ...`
*/
function save_meta_box( $post_id, $__post ) {
// Check that we are saving with current metabox displayed.
if ( ! isset( $_POST[ 'woojetpack_' . $this->id . '_save_post' ] ) ) {
return;
}
// Setup post (just in case...)
global $post;
$post = get_post( $post_id );
setup_postdata( $post );
// Save options
foreach ( $this->get_meta_box_options() as $option ) {
if ( 'title' === $option['type'] ) {
continue;
}
$is_enabled = ( isset( $option['enabled'] ) && 'no' === $option['enabled'] ) ? false : true;
if ( $is_enabled ) {
$option_value = ( isset( $_POST[ $option['name'] ] ) ) ? $_POST[ $option['name'] ] : $option['default'];
$the_post_id = ( isset( $option['product_id'] ) ) ? $option['product_id'] : $post_id;
$the_meta_name = ( isset( $option['meta_name'] ) ) ? $option['meta_name'] : '_' . $option['name'];
update_post_meta( $the_post_id, $the_meta_name, apply_filters( 'wcj_save_meta_box_value', $option_value, $option['name'], $this->id ) );
}
}
// Reset post
wp_reset_postdata();
}
/**
* add_meta_box.
*
* @version 2.3.10
* @since 2.2.6
*/
function add_meta_box() {
$screen = ( isset( $this->meta_box_screen ) ) ? $this->meta_box_screen : 'product';
$context = ( isset( $this->meta_box_context ) ) ? $this->meta_box_context : 'normal';
$priority = ( isset( $this->meta_box_priority ) ) ? $this->meta_box_priority : 'high';
add_meta_box(
'wc-jetpack-' . $this->id,
__( 'Booster', 'woocommerce-jetpack' ) . ': ' . $this->short_desc,
array( $this, 'create_meta_box' ),
$screen,
$context,
$priority
);
}
/**
* create_meta_box.
*
* @version 3.3.0
* @todo `placeholder` for textarea
* @todo `class` for all types (now only for select)
* @todo `show_value` for all types (now only for multiple select)
* @todo `$the_post_id` maybe also `order_id` (i.e. not only `product_id`)?
*/
function create_meta_box() {
$current_post_id = get_the_ID();
$html = '';
$html .= '';
foreach ( $this->get_meta_box_options() as $option ) {
$is_enabled = ( isset( $option['enabled'] ) && 'no' === $option['enabled'] ) ? false : true;
if ( $is_enabled ) {
if ( 'title' === $option['type'] ) {
$html .= '';
$html .= '' . $option['title'] . ' ';
$html .= ' ';
} else {
$custom_attributes = '';
$the_post_id = ( isset( $option['product_id'] ) ) ? $option['product_id'] : $current_post_id;
$the_meta_name = ( isset( $option['meta_name'] ) ) ? $option['meta_name'] : '_' . $option['name'];
if ( get_post_meta( $the_post_id, $the_meta_name ) ) {
$option_value = get_post_meta( $the_post_id, $the_meta_name, true );
} else {
$option_value = ( isset( $option['default'] ) ) ? $option['default'] : '';
}
$css = ( isset( $option['css'] ) ? $option['css'] : '' );
$class = ( isset( $option['class'] ) ? $option['class'] : '' );
$show_value = ( isset( $option['show_value'] ) && $option['show_value'] );
$input_ending = '';
if ( 'select' === $option['type'] ) {
if ( isset( $option['multiple'] ) ) {
$custom_attributes = ' multiple';
$option_name = $option['name'] . '[]';
} else {
$option_name = $option['name'];
}
if ( isset( $option['custom_attributes'] ) ) {
$custom_attributes .= ' ' . $option['custom_attributes'];
}
$options = '';
foreach ( $option['options'] as $select_option_key => $select_option_value ) {
$selected = '';
if ( is_array( $option_value ) ) {
foreach ( $option_value as $single_option_value ) {
if ( '' != ( $selected = selected( $single_option_value, $select_option_key, false ) ) ) {
break;
}
}
} else {
$selected = selected( $option_value, $select_option_key, false );
}
$options .= '' . $select_option_value . ' ';
}
} elseif ( 'textarea' === $option['type'] ) {
if ( '' === $css ) {
$css = 'min-width:300px;';
}
} else {
$input_ending = ' id="' . $option['name'] . '" name="' . $option['name'] . '" value="' . $option_value . '">';
if ( isset( $option['custom_attributes'] ) ) {
$input_ending = ' ' . $option['custom_attributes'] . $input_ending;
}
if ( isset( $option['placeholder'] ) ) {
$input_ending = ' placeholder="' . $option['placeholder'] . '"' . $input_ending;
}
}
switch ( $option['type'] ) {
case 'price':
$field_html = ' ' . $option_value . '';
break;
case 'select':
$field_html = '' . $options . ' ' .
( $show_value && ! empty( $option_value ) ? sprintf( '' . __( 'Selected: %s.', 'woocommerce-jetpack' ), implode( ', ', $option_value ) ) . ' ' : '' );
break;
default:
$field_html = ' ' . wc_help_tip( $option['tooltip'], true ) . '' : '';
$html .= '' . $option['title'] . $maybe_tooltip . ' ';
if ( isset( $option['desc'] ) && '' != $option['desc'] ) {
$html .= '' . $option['desc'] . ' ';
}
$html .= '' . $field_html . ' ';
$html .= '';
}
}
}
$html .= '
';
$html .= ' ';
echo $html;
}
/**
* is_enabled.
*
* @version 3.3.0
*/
function is_enabled() {
return wcj_is_module_enabled( ( 'module' === $this->type ? $this->id : $this->parent_id ) );
}
/**
* add_enabled_option.
* only for `module`
*
function add_enabled_option( $settings ) {
$all_settings = $this->get_settings();
$settings[] = $all_settings[1];
return $settings;
}
/**
* settings_section.
*
* @version 2.3.0
*/
function settings_section( $sections ) {
$sections[ $this->id ] = isset( $this->section_title ) ? $this->section_title : $this->short_desc;
return $sections;
}
/**
* get_cat_by_section
*
* @version 2.2.3
* @since 2.2.3
*/
function get_cat_by_section( $section ) {
$cats = include( wcj_plugin_path() . '/includes/admin/' . 'wcj-modules-cats.php' );
foreach ( $cats as $id => $label_info ) {
if ( ( ! empty( $label_info['all_cat_ids'] ) ) &&
( is_array( $label_info['all_cat_ids'] ) ) &&
( in_array( $section, $label_info['all_cat_ids'] ) )
) {
return $id;
}
}
return '';
}
/**
* get_back_to_settings_link_html.
*
* @version 2.3.10
* @since 2.2.3
*/
function get_back_to_settings_link_html() {
$cat_id = $this->get_cat_by_section( $this->id );
$the_link = admin_url( 'admin.php?page=wc-settings&tab=jetpack&wcj-cat=' . $cat_id . '§ion=' . $this->id );
return '<< ' . __( 'Back to Module Settings', 'woocommerce-jetpack' ) . ' ';
}
/**
* add_tools_list.
*
* @version 2.3.8
* @since 2.2.3
*/
function add_tools_list( $settings ) {
return array_merge( $settings, array(
array(
'title' => /* $this->short_desc . ' ' . */__( 'Tools', 'woocommerce-jetpack' ),
'type' => 'title',
'desc' => '',
'id' => 'wcj_' . $this->id . '_tools_options'
),
array(
'title' => __( 'Module Tools', 'woocommerce-jetpack' ),
'id' => 'wcj_' . $this->id . '_module_tools',
'type' => 'module_tools',
),
array(
'type' => 'sectionend',
'id' => 'wcj_' . $this->id . '_tools_options'
),
) );
}
/**
* get_tool_header_html.
*
* @version 2.3.10
* @since 2.3.10
*/
function get_tool_header_html( $tool_id ) {
$html = '';
if ( isset( $this->tools_array[ $tool_id ] ) ) {
$html .= '' . $this->get_back_to_settings_link_html() . '
';
$html .= '' . __( 'Booster', 'woocommerce-jetpack' ) . ' - ' . $this->tools_array[ $tool_id ]['title'] . ' ';
$html .= '' . $this->tools_array[ $tool_id ]['desc'] . '
';
}
return $html;
}
/**
* add_tools.
*
* @version 2.3.10
* @since 2.2.3
*/
function add_tools( $tools_array, $args = array() ) {
$this->tools_array = $tools_array;
add_action( 'wcj_module_tools_' . $this->id, array( $this, 'add_tool_link' ), PHP_INT_MAX );
$hook_priority = isset( $args['tools_dashboard_hook_priority'] ) ? $args['tools_dashboard_hook_priority'] : 10;
if ( $this->is_enabled() ) {
add_filter( 'wcj_tools_tabs', array( $this, 'add_module_tools_tabs' ), $hook_priority );
foreach ( $this->tools_array as $tool_id => $tool_data ) {
add_action( 'wcj_tools_' . $tool_id, array( $this, 'create_' . $tool_id . '_tool' ) );
}
}
add_action( 'wcj_tools_dashboard', array( $this, 'add_module_tools_info_to_tools_dashboard' ), $hook_priority );
}
/**
* add_module_tools_tabs.
*
* @version 2.3.10
* @since 2.3.10
*/
function add_module_tools_tabs( $tabs ) {
foreach ( $this->tools_array as $tool_id => $tool_data ) {
$tool_title = ( isset( $tool_data['tab_title'] ) ) ?
$tool_data['tab_title'] :
$tool_data['title'];
$tabs[] = array(
'id' => $tool_id,
'title' => $tool_title,
);
}
return $tabs;
}
/**
* add_module_tools_info_to_tools_dashboard.
*
* @version 2.3.10
* @since 2.3.10
*/
function add_module_tools_info_to_tools_dashboard() {
$is_enabled_html = ( $this->is_enabled() ) ?
'' . __( 'enabled', 'woocommerce-jetpack' ) . ' ' :
'' . __( 'disabled', 'woocommerce-jetpack' ) . ' ';
foreach ( $this->tools_array as $tool_id => $tool_data ) {
$tool_title = $tool_data['title'];
$tool_desc = $tool_data['desc'];
$additional_style_html = '';
$additional_info_html = '';
if ( isset( $tool_data['deprecated'] ) && true === $tool_data['deprecated'] ) {
$additional_style_html = 'color:gray;font-style:italic;';
$additional_info_html = ' - ' . __( 'Deprecated', 'woocommerce-jetpack' );
}
echo '';
echo '' . $tool_title . $additional_info_html . ' ';
echo '' . $this->short_desc . ' ';
echo '' . $tool_desc . ' ';
echo '' . $is_enabled_html . ' ';
echo ' ';
}
}
/**
* add_tool_link.
*
* @version 2.3.10
* @since 2.2.3
*/
function add_tool_link() {
foreach ( $this->tools_array as $tool_id => $tool_data ) {
$tool_title = $tool_data['title'];
echo '';
echo ( $this->is_enabled() ) ?
'' . $tool_title . ' ' :
'' . $tool_title . '';
echo '
';
}
}
/**
* add_reset_settings_button.
*
* @version 2.5.9
* @since 2.4.0
*/
function add_reset_settings_button( $settings ) {
$reset_button_style = "background: red; border-color: red; box-shadow: 0 1px 0 red; text-shadow: 0 -1px 1px #a00,1px 0 1px #a00,0 1px 1px #a00,-1px 0 1px #a00;";
$reset_settings_setting = array(
array(
'title' => __( 'Reset Settings', 'woocommerce-jetpack' ),
'type' => 'title',
'id' => 'wcj_' . $this->id . '_reset_settings_options',
),
array(
'title' => ( 'module' === $this->type ) ?
__( 'Reset Module to Default Settings', 'woocommerce-jetpack' ) :
__( 'Reset Submodule to Default Settings', 'woocommerce-jetpack' ),
'id' => 'wcj_' . $this->id . '_reset_settings',
'type' => 'custom_link',
'link' => '' . __( 'Reset settings', 'woocommerce-jetpack' ) . ' ',
),
array(
'type' => 'sectionend',
'id' => 'wcj_' . $this->id . '_reset_settings_options',
),
);
return array_merge( $settings, $reset_settings_setting );
}
/**
* settings_section.
* only for `module`
*
* @version 2.8.0
*/
function add_enable_module_setting( $settings, $module_desc = '' ) {
if ( 'module' != $this->type ) {
return $settings;
}
if ( '' === $module_desc && isset( $this->extra_desc ) ) {
$module_desc = $this->extra_desc;
}
if ( ! isset( $this->link ) && isset( $this->link_slug ) && '' != $this->link_slug ) {
$this->link = 'https://booster.io/features/' . $this->link_slug . '/';
}
$the_link = '';
if ( isset( $this->link ) && '' != $this->link ) {
$the_link = '' . __( 'Documentation', 'woocommerce-jetpack' ) . '
';
}
$enable_module_setting = array(
array(
'title' => $this->short_desc . ' ' . __( 'Module Options', 'woocommerce-jetpack' ),
'type' => 'title',
'desc' => $module_desc,
'id' => 'wcj_' . $this->id . '_module_options',
),
array(
'title' => $this->short_desc,
'desc' => '' . __( 'Enable Module', 'woocommerce-jetpack' ) . ' ',
'desc_tip' => $this->desc . $the_link,
'id' => 'wcj_' . $this->id . '_enabled',
'default' => 'no',
'type' => 'checkbox',
'wcj_desc' => $this->desc,
'wcj_link' => ( isset( $this->link ) ? $this->link : '' ),
),
array(
'type' => 'sectionend',
'id' => 'wcj_' . $this->id . '_module_options',
),
);
return array_merge( $enable_module_setting, $settings );
}
}
endif;