: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
if (is_array($value) && isset($value['name']) && strpos($value['name'], 'sgpb') === 0) {
$popupData[$value['name']] = sanitize_text_field( $value['value'] );
else if (is_array($value) && isset($value['name']) && strpos($value['name'], 'post_ID') === 0) {
$popupData['sgpb-post-id'] = (int) sanitize_text_field( $value['value'] );
public static function create($data = array(), $saveMode = '', $firstTime = 0)
$obj->setSaveMode($saveMode);
$additionalData = $obj->addAdditionalSettings($data, $obj);
$data = array_merge($data, $additionalData);
$data = apply_filters('sgpbAdvancedOptionsDefaultValues', $data);
foreach ($data as $name => $value) {
if (strpos($name, 'sgpb') === 0) {
$defaultData = $obj->getDefaultDataByName($name);
if (empty($defaultData['type'])) {
$defaultData['type'] = 'string';
$sanitizedValue = $obj->sanitizeValueByType($value, $defaultData['type']);
$obj->insertIntoSanitizedData(array('name' => $name,'value' => $sanitizedValue));
$obj->setSavedPopupById($data['sgpb-post-id']);
$result = apply_filters('sgpbPopupCreateResult', $result);
$this->convertImagesToData();
$data = $this->getSanitizedData();
$popupId = $data['sgpb-post-id'];
if (!empty($data['sgpb-target'])) {
$this->setTarget($data['sgpb-target']);
/*remove from popup options because it's useless to save it twice*/
unset($data['sgpb-target']);
if (!empty($data['sgpb-conditions'])) {
$this->setConditions($data['sgpb-conditions']);
unset($data['sgpb-conditions']);
if (!empty($data['sgpb-events'])) {
$this->setEvents($data['sgpb-events']);
unset($data['sgpb-events']);
$data = $this->customScriptsSave($data);
$this->setOptions($data);
$targets = $this->targetSave();
$events = $this->eventsSave();
$options = $this->popupOptionsSave();
return ($targets && $events && $options);
public function convertImagesToData()
$savedContentBackgroundImageUrl = '';
$contentBackgroundImageData = '';
$data = $this->getSanitizedData();
$buttonImageUrl = isset($data['sgpb-button-image']) ? $data['sgpb-button-image'] : '';
$contentBackgroundImageUrl = isset($data['sgpb-background-image']) ? $data['sgpb-background-image'] : '';
$savedPopup = $this->getSavedPopup();
if (is_object($savedPopup)) {
$buttonImageData = $savedPopup->getOptionvalue('sgpb-button-image-data');
$savedImageUrl = $savedPopup->getOptionValue('sgpb-button-image');
$contentBackgroundImageData = $savedPopup->getOptionValue('sgpb-background-image-data');
$savedContentBackgroundImageUrl = $savedPopup->getOptionValue('sgpb-background-image');
if ($buttonImageUrl != $savedImageUrl) {
$buttonImageData = AdminHelper::getImageDataFromUrl($buttonImageUrl, true);
if ($contentBackgroundImageUrl != $savedContentBackgroundImageUrl) {
$contentBackgroundImageData = AdminHelper::getImageDataFromUrl($contentBackgroundImageUrl);
$data['sgpb-button-image-data'] = $buttonImageData;
$data['sgpb-background-image-data'] = $contentBackgroundImageData;
$data = apply_filters('sgpbConvertImagesToData', $data);
$this->setSanitizedData($data);
private function customScriptsSave($data)
$popupId = $this->getId();
$popupContent = $this->getContent();
$defaultData = SGPBConfigDataHelper::defaultData();
$defaultDataJs = $defaultData['customEditorContent']['js']['helperText'];
$defaultDataCss = $defaultData['customEditorContent']['css']['oldDefaultValue'];
$finalData = array('js' => array(), 'css' => array());
$alreadySavedData = get_post_meta($popupId, 'sg_popup_scripts', true);
if( !isset( $data['sgpb-css-editor'] ) )
$data['sgpb-css-editor'] = '';
$finalData['css'] = $data['sgpb-css-editor'];
$defaultDataCss = $defaultDataCss[0];
$defaultDataCss = preg_replace('/\s/', '', $defaultDataCss);
$temp = preg_replace('/\s/', '', $finalData['css']);
unset($data['sgpb-css-editor']);
if ($temp == $defaultDataCss) {
unset($finalData['css']);
foreach ($defaultDataJs as $key => $value) {
if( !isset( $data['sgpb-'.$key] ) )
if ($data['sgpb-'.$key] == '') {
unset($data['sgpb-'.$key]);
if ($key == 'ShouldOpen' || $key == 'ShouldClose') {
$finalData['js']['sgpb-'.$key] = $data['sgpb-'.$key];
$finalData['js']['sgpb-'.$key] = $data['sgpb-'.$key];
unset($data['sgpb-'.$key]);
if ($alreadySavedData == $finalData) {
array_walk_recursive($finalData, function(&$element){
$element = str_replace(array("\r\n"), "\n", $element);
update_post_meta($popupId, 'sg_popup_scripts', $finalData);
private function targetSave()
global $SGPB_DATA_CONFIG_ARRAY;
$saveMode = $this->getSaveMode();
$popupId = $this->getId();
$targetData = $this->getTarget();
$conditionsData = $this->getConditions();
$targetConfig = $SGPB_DATA_CONFIG_ARRAY['target'];
$paramsData = $targetConfig['paramsData'];
$attrs = $targetConfig['attrs'];
if (empty($targetData)) {
foreach ($targetData as $groupId => $groupData) {
foreach ($groupData as $ruleId => $ruleData) {
if (empty($ruleData['value']) && !is_null($paramsData[$ruleData['param']])) {
$targetData[$groupId][$ruleId]['value'] = '';
if (isset($ruleData['value']) && is_array($ruleData['value'])) {
$valueAttrs = $attrs[$ruleData['param']]['htmlAttrs'];
$postType = $valueAttrs['data-value-param'];
if (isset($valueAttrs['isNotPostType'])) {
$isNotPostType = $valueAttrs['isNotPostType'];
if (empty($valueAttrs['isNotPostType'])) {
if (isset($valueAttrs['isPostCategory'])){
$targetData[$groupId][$ruleId]['value'] = SGPBConfigDataHelper::getTermsByIds($ruleData['value']);
} elseif(isset($valueAttrs['isPostTag'])) {
$targetData[$groupId][$ruleId]['value'] = SGPBConfigDataHelper::getTagsBySlug($ruleData['value']);
* $isNotPostType => false must search inside post types post
* $isNotPostType => true must save array data
'post__in' => array_values($ruleData['value']),
$searchResults = SGPBConfigDataHelper::getPostTypeData($args);
$targetData[$groupId][$ruleId]['value'] = $searchResults;
$popupTarget['sgpb-target'] = $targetData;
$popupTarget['sgpb-conditions'] = apply_filters('sgpbSaveConditions', $conditionsData);
$alreadySavedTargets = get_post_meta($popupId, 'sg_popup_target'.$saveMode, true);
if ($alreadySavedTargets === $popupTarget) {
$popupTarget = apply_filters('sgpbPopupTargetMetaData', $popupTarget);
return update_post_meta($popupId, 'sg_popup_target'.$saveMode, $popupTarget);
private function eventsSave()
global $SGPB_DATA_CONFIG_ARRAY;
$eventsData = $this->getEvents();
$popupId = $this->getId();
$saveMode = $this->getSaveMode();
$eventsFromPopup = array();
foreach ($eventsData as $groupId => $groupData) {
$currentRuleData = array();
foreach ($groupData as $ruleId => $ruleData) {
$hiddenOptions = array();
foreach ($ruleData as $name => $value) {
if ($name == 'param' || $name == 'value' || $name == 'operator') {
$currentData[$name] = $value;
$hiddenOptions[$name] = $value;
$currentData['hiddenOption'] = $hiddenOptions;
$currentRuleData[$ruleId] = $currentData;
$eventsFromPopup[$groupId] = $currentRuleData;
$popupEvents['formPopup'] = $eventsFromPopup;
$alreadySavedEvents = get_post_meta($popupId, 'sg_popup_events'.$saveMode, true);
if ($alreadySavedEvents === $eventsFromPopup) {
$eventsFromPopup = apply_filters('sgpbPopupEventsMetadata', $eventsFromPopup);
return update_post_meta($popupId, 'sg_popup_events'.$saveMode, $eventsFromPopup);
private function popupOptionsSave()
$popupOptions = $this->getOptions();
$popupOptions = apply_filters('sgpbSavePopupOptions', $popupOptions);
//special code added for "Behavior After Special Events" section
//todo: remove in the future if possible
$specialBehaviors = array();
if (!empty($popupOptions['sgpb-behavior-after-special-events'])) {
$specialBehaviors = $popupOptions['sgpb-behavior-after-special-events'];
if (!empty($specialBehaviors) && is_array($specialBehaviors)) {
foreach ($specialBehaviors as $groupId => $groupRow) {
foreach ($groupRow as $ruleId => $ruleRow) {
if (!empty($ruleRow['operator']) && $ruleRow['operator'] == 'open-popup') {
'post__in' => array($ruleRow['value']),
'post_type' => SG_POPUP_POST_TYPE
$searchResults = SGPBConfigDataHelper::getPostTypeData($args);
$popupOptions['sgpb-behavior-after-special-events'][$groupId][$ruleId]['value'] = $searchResults;
$popupId = $this->getId();
$saveMode = $this->getSaveMode();
$alreadySavedOptions = get_post_meta($popupId, 'sg_popup_options'.$saveMode, true);
if ($alreadySavedOptions === $popupOptions) {
$popupOptions = apply_filters('sgpbPopupSavedOptionsMetaData', $popupOptions);
return update_post_meta($popupId, 'sg_popup_options'.$saveMode, $popupOptions);
public function getOptionValue($optionName, $forceDefaultValue = false)
require_once(dirname(__FILE__).'/PopupData.php');
$savedData = PopupData::getPopupDataById($this->getId());
$this->setPostData($savedData);
return $this->getOptionValueFromSavedData($optionName, $forceDefaultValue);
public function getOptionValueFromSavedData($optionName, $forceDefaultValue = false)
$defaultData = $this->getDefaultDataByName($optionName);
$savedData = $this->getPostData();
if (empty($defaultData['type'])) {
$defaultData['type'] = 'string';
if (!empty($savedData)) { //edit mode
if (isset($savedData[$optionName])) { //option exists in the database
$optionValue = $savedData[$optionName];
/* if it's a checkbox, it may not exist in the db
* if we don't care about it's existance, return empty string
* otherwise, go for it's default value
else if ($defaultData['type'] == 'checkbox' && !$forceDefaultValue) {
if ($optionValue === null && !empty($defaultData['defaultValue'])) {
$optionValue = $defaultData['defaultValue'];
if ($defaultData['type'] == 'checkbox') {
$optionValue = $this->boolToChecked($optionValue);
if ($defaultData['type'] == 'number' && $optionValue == 0) {
public static function getSavedData($popupId, $saveMode = '')
$popupSavedData = array();
$events = self::getEventsDataById($popupId, $saveMode);
$targetData = self::getTargetDataById($popupId, $saveMode);
$popupSavedData['sgpb-events'] = self::getEventsDataById($popupId, $saveMode);
if (!empty($targetData)) {
if (!empty($targetData['sgpb-target'])) {
$popupSavedData['sgpb-target'] = $targetData['sgpb-target'];
if (!empty($targetData['sgpb-conditions'])) {
// for the after x pages option backward compatibility
$targetData['sgpb-conditions'] = apply_filters('sgpbAdvancedTargetingSavedData', $targetData['sgpb-conditions'], $popupId);
$popupSavedData['sgpb-conditions'] = $targetData['sgpb-conditions'];
$popupOptions = self::getPopupOptionsById($popupId, $saveMode);//
if (is_array($popupOptions) && is_array($popupSavedData)) {
$popupSavedData = array_merge($popupSavedData, $popupOptions);
public static function getEventsDataById($popupId, $saveMode = '')
if (get_post_meta($popupId, 'sg_popup_events'.$saveMode, true)) {
$eventsData = get_post_meta($popupId, 'sg_popup_events'.$saveMode, true);
public static function getTargetDataById($popupId, $saveMode = '')
if (get_post_meta($popupId, 'sg_popup_target'.$saveMode, true)) {
$targetData = get_post_meta($popupId, 'sg_popup_target'.$saveMode, true);
public static function getPopupOptionsById($popupId, $saveMode = '')
$currentPost = get_post($popupId);
if (!empty($currentPost) && $currentPost->post_status == 'draft') {
if (get_post_meta($popupId, 'sg_popup_options'.$saveMode, true)) {
$optionsData = get_post_meta($popupId, 'sg_popup_options'.$saveMode, true);
if (isset($optionsData['sgpb-subs-gdpr-text'])){
$optionsData['sgpb-subs-gdpr-text'] = wp_kses($optionsData['sgpb-subs-gdpr-text'], AdminHelper::allowed_html_tags(false));
public function getDefaultDataByName($optionName)
if (empty($SGPB_OPTIONS)) {
foreach ($SGPB_OPTIONS as $option) {
if ($option['name'] == $optionName) {
* Get option default option value
* @param string $optionName
public function getOptionDefaultValue($optionName)
// return config data array by name
$optionData = $this->getDefaultDataByName($optionName);
if (empty($optionData)) {
return $optionData['defaultValue'];
* Changing default options form changing options by name
* @param array $defaultOptions
* @param array $changingOptions
* @return array $defaultOptions
public function changeDefaultOptionsByNames($defaultOptions, $changingOptions)
if (empty($defaultOptions) || empty($changingOptions)) {
$changingOptionsNames = array_keys($changingOptions);
foreach ($defaultOptions as $key => $defaultOption) {
$defaultOptionName = $defaultOption['name'];
if (in_array($defaultOptionName, $changingOptionsNames)) {
$defaultOptions[$key] = $changingOptions[$defaultOptionName];