) $data->ID; $this->for_site( $site_id ); } /** * Returns only the main user fields. * * @since 3.3.0 * @since 4.4.0 Added 'ID' as an alias of 'id' for the `$field` parameter. * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $field The field to query against: 'id', 'ID', 'slug', 'email' or 'login'. * @param string|int $value The field value. * @return object|false Raw user object. */ public static function get_data_by( $field, $value ) { global $wpdb; // 'ID' is an alias of 'id'. if ( 'ID' === $field ) { $field = 'id'; } if ( 'id' === $field ) { // Make sure the value is numeric to avoid casting objects, for example, to int 1. if ( ! is_numeric( $value ) ) { return false; } $value = (int) $value; if ( $value < 1 ) { return false; } } else { $value = trim( $value ); } if ( ! $value ) { return false; } switch ( $field ) { case 'id': $user_id = $value; $db_field = 'ID'; break; case 'slug': $user_id = wp_cache_get( $value, 'userslugs' ); $db_field = 'user_nicename'; break; case 'email': $user_id = wp_cache_get( $value, 'useremail' ); $db_field = 'user_email'; break; case 'login': $value = sanitize_user( $value ); $user_id = wp_cache_get( $value, 'userlogins' ); $db_field = 'user_login'; break; default: return false; } if ( false !== $user_id ) { $user = wp_cache_get( $user_id, 'users' ); if ( $user ) { return $user; } } $user = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->users WHERE $db_field = %s LIMIT 1", $value ) ); if ( ! $user ) { return false; } update_user_caches( $user ); return $user; } /** * Magic method for checking the existence of a certain custom field. * * @since 3.3.0 * * @param string $key User meta key to check if set. * @return bool Whether the given user meta key is set. */ public function __isset( $key ) { if ( 'id' === $key ) { _deprecated_argument( 'WP_User->id', '2.1.0', sprintf( /* translators: %s: WP_User->ID */ __( 'Use %s instead.' ), 'WP_User->ID' ) ); $key = 'ID'; } if ( isset( $this->data->$key ) ) { return true; } if ( isset( self::$back_compat_keys[ $key ] ) ) { $key = self::$back_compat_keys[ $key ]; } return metadata_exists( 'user', $this->ID, $key ); } /** * Magic method for accessing custom fields. * * @since 3.3.0 * * @param string $key User meta key to retrieve. * @return mixed Value of the given user meta key (if set). If `$key` is 'id', the user ID. */ public function __get( $key ) { if ( 'id' === $key ) { _deprecated_argument( 'WP_User->id', '2.1.0', sprintf( /* translators: %s: WP_User->ID */ __( 'Use %s instead.' ), 'WP_User->ID' ) ); return $this->ID; } if ( isset( $this->data->$key ) ) { $value = $this->data->$key; } else { if ( isset( self::$back_compat_keys[ $key ] ) ) { $key = self::$back_compat_keys[ $key ]; } $value = get_user_meta( $this->ID, $key, true ); } if ( $this->filter ) { $value = sanitize_user_field( $key, $value, $this->ID, $this->filter ); } return $value; } /** * Magic method for setting custom user fields. * * This method does not update custom fields in the database. It only stores * the value on the WP_User instance. * * @since 3.3.0 * * @param string $key User meta key. * @param mixed $value User meta value. */ public function __set( $key, $value ) { if ( 'id' === $key ) { _deprecated_argument( 'WP_User->id', '2.1.0', sprintf( /* translators: %s: WP_User->ID */ __( 'Use %s instead.' ), 'WP_User->ID' ) ); $this->ID = $value; return; } $this->data->$key = $value; } /** * Magic method for unsetting a certain custom field. * * @since 4.4.0 * * @param string $key User meta key to unset. */ public function __unset( $key ) { if ( 'id' === $key ) { _deprecated_argument( 'WP_User->id', '2.1.0', sprintf( /* translators: %s: WP_User->ID */ __( 'Use %s instead.' ), 'WP_User->ID' ) ); } if ( isset( $this->data->$key ) ) { unset( $this->data->$key ); } if ( isset( self::$back_compat_keys[ $key ] ) ) { unset( self::$back_compat_keys[ $key ] ); } } /** * Determines whether the user exists in the database. * * @since 3.4.0 * * @return bool True if user exists in the database, false if not. */ public function exists() { return ! empty( $this->ID ); } /** * Retrieves the value of a property or meta key. * * Retrieves from the users and usermeta table. * * @since 3.3.0 * * @param string $key Property * @return mixed */ public function get( $key ) { return $this->__get( $key ); } /** * Determines whether a property or meta key is set. * * Consults the users and usermeta tables. * * @since 3.3.0 * * @param string $key Property. * @return bool */ public function has_prop( $key ) { return $this->__isset( $key ); } /** * Returns an array representation. * * @since 3.5.0 * * @return array Array representation. */ public function to_array() { return get_object_vars( $this->data ); } /** * Makes private/protected methods readable for backward compatibility. * * @since 4.3.0 * * @param string $name Method to call. * @param array $arguments Arguments to pass when calling. * @return mixed|false Return value of the callback, false otherwise. */ public function __call( $name, $arguments ) { if ( '_init_caps' === $name ) { return $this->_init_caps( ...$arguments ); } return false; } /** * Sets up capability object properties. * * Will set the value for the 'cap_key' property to current database table * prefix, followed by 'capabilities'. Will then check to see if the * property matching the 'cap_key' exists and is an array. If so, it will be * used. * * @since 2.1.0 * @deprecated 4.9.0 Use WP_User::for_site() * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $cap_key Optional capability key */ protected function _init_caps( $cap_key = '' ) { global $wpdb; _deprecated_function( __METHOD__, '4.9.0', 'WP_User::for_site()' ); if ( empty( $cap_key ) ) { $this->cap_key = $wpdb->get_blog_prefix( $this->site_id ) . 'capabilities'; } else { $this->cap_key = $cap_key; } $this->caps = $this->get_caps_data(); $this->get_role_caps(); } /** * Retrieves all of the capabilities of the user's roles, and merges them with * individual user capabilities. * * All of the capabilities of the user's roles are merged with the user's individual * capabilities. This means that the user can be denied specific capabilities that * their role might have, but the user is specifically denied. * * @since 2.0.0 * * @return bool[] Array of key/value pairs where keys represent a capability name * and boolean values represent whether the user has that capability. */ public function get_role_caps() { $switch_site = false; if ( is_multisite() && get_current_blog_id() !== $this->site_id ) { $switch_site = true; switch_to_blog( $this->site_id ); } $wp_roles = wp_roles(); // Filter out caps that are not role names and assign to $this->roles. if ( is_array( $this->caps ) ) { $this->roles = array_filter( array_keys( $this->caps ), array( $wp_roles, 'is_role' ) ); } // Build $allcaps from role caps, overlay user's $caps. $this->allcaps = array(); foreach ( (array) $this->roles as $role ) { $the_role = $wp_roles->get_role( $role ); $this->allcaps = array_merge( (array) $this->allcaps, (array) $the_role->capabilities ); } $this->allcaps = array_merge( (array) $this->allcaps, (array) $this->caps ); if ( $switch_site ) { restore_current_blog(); } return $this->allcaps; } /** * Adds role to user. * * Updates the user's meta data option with capabilities and roles. * * @since 2.0.0 * * @param string $role Role name. */ public function add_role( $role ) { if ( empty( $role ) ) { return; } if ( in_array( $role, $this->roles, true ) ) { return; } $this->caps[ $role ] = true; update_user_meta( $this->ID, $this->cap_key, $this->caps ); $this->get_role_caps(); $this->update_user_level_from_caps(); /** * Fires immediately after the user has been given a new role. * * @since 4.3.0 * * @param int $user_id The user ID. * @param string $role The new role. */ do_action( 'add_user_role', $this->ID, $role ); } /** * Removes role from user. * * @since 2.0.0 * * @param string $role Role name. */ public function remove_role( $role ) { if ( ! in_array( $role, $this->roles, true ) ) { return; } unset( $this->caps[ $role ] ); update_user_meta( $this->ID, $this->cap_key, $this->caps ); $this->get_role_caps(); $this->update_user_level_from_caps(); /** * Fires immediately after a role as been removed from a user. * * @since 4.3.0 * * @param int $user_id The user ID. * @param string $role The removed role. */ do_action( 'remove_user_role', $this->ID, $role ); } /** * Sets the role of the user. * * This will remove the previous roles of the user and assign the user the * new one. You can set the role to an empty string and it will remove all * of the roles from the user. * * @since 2.0.0 * * @param string $role Role name. */ public function set_role( $role ) { if ( 1 === count( $this->roles ) && current( $this->roles ) === $role ) { return; } foreach ( (array) $this->roles as $oldrole ) { unset( $this->caps[ $oldrole ] ); } $old_roles = $this->roles; if ( ! empty( $role ) ) { $this->caps[ $role ] = true; $this->roles = array( $role => true ); } else { $this->roles = array(); } update_user_meta( $this->ID, $this->cap_key, $this->caps ); $this->get_role_caps(); $this->update_user_level_from_caps(); foreach ( $old_roles as $old_role ) { if ( ! $old_role || $old_role === $role ) { continue; } /** This action is documented in wp-includes/class-wp-user.php */ do_action( 'remove_user_role', $this->ID, $old_role ); } if ( $role && ! in_array( $role, $old_roles, true ) ) { /** This action is documented in wp-includes/class-wp-user.php */ do_action( 'add_user_role', $this->ID, $role ); } /** * Fires after the user's role has changed. * * @since 2.9.0 * @since 3.6.0 Added $old_roles to include an array of the user's previous roles. * * @param int $user_id The user ID. * @param string $role The new role. * @param string[] $old_roles An array of the user's previous roles. */ do_action( 'set_user_role', $this->ID, $role, $old_roles ); } /** * Chooses the maximum level the user has. * * Will compare the level from the $item parameter against the $max * parameter. If the item is incorrect, then just the $max parameter value * will be returned. * * Used to get the max level based on the capabilities the user has. This * is also based on roles, so if the user is assigned the Administrator role * then the capability 'level_10' will exist and the user will get that * value. * * @since 2.0.0 * * @param int $max Max level of user. * @param string $item Level capability name. * @return int Max Level. */ public function level_reduction( $max, $item ) { if ( preg_match( '/^level_(10|[0-9])$/i', $item, $matches ) ) { $level = (int) $matches[1]; return max( $max, $level ); } else { return $max; } } /** * Updates the maximum user level for the user. * * Updates the 'user_level' user metadata (includes prefix that is the * database table prefix) with the maximum user level. Gets the value from * the all of the capabilities that the user has. * * @since 2.0.0 * * @global wpdb $wpdb WordPress database abstraction object. */ public function update_user_level_from_caps() { global $wpdb; $this->user_level = array_reduce( array_keys( $this->allcaps ), array( $this, 'level_reduction' ), 0 ); update_user_meta( $this->ID, $wpdb->get_blog_prefix() . 'user_level', $this->user_level ); } /** * Adds capability and grant or deny access to capability. * * @since 2.0.0 * * @param string $cap Capability name. * @param bool $grant Whether to grant capability to user. */ public function add_cap( $cap, $grant = true ) { $this->caps[ $cap ] = $grant; update_user_meta( $this->ID, $this->cap_key, $this->caps ); $this->get_role_caps(); $this->update_user_level_from_caps(); } /** * Removes capability from user. * * @since 2.0.0 * * @param string $cap Capability name. */ public function remove_cap( $cap ) { if ( ! isset( $this->caps[ $cap ] ) ) { return; } unset( $this->caps[ $cap ] ); update_user_meta( $this->ID, $this->cap_key, $this->caps ); $this->get_role_caps(); $this->update_user_level_from_caps(); } /** * Removes all of the capabilities of the user. * * @since 2.1.0 * * @global wpdb $wpdb WordPress database abstraction object. */ public function remove_all_caps() { global $wpdb; $this->caps = array(); delete_user_meta( $this->ID, $this->cap_key ); delete_user_meta( $this->ID, $wpdb->get_blog_prefix() . 'user_level' ); $this->get_role_caps(); } /** * Returns whether the user has the specified capability. * * This function also accepts an ID of an object to check against if the capability is a meta capability. Meta * capabilities such as `edit_post` and `edit_user` are capabilities used by the `map_meta_cap()` function to * map to primitive capabilities that a user or role has, such as `edit_posts` and `edit_others_posts`. * * Example usage: * * $user->has_cap( 'edit_posts' ); * $user->has_cap( 'edit_post', $post->ID ); * $user->has_cap( 'edit_post_meta', $post->ID, $meta_key ); * * While checking against a role in place of a capability is supported in part, this practice is discouraged as it * may produce unreliable results. * * @since 2.0.0 * @since 5.3.0 Formalized the existing and already documented `...$args` parameter * by adding it to the function signature. * * @see map_meta_cap() * * @param string $cap Capability name. * @param mixed ...$args Optional further parameters, typically starting with an object ID. * @return bool Whether the user has the given capability, or, if an object ID is passed, whether the user has * the given capability for that object. */ public function has_cap( $cap, ...$args ) { if ( is_numeric( $cap ) ) { _deprecated_argument( __FUNCTION__, '2.0.0', __( 'Usage of user levels is deprecated. Use capabilities instead.' ) ); $cap = $this->translate_level_to_cap( $cap ); } $caps = map_meta_cap( $cap, $this->ID, ...$args ); // Multisite super admin has all caps by definition, Unless specifically denied. if ( is_multisite() && is_super_admin( $this->ID ) ) { if ( in_array( 'do_not_allow', $caps, true ) ) { return false; } return true; } // Maintain BC for the argument passed to the "user_has_cap" filter. $args = array_merge( array( $cap, $this->ID ), $args ); /** * Dynamically filter a user's capabilities. * * @since 2.0.0 * @since 3.7.0 Added the `$user` parameter. * * @param bool[] $allcaps Array of key/value pairs where keys represent a capability name * and boolean values represent whether the user has that capability. * @param string[] $caps Required primitive capabilities for the requested capability. * @param array $args { * Arguments that accompany the requested capability check. * * @type string $0 Requested capability. * @type int $1 Concerned user ID. * @type mixed ...$2 Optional second and further parameters, typically object ID. * } * @param WP_User $user The user object. */ $capabilities = apply_filters( 'user_has_cap', $this->allcaps, $caps, $args, $this ); // Everyone is allowed to exist. $capabilities['exist'] = true; // Nobody is allowed to do things they are not allowed to do. unset( $capabilities['do_not_allow'] ); // Must have ALL requested caps. foreach ( (array) $caps as $cap ) { if ( empty( $capabilities[ $cap ] ) ) { return false; } } return true; } /** * Converts numeric level to level capability name. * * Prepends 'level_' to level number. * * @since 2.0.0 * * @param int $level Level number, 1 to 10. * @return string */ public function translate_level_to_cap( $level ) { return 'level_' . $level; } /** * Sets the site to operate on. Defaults to the current site. * * @since 3.0.0 * @deprecated 4.9.0 Use WP_User::for_site() * * @param int $blog_id Optional. Site ID, defaults to current site. */ public function for_blog( $blog_id = '' ) { _deprecated_function( __METHOD__, '4.9.0', 'WP_User::for_site()' ); $this->for_site( $blog_id ); } /** * Sets the site to operate on. Defaults to the current site. * * @since 4.9.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $site_id Site ID to initialize user capabilities for. Default is the current site. */ public function for_site( $site_id = '' ) { global $wpdb; if ( ! empty( $site_id ) ) { $this->site_id = absint( $site_id ); } else { $this->site_id = get_current_blog_id(); } $this->cap_key = $wpdb->get_blog_prefix( $this->site_id ) . 'capabilities'; $this->caps = $this->get_caps_data(); $this->get_role_caps(); } /** * Gets the ID of the site for which the user's capabilities are currently initialized. * * @since 4.9.0 * * @return int Site ID. */ public function get_site_id() { return $this->site_id; } /** * Gets the available user capabilities data. * * @since 4.9.0 * * @return bool[] List of capabilities keyed by the capability name, * e.g. `array( 'edit_posts' => true, 'delete_posts' => false )`. */ private function get_caps_data() { $caps = get_user_meta( $this->ID, $this->cap_key, true ); if ( ! is_array( $caps ) ) { return array(); } return $caps; } } r!=none' ) ), ); if ( ! empty( $args['end_fields'] ) ) { foreach ( (array) $args['end_fields'] as $field_id => $field_val ) { $fields[ $field_id ] = $field_val; } } if ( $args['group'] && $args['group_auto_close'] ) { $fields[] = array( 'type' => 'group_close', ); } } // bsnp_inject_newsletter_field_to_fields /** * Handy function to add Newsletter location repeater newsletter field to panel by it's prefix * * @param $fields * @param array $args * * @since 1.0 * * @return void */ function bsnp_inject_newsletter_repeater_field_to_fields( &$fields, $args = array() ) { if ( is_string( $args ) ) { $args = array( 'location_prefix' => $args, ); } $args = bf_merge_args( $args, array( 'location_prefix' => '', 'group' => TRUE, 'group_state' => 'close', 'group_title' => __( 'Newsletter', 'better-studio' ), 'group_auto_close' => TRUE, 'group_desc' => '', 'field_title' => '', 'field_desc' => '', 'field_add_label' => ' ' . __( 'New Newsletter', 'better-studio' ), 'field_delete_label' => __( 'Delete Newsletter', 'better-studio' ), 'field_item_title' => __( 'Newsletter', 'better-studio' ), 'field_item_smart_title' => TRUE, 'start_fields' => '', 'format' => 'normal', ) ); if ( empty( $args['location_prefix'] ) ) { return; } if ( $args['group'] ) { $fields[] = array( 'name' => $args['group_title'], 'type' => 'group', 'state' => $args['group_state'], 'desc' => $args['group_desc'], ); } if ( ! empty( $args['start_fields'] ) ) { foreach ( (array) $args['start_fields'] as $field_id => $field_val ) { $fields[ $field_id ] = $field_val; } } $repeater_items = array(); if ( ! empty( $args['field_start_fields'] ) ) { foreach ( (array) $args['field_start_fields'] as $field_id => $field_val ) { $repeater_items[ $field_id ] = $field_val; } } $repeater_items['newsletter'] = array( 'name' => __( 'Newsletter', 'better-studio' ), 'id' => 'newsletter', 'desc' => __( 'Choose a configured newsletter to show it in this newsletter location.', 'better-studio' ), 'type' => 'select', 'deferred-options' => array( 'callback' => 'bsnp_get_newsletters_list_option', 'args' => array( - 1, TRUE ), ), 'repeater_item' => TRUE, ); $repeater_items['style'] = array( 'name' => __( 'Override Style', 'better-studio' ), 'id' => 'style', 'desc' => __( 'Custom newsletter style for this location.', 'better-studio' ), 'type' => 'select_popup', 'std' => '', 'deferred-options' => array( 'callback' => 'bsnp_get_newsletters_style_option', 'args' => array( TRUE, ), ), 'texts' => array( 'modal_title' => __( 'Choose Newsletter Style', 'better-studio' ), 'box_pre_title' => __( 'Active style', 'better-studio' ), 'box_button' => __( 'Change Style', 'better-studio' ), ), 'section_class' => 'newsletter-pack-newsletter-field', 'repeater_item' => TRUE, 'show_on' => array( array( 'newsletter!=none' ) ), ); $repeater_items['si_style'] = array( 'name' => __( 'Override Social Icons Style', 'better-studio' ), 'id' => 'si_style', 'desc' => __( 'Custom newsletter style for this location.', 'better-studio' ), 'type' => 'select_popup', 'std' => '', 'deferred-options' => array( 'callback' => 'bsnp_get_newsletters_si_style_option', 'args' => array( TRUE, TRUE, ), ), 'texts' => array( 'modal_title' => __( 'Choose Social Icons Style', 'better-studio' ), 'box_pre_title' => __( 'Active style', 'better-studio' ), 'box_button' => __( 'Change Style', 'better-studio' ), ), 'section_class' => 'newsletter-pack-newsletter-field', 'repeater_item' => TRUE, 'show_on' => array( array( 'newsletter!=none' ) ), ); if ( ! empty( $args['field_end_fields'] ) ) { foreach ( (array) $args['field_end_fields'] as $field_id => $field_val ) { $repeater_items[ $field_id ] = $field_val; } } $fields[ $args['location_prefix'] ] = array( 'name' => $args['field_title'], 'desc' => $args['field_desc'], 'id' => $args['location_prefix'], 'type' => 'repeater', 'save-std' => TRUE, 'default' => array( array( 'newsletter' => '', 'style' => 'default', 'si_style' => 'default', ), ), 'add_label' => $args['field_add_label'], 'delete_label' => $args['field_delete_label'], 'item_title' => $args['field_item_title'], 'section_class' => 'full-with-both' . ( $args['field_item_smart_title'] ? ' newsletter-pack-repeater-field' : '' ), 'options' => $repeater_items, 'ad-id' => $args['location_prefix'], ); if ( ! empty( $args['end_fields'] ) ) { foreach ( (array) $args['end_fields'] as $field_id => $field_val ) { $fields[ $field_id ] = $field_val; } } if ( $args['group'] && $args['group_auto_close'] ) { $fields[] = array( 'type' => 'group_close', ); } } // bsnp_inject_newsletter_repeater_field_to_fields /** * Shows newsletter location code by its panel prefix or data * * @param string $panel_loc_prefix * @param null $newsletter_data * @param array $args * * * @since 1.0 * * @return void */ function bsnp_show_location( $panel_loc_prefix = '', $newsletter_data = NULL, $args = array() ) { if ( empty( $panel_loc_prefix ) ) { return; } if ( is_null( $newsletter_data ) || ! is_array( $newsletter_data ) ) { $newsletter_data = bsnp_get_location_data( $panel_loc_prefix ); } if ( ! isset( $newsletter_data['newsletter-data'] ) ) { $newsletter_data['newsletter-data'] = array(); } if ( isset( $args['custom-data'] ) ) { $newsletter_data['newsletter-data'] = bf_merge_args( $newsletter_data['newsletter-data'], $args['custom-data'] ); } if ( ! isset( $args['before'] ) ) { $args['before'] = ''; } if ( ! isset( $args['after'] ) ) { $args['after'] = ''; } if ( isset( $args['show-error'] ) ) { $newsletter_data['show-error'] = $args['show-error']; } $newsletter_code = BS_Newsletter_Pack_Pro()->show_newsletter( $newsletter_data ); if ( $newsletter_code ) { echo $args['before'], $newsletter_code, $args['after']; } } // bsnp_show_location if ( ! function_exists( 'bsnp_get_location_data_ids' ) ) { /** * returns base data for newsletter * * @param array|null $extra_fields Extra fields related to this location * * @return array */ function bsnp_get_location_data_ids( $extra_fields = NULL ) { $fields = array( 'newsletter' => '', 'style' => '', 'si_style' => '', ); if ( ! is_null( $extra_fields ) ) { $fields = bf_merge_args( $fields, $extra_fields ); } return $fields; } } // bsnp_get_location_data_ids if ( ! function_exists( 'bsnp_get_location_data_override' ) ) { /** * Returns data for newsletter location (even overidded data) * * @param string $panel_ad_prefix * @param bool $multiple * @param string $type * @param null $extra_fields Extra fields for current newsletter location * * @since 1.0 * * @return array */ function bsnp_get_location_data_override( $panel_ad_prefix = '', $multiple = FALSE, $type = 'newsletter-location', $extra_fields = NULL ) { $data_ids = bsnp_get_location_data_ids( $extra_fields ); $data = array(); if ( $multiple ) { $data = BS_Newsletter_Pack_Pro::get_option( $panel_ad_prefix ); } else { if ( $type == 'newsletter-location' ) { foreach ( $data_ids as $id => $value ) { $data[ $id ] = BS_Newsletter_Pack_Pro::get_option( $panel_ad_prefix . '_' . $id ); } } elseif ( $type === 'option' ) { $data = BS_Newsletter_Pack_Pro::get_option( $panel_ad_prefix ); } } return $data; } // bsnp_get_location_data_override } /** * Returns full list of newsletter location data from it's prefix inside panel * * @param string $location_prefix * @param bool $multiple * @param null $extra_fields Extra fields related to current newsletter location * * @since 1.0 * * @return array */ function bsnp_get_location_data( $location_prefix = '', $multiple = FALSE, $extra_fields = NULL ) { $data_ids = bsnp_get_location_data_ids( $extra_fields ); if ( empty( $location_prefix ) ) { return $multiple ? array( $data_ids ) : $data_ids; } $final_ads = array(); $data = bsnp_get_location_data_override( $location_prefix, $multiple, 'newsletter-location', $extra_fields ); if ( ! $multiple ) { $data = array( $data ); } $_check = array( 'default' => '', '' => '', ); foreach ( $data as $item ) { // Type not selected if ( empty( $item['newsletter'] ) || $item['newsletter'] === 'none' ) { continue; } $newsletter_item = $item; $newsletter_item['newsletter-data'] = bsnp_get_newsletter_data( $item['newsletter'], $extra_fields ); // newsletter is not active if ( empty( $newsletter_item['newsletter-data']['active-newsletter'] ) ) { continue; } // update custom style if ( ! isset( $_check[ $newsletter_item['style'] ] ) ) { $newsletter_item['newsletter-data']['style'] = $newsletter_item['style']; } // update custom social icon if ( ! isset( $_check[ $newsletter_item['si_style'] ] ) ) { if ( $newsletter_item['si_style'] === 'hidden' ) { $newsletter_item['newsletter-data']['social_icons'] = FALSE; } else { $newsletter_item['newsletter-data']['social_icons_style'] = $newsletter_item['si_style']; } } $newsletter_item['active_location'] = TRUE; $final_ads[] = $newsletter_item; } // return default ID's if ( empty( $final_ads ) ) { return $multiple ? array( $data_ids ) : $data_ids; } if ( $multiple ) { return $final_ads; } return current( $final_ads ); } /** * Returns full list of newsletter data from it's id * * @param int $newsletter_id * @param null $extra_fields Extra fields related to current newsletter location * * @since 1.0 * * @return array */ function bsnp_get_newsletter_data( $newsletter_id = 0, $extra_fields = NULL ) { $data = bf_get_post_meta( 'newsletter-data-cache', $newsletter_id, FALSE ); // not cached yet if ( $data === FALSE ) { $data = bsnp_fetch_newsletter_data( $newsletter_id ); update_post_meta( $newsletter_id, 'newsletter-data-cache', $data ); } return $data; } /** * Returns full list of newsletter data from it's id * * @param int $newsletter_id * @param null $extra_fields Extra fields related to current newsletter location * * @return array */ function bsnp_fetch_newsletter_data( $newsletter_id = 0, $extra_fields = NULL ) { $data_ids = array( // 'social_icons' => '', 'social_icons_style' => '', 'social_icons_sites' => '', // 'type' => '', 'mailchimp_code' => '', 'mailerlite_code' => '', 'aweber_code' => '', 'feedburner_id' => '', // 'style' => '', 'color' => '', // 'text_title' => '', 'text_desc' => '', 'text_input' => '', 'text_button' => '', 'text_after' => '', // 'custom_class' => '', 'custom_id' => '', 'custom_css' => '', ); // Support extra fields from outside if ( ! is_null( $extra_fields ) ) { $data_ids = bf_merge_args( $extra_fields, $data_ids ); } // aggregate fields $data = array(); $meta = get_metadata( 'post', $newsletter_id ); if ( $meta ) { foreach ( get_metadata( 'post', $newsletter_id ) as $meta_key => $meta_value ) { if ( isset( $data_ids[ $meta_key ] ) ) { $data[ $meta_key ] = $meta_value[0]; } } } // // Validate selected type // if ( ! empty( $data['type'] ) ) { // // Mailchimp support // if ( $data['type'] === 'mailchimp' && ! empty( $data['mailchimp_code'] ) ) { preg_match( '/action="([^"]*?)"/i', $data['mailchimp_code'], $matched ); if ( ! empty( $matched[1] ) ) { $data['mailchimp_url'] = $matched[1]; $data['active-newsletter'] = TRUE; } } // // AWeber // elseif ( $data['type'] === 'aweber' && ! empty( $data['aweber_code'] ) ) { preg_match( '//i', $data['aweber_code'], $matched ); if ( ! empty( $matched[1] ) ) { $data['aweber_data'] = array(); $data['aweber_data']['meta_web_form_id'] = $matched[1]; preg_match( '//i', $data['aweber_code'], $matched ); if ( ! empty( $matched[1] ) ) { $data['aweber_data']['listname'] = $matched[1]; $data['active-newsletter'] = TRUE; } else { unset( $data['aweber_data'] ); } } } // // Mailer Lite // elseif ( $data['type'] === 'mailerlite' && ! empty( $data['mailerlite_code'] ) ) { $data['mailerlite-data'] = array(); preg_match( '/action="([^"]*?)"/i', $data['mailerlite_code'], $matched ); if ( ! empty( $matched[1] ) ) { $data['mailerlite-data']['url'] = $matched[1]; preg_match( '/data-id="([^"]*?)"/i', $data['mailerlite_code'], $matched ); if ( ! empty( $matched[1] ) ) { $data['mailerlite-data']['id'] = $matched[1]; preg_match( '/data-code="([^"]*?)"/i', $data['mailerlite_code'], $matched ); if ( ! empty( $matched[1] ) ) { $data['mailerlite-data']['code'] = $matched[1]; $data['active-newsletter'] = TRUE; } } } unset( $data['mailerlite_code'] ); } // // Feedburner // elseif ( $data['type'] === 'feedburner' && ! empty( $data['feedburner_id'] ) ) { $data['active-newsletter'] = TRUE; } } // clean extra and long fields unset( $data['aweber_code'] ); unset( $data['mailchimp_code'] ); unset( $data['mailerlite_code'] ); // Not defined mean it is ot validated if ( ! isset( $data['active-newsletter'] ) ) { $data['active-newsletter'] = FALSE; } // unserialize icons field if ( ! empty( $data['active-newsletter'] ) && ! empty( $data['social_icons_sites'] ) ) { $data['social_icons_sites'] = unserialize( $data['social_icons_sites'] ); } return $data; } if ( ! function_exists( 'bsnp_social_counter_options_list_callback' ) ) { /** * Handy deferred function for improving performance * * @since 1.0 * * @return array */ function bsnp_social_counter_options_list_callback() { if ( ! class_exists( 'Better_Social_Counter' ) ) { return array(); } else { return Better_Social_Counter_Data_Manager::self()->get_widget_options_list(); } } } if ( ! function_exists( 'bsnp_get_form_code' ) ) { /** * Handy deferred function for improving performance * * @return array */ function bsnp_get_form_code( $newsletter_data = array(), $args = array() ) { $args = bf_merge_args( $args, array( 'form-url' => '', 'form-class' => '', 'form-fields-wrapper-class' => '', // 'input-class' => '', 'input-placeholder' => $newsletter_data['text_input'], // 'input-name-class' => '', 'input-name-placeholder' => $newsletter_data['text_input'], // 'button-class' => '', 'button-text' => $newsletter_data['text_button'], ) ); switch ( $newsletter_data['type'] ) { case 'mailchimp': $code_pattern = array( 'form' => '
%%input%% %%button%%
', 'input' => '
', 'button' => '
', ); $args['form-url'] = $newsletter_data['mailchimp_url']; break; case 'feedburner': $code_pattern = array( 'form' => '
%%input%% %%button%%
', 'input' => '
', 'button' => '
', ); $args['form-url'] = $newsletter_data['feedburner_id']; break; case 'aweber': $code_pattern = array( 'form' => '
%%input%% %%button%%
', 'input' => '
', 'button' => '
', ); $code_pattern['form'] = str_replace( array( '%%meta_web_form_id%%', '%%listname%%', ), array( $newsletter_data['aweber_data']['meta_web_form_id'], $newsletter_data['aweber_data']['listname'], ), $code_pattern['form'] ); break; case 'mailerlite': $code_pattern = array( 'form' => '
%%input%% %%button%%
', 'input' => '
', 'button' => '
', ); $code_pattern['form'] = str_replace( array( '%%url%%', '%%id%%', '%%code%%', ), array( $newsletter_data['mailerlite-data']['url'], $newsletter_data['mailerlite-data']['id'], $newsletter_data['mailerlite-data']['code'], ), $code_pattern['form'] ); break; } // // Prepare pattern // { $code_pattern['input'] = str_replace( array( '%%class%%', '%%placeholder%%', ), array( $args['input-class'], $args['input-placeholder'], ), $code_pattern['input'] ); $code_pattern['button'] = str_replace( array( '%%class%%', '%%title%%', ), array( $args['button-class'], $args['button-text'], ), $code_pattern['button'] ); $code_pattern['form'] = str_replace( array( '%%class%%', '%%fields-wrapper-class%%', '%%url%%', '%%input%%', '%%button%%', ), array( $args['form-class'], $args['form-fields-wrapper-class'], $args['form-url'], $code_pattern['input'], $code_pattern['button'], ), $code_pattern['form'] ); } return $code_pattern['form']; } } // bsnp_get_form_code if ( ! function_exists( 'bsnp_get_form_social_icons_code' ) ) { /** * Handy deferred function for improving performance * * @return array */ function bsnp_get_form_social_icons_code( $newsletter_data = array() ) { // Needs Better Social Counter plugin if ( ! class_exists( 'Better_Social_Counter_Shortcode' ) ) { return ''; } // active icons $icons = $newsletter_data['social_icons_sites']; // make string for shortcode if ( is_array( $icons ) ) { $_icons = array(); foreach ( (array) $icons as $icon_key => $icon ) { if ( $icon ) { $_icons[ $icon_key ] = $icon_key; } } $icons = implode( ',', $_icons ); } return do_shortcode( "[better-social-counter show_title='0' style='name' colored='0' order='{$icons}']" ); } } /** * Used to get array of key->name of newsletters * * @param bool $default * * @since 1.0 * * @return array */ function bsnp_get_newsletters_style_option( $default = FALSE ) { $option = array(); $version = BS_Newsletter_Pack_Pro::get_version(); if ( $default ) { $option['default'] = array( 'img' => BS_Newsletter_Pack_Pro::dir_url( 'images/options/style-default.png?v=' . $version ), 'label' => __( 'Default', 'better-studio' ), 'current_label' => __( 'Default Layout', 'better-studio' ), ); } $option['style-1'] = array( 'img' => BS_Newsletter_Pack_Pro::dir_url( 'images/options/style-1.png?v=' . $version ), 'label' => __( 'Style 1', 'better-studio' ), 'info' => array( 'cat' => array( __( 'Simple', 'better-studio' ), ), ), ); $option['style-2'] = array( 'img' => BS_Newsletter_Pack_Pro::dir_url( 'images/options/style-2.png?v=' . $version ), 'label' => __( 'Style 2', 'better-studio' ), 'info' => array( 'cat' => array( __( 'Simple', 'better-studio' ), ), ), ); $option['style-3'] = array( 'img' => BS_Newsletter_Pack_Pro::dir_url( 'images/options/style-3.png?v=' . $version ), 'label' => __( 'Style 3', 'better-studio' ), 'info' => array( 'cat' => array( __( 'Simple', 'better-studio' ), ), ), ); $option['style-4'] = array( 'img' => BS_Newsletter_Pack_Pro::dir_url( 'images/options/style-4.png?v=' . $version ), 'label' => __( 'Style 4', 'better-studio' ), 'info' => array( 'cat' => array( __( 'Simple', 'better-studio' ), ), ), ); $option['style-5'] = array( 'img' => BS_Newsletter_Pack_Pro::dir_url( 'images/options/style-5.png?v=' . $version ), 'label' => __( 'Style 5', 'better-studio' ), 'info' => array( 'cat' => array( __( 'Simple', 'better-studio' ), ), ), ); $option['style-6'] = array( 'img' => BS_Newsletter_Pack_Pro::dir_url( 'images/options/style-6.png?v=' . $version ), 'label' => __( 'Style 6', 'better-studio' ), 'info' => array( 'cat' => array( __( 'Modern', 'better-studio' ), ), ), ); $option['style-7'] = array( 'img' => BS_Newsletter_Pack_Pro::dir_url( 'images/options/style-7.png?v=' . $version ), 'label' => __( 'Style 7', 'better-studio' ), 'info' => array( 'cat' => array( __( 'Modern', 'better-studio' ), ), ), ); $option['style-8'] = array( 'img' => BS_Newsletter_Pack_Pro::dir_url( 'images/options/style-8.png?v=' . $version ), 'label' => __( 'Style 8', 'better-studio' ), 'info' => array( 'cat' => array( __( 'Modern', 'better-studio' ), ), ), ); $option['style-9'] = array( 'img' => BS_Newsletter_Pack_Pro::dir_url( 'images/options/style-9.png?v=' . $version ), 'label' => __( 'Style 9', 'better-studio' ), 'info' => array( 'cat' => array( __( 'Modern', 'better-studio' ), ), ), ); $option['style-10'] = array( 'img' => BS_Newsletter_Pack_Pro::dir_url( 'images/options/style-10.png?v=' . $version ), 'label' => __( 'Style 10', 'better-studio' ), 'info' => array( 'cat' => array( __( 'Dark', 'better-studio' ), ), ), ); $option['style-11'] = array( 'img' => BS_Newsletter_Pack_Pro::dir_url( 'images/options/style-11.png?v=' . $version ), 'label' => __( 'Style 11', 'better-studio' ), 'info' => array( 'cat' => array( __( 'Creative', 'better-studio' ), ), ), ); return $option; } // bsnp_get_newsletters_style_option /** * Used to get array of key->option of newsletters * * @param bool $default * * @since 1.0 * * @return array */ function bsnp_get_newsletters_si_style_option( $default = FALSE, $hidden = FALSE ) { $option = array(); $version = BS_Newsletter_Pack_Pro::get_version(); if ( $default ) { $option['default'] = array( 'img' => BS_Newsletter_Pack_Pro::dir_url( 'images/options/si-default.png?v=' . $version ), 'label' => __( 'Default', 'better-studio' ), 'current_label' => __( 'Default Layout', 'better-studio' ), ); } if ( $hidden ) { $option['hidden'] = array( 'img' => BS_Newsletter_Pack_Pro::dir_url( 'images/options/si-hidden.png?v=' . $version ), 'label' => __( 'Hidden', 'better-studio' ), 'current_label' => __( 'Hidden', 'better-studio' ), ); } $option['t1-s1'] = array( 'img' => BS_Newsletter_Pack_Pro::dir_url( 'images/options/si-t1-s1.png?v=' . $version ), 'label' => __( 'Style 1', 'better-studio' ), 'info' => array( 'cat' => array( __( 'Simple', 'better-studio' ), ), ), ); $option['t1-s2'] = array( 'img' => BS_Newsletter_Pack_Pro::dir_url( 'images/options/si-t1-s2.png?v=' . $version ), 'label' => __( 'Style 2', 'better-studio' ), 'info' => array( 'cat' => array( __( 'Simple', 'better-studio' ), ), ), ); $option['t1-s3'] = array( 'img' => BS_Newsletter_Pack_Pro::dir_url( 'images/options/si-t1-s3.png?v=' . $version ), 'label' => __( 'Style 3', 'better-studio' ), 'info' => array( 'cat' => array( __( 'Simple', 'better-studio' ), ), ), ); $option['t1-s4'] = array( 'img' => BS_Newsletter_Pack_Pro::dir_url( 'images/options/si-t1-s4.png?v=' . $version ), 'label' => __( 'Style 4', 'better-studio' ), 'info' => array( 'cat' => array( __( 'Simple', 'better-studio' ), ), ), ); $option['t1-s5'] = array( 'img' => BS_Newsletter_Pack_Pro::dir_url( 'images/options/si-t1-s5.png?v=' . $version ), 'label' => __( 'Style 5', 'better-studio' ), 'info' => array( 'cat' => array( __( 'Simple', 'better-studio' ), ), ), ); return $option; }