Edit File by line

Deprecated: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in /home/sportsfever/public_html/filemanger/function.php on line 93

Warning: Undefined array key "page_file_edit_line" in /home/sportsfever/public_html/filemanger/edit_text_line.php on line 32
/home/sportsfe.../httpdocs/clone/wp-conte.../themes/Divi/includes/builder/module/helpers
File: MultiViewOptions.php
// Parse incoming $args into an array and merge it with $defaults.
[1000] Fix | Delete
$contexts = wp_parse_args( $contexts, $defaults );
[1001] Fix | Delete
[1002] Fix | Delete
// Set custom props data.
[1003] Fix | Delete
if ( $contexts['custom_props'] && is_array( $contexts['custom_props'] ) ) {
[1004] Fix | Delete
$this->set_custom_props( $contexts['custom_props'] );
[1005] Fix | Delete
}
[1006] Fix | Delete
unset( $contexts['custom_props'] );
[1007] Fix | Delete
[1008] Fix | Delete
// Validate element tag.
[1009] Fix | Delete
$tag = et_core_sanitize_element_tag( $contexts['tag'] );
[1010] Fix | Delete
[1011] Fix | Delete
// Bail early when the tag is invalid.
[1012] Fix | Delete
if ( ! $tag || is_wp_error( $tag ) ) {
[1013] Fix | Delete
return '';
[1014] Fix | Delete
}
[1015] Fix | Delete
[1016] Fix | Delete
// Bail early when required props is not fulfilled.
[1017] Fix | Delete
if ( ! $this->is_required_props_fulfilled( $contexts ) ) {
[1018] Fix | Delete
return '';
[1019] Fix | Delete
}
[1020] Fix | Delete
[1021] Fix | Delete
// Populate the element data.
[1022] Fix | Delete
$data = $this->populate_data( $contexts );
[1023] Fix | Delete
[1024] Fix | Delete
// Bail early when data is empty.
[1025] Fix | Delete
if ( ! $data ) {
[1026] Fix | Delete
return '';
[1027] Fix | Delete
}
[1028] Fix | Delete
[1029] Fix | Delete
$desktop_attrs = '';
[1030] Fix | Delete
$desktop_styles = array();
[1031] Fix | Delete
$desktop_classes = array();
[1032] Fix | Delete
[1033] Fix | Delete
// Generate desktop attribute.
[1034] Fix | Delete
foreach ( et_()->array_get( $data, 'attrs.desktop', array() ) as $attr_key => $attr_value ) {
[1035] Fix | Delete
[1036] Fix | Delete
if ( 'style' === $attr_key ) {
[1037] Fix | Delete
foreach ( explode( ';', $attr_value ) as $inline_style ) {
[1038] Fix | Delete
$inline_styles = explode( ':', $inline_style );
[1039] Fix | Delete
[1040] Fix | Delete
if ( count( $inline_styles ) === 2 ) {
[1041] Fix | Delete
$desktop_styles[ $inline_styles[0] ] = $inline_styles[1];
[1042] Fix | Delete
}
[1043] Fix | Delete
}
[1044] Fix | Delete
[1045] Fix | Delete
continue;
[1046] Fix | Delete
} elseif ( 'class' === $attr_key ) {
[1047] Fix | Delete
if ( is_string( $attr_value ) ) {
[1048] Fix | Delete
$desktop_classes = array_merge( $desktop_classes, explode( ' ', $attr_value ) );
[1049] Fix | Delete
} elseif ( is_array( $attr_value ) ) {
[1050] Fix | Delete
$desktop_classes = array_merge( $desktop_classes, $attr_value );
[1051] Fix | Delete
}
[1052] Fix | Delete
} else {
[1053] Fix | Delete
if ( ! is_string( $attr_value ) ) {
[1054] Fix | Delete
$attr_value = esc_attr( wp_json_encode( $attr_value ) );
[1055] Fix | Delete
}
[1056] Fix | Delete
[1057] Fix | Delete
/**
[1058] Fix | Delete
* Hide image tag instead showing broken image tag output
[1059] Fix | Delete
* This is needed because there is a case image
[1060] Fix | Delete
* just displayed on non desktop mode only.
[1061] Fix | Delete
*/
[1062] Fix | Delete
if ( 'src' === $attr_key && ! $attr_value ) {
[1063] Fix | Delete
$desktop_classes[] = 'et_multi_view_hidden_image';
[1064] Fix | Delete
}
[1065] Fix | Delete
[1066] Fix | Delete
$desktop_attrs .= ' ' . esc_attr( $attr_key ) . '="' . et_core_esc_previously( $attr_value ) . '"';
[1067] Fix | Delete
}
[1068] Fix | Delete
}
[1069] Fix | Delete
[1070] Fix | Delete
// Inject desktop inline style attribute.
[1071] Fix | Delete
foreach ( et_()->array_get( $data, 'styles.desktop', array() ) as $style_key => $style_value ) {
[1072] Fix | Delete
$desktop_styles[ $style_key ] = $style_value;
[1073] Fix | Delete
}
[1074] Fix | Delete
[1075] Fix | Delete
if ( $desktop_styles ) {
[1076] Fix | Delete
$styles = array();
[1077] Fix | Delete
[1078] Fix | Delete
foreach ( $desktop_styles as $style_key => $style_value ) {
[1079] Fix | Delete
$styles[] = esc_attr( $style_key ) . ':' . et_core_esc_previously( $style_value );
[1080] Fix | Delete
}
[1081] Fix | Delete
[1082] Fix | Delete
$desktop_attrs .= ' style="' . implode( ';', $styles ) . '"';
[1083] Fix | Delete
}
[1084] Fix | Delete
[1085] Fix | Delete
// Inject desktop class attribute.
[1086] Fix | Delete
foreach ( et_()->array_get( $data, 'classes.desktop', array() ) as $class_action => $class_names ) {
[1087] Fix | Delete
foreach ( $class_names as $class_name ) {
[1088] Fix | Delete
if ( 'remove' === $class_action && in_array( $class_name, $desktop_classes, true ) ) {
[1089] Fix | Delete
$desktop_classes = array_diff( $desktop_classes, array( $class_name ) );
[1090] Fix | Delete
}
[1091] Fix | Delete
[1092] Fix | Delete
if ( 'add' === $class_action && ! in_array( $class_name, $desktop_classes, true ) ) {
[1093] Fix | Delete
$desktop_classes[] = $class_name;
[1094] Fix | Delete
}
[1095] Fix | Delete
}
[1096] Fix | Delete
}
[1097] Fix | Delete
[1098] Fix | Delete
// Inject desktop visibility class attribute.
[1099] Fix | Delete
if ( ! et_()->array_get( $data, 'visibility.desktop', true ) ) {
[1100] Fix | Delete
$desktop_classes[] = 'et_multi_view_hidden';
[1101] Fix | Delete
}
[1102] Fix | Delete
[1103] Fix | Delete
if ( $desktop_classes ) {
[1104] Fix | Delete
$desktop_attrs .= ' class="' . implode( ' ', array_unique( $desktop_classes ) ) . '"';
[1105] Fix | Delete
}
[1106] Fix | Delete
[1107] Fix | Delete
// Render the output.
[1108] Fix | Delete
if ( $this->is_self_closing_tag( $tag ) ) {
[1109] Fix | Delete
$output = sprintf(
[1110] Fix | Delete
'<%1$s%2$s%3$s />',
[1111] Fix | Delete
et_core_esc_previously( $tag ), // #1
[1112] Fix | Delete
et_core_esc_previously( $desktop_attrs ), // #2
[1113] Fix | Delete
et_core_esc_previously(
[1114] Fix | Delete
$this->render_attrs(
[1115] Fix | Delete
array(
[1116] Fix | Delete
'target' => $contexts['target'],
[1117] Fix | Delete
'hover_selector' => $contexts['hover_selector'],
[1118] Fix | Delete
'render_slug' => $contexts['render_slug'],
[1119] Fix | Delete
),
[1120] Fix | Delete
false,
[1121] Fix | Delete
$data
[1122] Fix | Delete
)
[1123] Fix | Delete
) // #3
[1124] Fix | Delete
);
[1125] Fix | Delete
} else {
[1126] Fix | Delete
$output = sprintf(
[1127] Fix | Delete
'<%1$s%2$s%3$s>%4$s</%1$s>',
[1128] Fix | Delete
et_core_esc_previously( $tag ), // #1
[1129] Fix | Delete
et_core_esc_previously( $desktop_attrs ), // #2
[1130] Fix | Delete
et_core_esc_previously(
[1131] Fix | Delete
$this->render_attrs(
[1132] Fix | Delete
array(
[1133] Fix | Delete
'target' => $contexts['target'],
[1134] Fix | Delete
'hover_selector' => $contexts['hover_selector'],
[1135] Fix | Delete
'render_slug' => $contexts['render_slug'],
[1136] Fix | Delete
),
[1137] Fix | Delete
false,
[1138] Fix | Delete
$data
[1139] Fix | Delete
)
[1140] Fix | Delete
), // #3
[1141] Fix | Delete
et_core_esc_previously( et_()->array_get( $data, 'content.desktop', '' ) ) // #4
[1142] Fix | Delete
);
[1143] Fix | Delete
}
[1144] Fix | Delete
[1145] Fix | Delete
if ( ! $echo ) {
[1146] Fix | Delete
return $output;
[1147] Fix | Delete
}
[1148] Fix | Delete
[1149] Fix | Delete
echo et_core_esc_previously( $output );
[1150] Fix | Delete
}
[1151] Fix | Delete
[1152] Fix | Delete
/**
[1153] Fix | Delete
* Get or render the multi content attribute.
[1154] Fix | Delete
*
[1155] Fix | Delete
* @param array $contexts {
[1156] Fix | Delete
* Data contexts.
[1157] Fix | Delete
*
[1158] Fix | Delete
* @type string $content Param that will be used to populate the content data.
[1159] Fix | Delete
* Use props name wrapped with 2 curly brackets within the value for find & replace wildcard: {{props_name}}
[1160] Fix | Delete
*
[1161] Fix | Delete
* @type array $attrs Param that will be used to populate the attributes data.
[1162] Fix | Delete
* Associative array key used as attribute name and the value will be used as attribute value.
[1163] Fix | Delete
* Special case for 'class' and 'style' attribute name will only generating output for desktop mode.
[1164] Fix | Delete
* Use 'styles' or 'classes' context for multi modes usage.
[1165] Fix | Delete
* Use props name wrapped with 2 curly brackets within the value for find & replace wildcard: {{props_name}}
[1166] Fix | Delete
*
[1167] Fix | Delete
* @type array $styles Param that will be used to populate the inline style attributes data.
[1168] Fix | Delete
* Associative array key used as style property name and the value will be used as inline style property value.
[1169] Fix | Delete
* Use props name wrapped with 2 curly brackets within the value for find & replace wildcard: {{props_name}}
[1170] Fix | Delete
*
[1171] Fix | Delete
* @type array $classes Param that will be used to populate the class data.
[1172] Fix | Delete
* Associative array key used as class name and the value is associative array as the conditional check compared with prop value.
[1173] Fix | Delete
* The conditional check array key used as the prop name and the value used as the conditional check compared with prop value.
[1174] Fix | Delete
* The class will be added if all conditional check is true and will be removed if any of conditional check is false.
[1175] Fix | Delete
*
[1176] Fix | Delete
* @type array $visibility Param that will be used to populate the visibility data.
[1177] Fix | Delete
* Associative array key used as the prop name and the value used as the conditional check compared with prop value.
[1178] Fix | Delete
* The element will visible if all conditional check is true and will be hidden if any of conditional check is false.
[1179] Fix | Delete
*
[1180] Fix | Delete
* @type string $target HTML element selector target which the element will be modified. Default is empty string.
[1181] Fix | Delete
* Dynamic module order class wildcard string is accepted: %%order_class%%
[1182] Fix | Delete
*
[1183] Fix | Delete
* @type string $hover_selector HTML element selector which trigger the hover event. Default is empty string.
[1184] Fix | Delete
* Dynamic module order class wildcard string is accepted: %%order_class%%
[1185] Fix | Delete
*
[1186] Fix | Delete
* @type string $render_slug Render slug that will be used to calculate the module order class. Default is current module slug.
[1187] Fix | Delete
*
[1188] Fix | Delete
* @type array $custom_props Defined custom props data.
[1189] Fix | Delete
*
[1190] Fix | Delete
* @type array $conditional_values Defined data sources for data toggle.
[1191] Fix | Delete
*
[1192] Fix | Delete
* @type array $required List of required props key to render the element.
[1193] Fix | Delete
* Will returning empty string if any required props is empty.
[1194] Fix | Delete
* Default is empty array it will try to gather any props name set in the 'content' context.
[1195] Fix | Delete
* Set to false to disable conditional check.
[1196] Fix | Delete
* }
[1197] Fix | Delete
* @param bool $echo Whether to print the output instead returning it.
[1198] Fix | Delete
* @param array $populated_data Pre populated data in case just need to format the attributes output.
[1199] Fix | Delete
* @param bool $as_array Whether to return the output as array or string.
[1200] Fix | Delete
*
[1201] Fix | Delete
* @return string|void
[1202] Fix | Delete
*
[1203] Fix | Delete
* @since 3.27.1
[1204] Fix | Delete
*/
[1205] Fix | Delete
public function render_attrs( $contexts = array(), $echo = false, $populated_data = null, $as_array = false ) {
[1206] Fix | Delete
// Define the array of defaults.
[1207] Fix | Delete
$defaults = array(
[1208] Fix | Delete
'content' => '',
[1209] Fix | Delete
'attrs' => array(),
[1210] Fix | Delete
'styles' => array(),
[1211] Fix | Delete
'classes' => array(),
[1212] Fix | Delete
'visibility' => array(),
[1213] Fix | Delete
'target' => '',
[1214] Fix | Delete
'hover_selector' => '',
[1215] Fix | Delete
'render_slug' => '',
[1216] Fix | Delete
'custom_props' => array(),
[1217] Fix | Delete
);
[1218] Fix | Delete
[1219] Fix | Delete
// Parse incoming $args into an array and merge it with $defaults.
[1220] Fix | Delete
$contexts = wp_parse_args( $contexts, $defaults );
[1221] Fix | Delete
[1222] Fix | Delete
if ( $contexts['custom_props'] && is_array( $contexts['custom_props'] ) ) {
[1223] Fix | Delete
$this->set_custom_props( $contexts['custom_props'] );
[1224] Fix | Delete
}
[1225] Fix | Delete
[1226] Fix | Delete
unset( $contexts['custom_props'] );
[1227] Fix | Delete
[1228] Fix | Delete
$data = is_null( $populated_data ) ? $this->populate_data( $contexts ) : $populated_data;
[1229] Fix | Delete
[1230] Fix | Delete
if ( $data ) {
[1231] Fix | Delete
foreach ( $data as $context => $modes ) {
[1232] Fix | Delete
// Distinct the values to omit duplicate values across modes.
[1233] Fix | Delete
$data[ $context ] = $this->distinct_values( $modes );
[1234] Fix | Delete
[1235] Fix | Delete
// Remove context data if there is only desktop mode data available.
[1236] Fix | Delete
// This intended to avoid unnecessary multi view attribute rendered if there is only desktop
[1237] Fix | Delete
// mode data is available.
[1238] Fix | Delete
if ( 1 === count( $data[ $context ] ) && isset( $data[ $context ]['desktop'] ) ) {
[1239] Fix | Delete
unset( $data[ $context ] );
[1240] Fix | Delete
}
[1241] Fix | Delete
}
[1242] Fix | Delete
}
[1243] Fix | Delete
[1244] Fix | Delete
$output = '';
[1245] Fix | Delete
[1246] Fix | Delete
if ( $data ) {
[1247] Fix | Delete
if ( isset( $data['content'] ) ) {
[1248] Fix | Delete
foreach ( $data['content'] as $mode => $content ) {
[1249] Fix | Delete
if ( ! $content ) {
[1250] Fix | Delete
continue;
[1251] Fix | Delete
}
[1252] Fix | Delete
[1253] Fix | Delete
$content = str_replace( '&lt;', htmlentities( '&lt;' ), $content );
[1254] Fix | Delete
$content = str_replace( '&gt;', htmlentities( '&gt;' ), $content );
[1255] Fix | Delete
[1256] Fix | Delete
$data['content'][ $mode ] = $content;
[1257] Fix | Delete
}
[1258] Fix | Delete
}
[1259] Fix | Delete
[1260] Fix | Delete
$content_desktop = et_()->array_get( $data, 'content.desktop', null );
[1261] Fix | Delete
$content_tablet = et_()->array_get( $data, 'content.tablet', null );
[1262] Fix | Delete
$content_phone = et_()->array_get( $data, 'content.phone', null );
[1263] Fix | Delete
[1264] Fix | Delete
$visibility_desktop = et_()->array_get( $data, 'visibility.desktop', null );
[1265] Fix | Delete
$visibility_tablet = et_()->array_get( $data, 'visibility.tablet', null );
[1266] Fix | Delete
$visibility_phone = et_()->array_get( $data, 'visibility.phone', null );
[1267] Fix | Delete
[1268] Fix | Delete
$is_hidden_on_load_tablet = false;
[1269] Fix | Delete
if ( ! is_null( $content_tablet ) && $content_desktop !== $content_tablet ) {
[1270] Fix | Delete
$is_hidden_on_load_tablet = true;
[1271] Fix | Delete
}
[1272] Fix | Delete
[1273] Fix | Delete
if ( ! is_null( $visibility_tablet ) && $visibility_desktop !== $visibility_tablet ) {
[1274] Fix | Delete
$is_hidden_on_load_tablet = true;
[1275] Fix | Delete
}
[1276] Fix | Delete
[1277] Fix | Delete
$is_hidden_on_load_phone = false;
[1278] Fix | Delete
if ( ! is_null( $content_phone ) && $content_desktop !== $content_phone ) {
[1279] Fix | Delete
$is_hidden_on_load_phone = true;
[1280] Fix | Delete
}
[1281] Fix | Delete
[1282] Fix | Delete
if ( ! is_null( $visibility_phone ) && $visibility_desktop !== $visibility_phone ) {
[1283] Fix | Delete
$is_hidden_on_load_phone = true;
[1284] Fix | Delete
}
[1285] Fix | Delete
[1286] Fix | Delete
$data = array(
[1287] Fix | Delete
'schema' => $data,
[1288] Fix | Delete
'slug' => $this->slug,
[1289] Fix | Delete
);
[1290] Fix | Delete
[1291] Fix | Delete
if ( ! empty( $contexts['target'] ) ) {
[1292] Fix | Delete
if ( false !== strpos( $contexts['target'], '%%order_class%%' ) ) {
[1293] Fix | Delete
$render_slug = ! empty( $contexts['render_slug'] ) ? $contexts['render_slug'] : $this->slug;
[1294] Fix | Delete
$order_class = ET_Builder_Element::get_module_order_class( $render_slug );
[1295] Fix | Delete
[1296] Fix | Delete
if ( $order_class ) {
[1297] Fix | Delete
$data['target'] = str_replace( '%%order_class%%', ".{$order_class}", $contexts['target'] );
[1298] Fix | Delete
}
[1299] Fix | Delete
} else {
[1300] Fix | Delete
$data['target'] = $contexts['target'];
[1301] Fix | Delete
}
[1302] Fix | Delete
}
[1303] Fix | Delete
[1304] Fix | Delete
if ( ! empty( $contexts['hover_selector'] ) ) {
[1305] Fix | Delete
if ( false !== strpos( $contexts['hover_selector'], '%%order_class%%' ) ) {
[1306] Fix | Delete
$render_slug = ! empty( $contexts['render_slug'] ) ? $contexts['render_slug'] : $this->slug;
[1307] Fix | Delete
$order_class = ET_Builder_Element::get_module_order_class( $render_slug );
[1308] Fix | Delete
[1309] Fix | Delete
if ( $order_class ) {
[1310] Fix | Delete
$data['hover_selector'] = str_replace( '%%order_class%%', ".{$order_class}", $contexts['hover_selector'] );
[1311] Fix | Delete
}
[1312] Fix | Delete
} else {
[1313] Fix | Delete
$data['hover_selector'] = $contexts['hover_selector'];
[1314] Fix | Delete
}
[1315] Fix | Delete
}
[1316] Fix | Delete
[1317] Fix | Delete
$data_attr_key = esc_attr( $this->data_attr_key );
[1318] Fix | Delete
[1319] Fix | Delete
if ( $as_array ) {
[1320] Fix | Delete
$output = array();
[1321] Fix | Delete
[1322] Fix | Delete
$output[ $data_attr_key ] = esc_attr( wp_json_encode( $data ) );
[1323] Fix | Delete
[1324] Fix | Delete
if ( $is_hidden_on_load_tablet ) {
[1325] Fix | Delete
$output[ $data_attr_key. '-load-tablet-hidden'] = 'true';
[1326] Fix | Delete
}
[1327] Fix | Delete
[1328] Fix | Delete
if ( $is_hidden_on_load_phone ) {
[1329] Fix | Delete
$output[ $data_attr_key. '-load-phone-hidden'] = 'true';
[1330] Fix | Delete
}
[1331] Fix | Delete
} else {
[1332] Fix | Delete
// Format the html data attribute output.
[1333] Fix | Delete
$output = sprintf( ' %1$s="%2$s"', $data_attr_key, esc_attr( wp_json_encode( $data ) ) );
[1334] Fix | Delete
[1335] Fix | Delete
if ( $is_hidden_on_load_tablet ) {
[1336] Fix | Delete
$output .= sprintf( ' %1$s="%2$s"', $data_attr_key . '-load-tablet-hidden', 'true' );
[1337] Fix | Delete
}
[1338] Fix | Delete
[1339] Fix | Delete
if ( $is_hidden_on_load_phone ) {
[1340] Fix | Delete
$output .= sprintf( ' %1$s="%2$s"', $data_attr_key . '-load-phone-hidden', 'true' );
[1341] Fix | Delete
}
[1342] Fix | Delete
}
[1343] Fix | Delete
}
[1344] Fix | Delete
[1345] Fix | Delete
if ( ! $echo || $as_array ) {
[1346] Fix | Delete
return $output;
[1347] Fix | Delete
}
[1348] Fix | Delete
[1349] Fix | Delete
echo et_core_esc_previously( $output );
[1350] Fix | Delete
}
[1351] Fix | Delete
[1352] Fix | Delete
/**
[1353] Fix | Delete
* Populate the multi view data.
[1354] Fix | Delete
*
[1355] Fix | Delete
* @param array $contexts {
[1356] Fix | Delete
* Data contexts.
[1357] Fix | Delete
*
[1358] Fix | Delete
* @type string $content Param that will be used to populate the content data.
[1359] Fix | Delete
* Use props name wrapped with 2 curly brackets within the value for find & replace wildcard: {{props_name}}
[1360] Fix | Delete
*
[1361] Fix | Delete
* @type array $attrs Param that will be used to populate the attributes data.
[1362] Fix | Delete
* Associative array key used as attribute name and the value will be used as attribute value.
[1363] Fix | Delete
* Special case for 'class' and 'style' attribute name will only generating output for desktop mode.
[1364] Fix | Delete
* Use 'styles' or 'classes' context for multi modes usage.
[1365] Fix | Delete
* Use props name wrapped with 2 curly brackets within the value for find & replace wildcard: {{props_name}}
[1366] Fix | Delete
*
[1367] Fix | Delete
* @type array $styles Param that will be used to populate the inline style attributes data.
[1368] Fix | Delete
* Associative array key used as style property name and the value will be used as inline style property value.
[1369] Fix | Delete
* Use props name wrapped with 2 curly brackets within the value for find & replace wildcard: {{props_name}}
[1370] Fix | Delete
*
[1371] Fix | Delete
* @type array $classes Param that will be used to populate the class data.
[1372] Fix | Delete
* Associative array key used as class name and the value is associative array as the conditional check compared with prop value.
[1373] Fix | Delete
* The conditional check array key used as the prop name and the value used as the conditional check compared with prop value.
[1374] Fix | Delete
* The class will be added if all conditional check is true and will be removed if any of conditional check is false.
[1375] Fix | Delete
*
[1376] Fix | Delete
* @type array $visibility Param that will be used to populate the visibility data.
[1377] Fix | Delete
* Associative array key used as the prop name and the value used as the conditional check compared with prop value.
[1378] Fix | Delete
* The element will visible if all conditional check is true and will be hidden if any of conditional check is false.
[1379] Fix | Delete
* }
[1380] Fix | Delete
*
[1381] Fix | Delete
* @return array
[1382] Fix | Delete
*
[1383] Fix | Delete
* @since 3.27.1
[1384] Fix | Delete
*/
[1385] Fix | Delete
public function populate_data( $contexts = array() ) {
[1386] Fix | Delete
$data = array();
[1387] Fix | Delete
[1388] Fix | Delete
// Define the array of defaults.
[1389] Fix | Delete
$defaults = array(
[1390] Fix | Delete
'content' => '',
[1391] Fix | Delete
'attrs' => array(),
[1392] Fix | Delete
'styles' => array(),
[1393] Fix | Delete
'classes' => array(),
[1394] Fix | Delete
'visibility' => array(),
[1395] Fix | Delete
);
[1396] Fix | Delete
[1397] Fix | Delete
// Parse incoming $args into an array and merge it with $defaults.
[1398] Fix | Delete
$contexts = wp_parse_args( $contexts, $defaults );
[1399] Fix | Delete
[1400] Fix | Delete
foreach ( $contexts as $context => $context_args ) {
[1401] Fix | Delete
// Skip if the context is not listed as default.
[1402] Fix | Delete
if ( ( ! isset( $defaults[ $context ] ) ) ) {
[1403] Fix | Delete
continue;
[1404] Fix | Delete
}
[1405] Fix | Delete
[1406] Fix | Delete
$callback = array( $this, "populate_data__{$context}" );
[1407] Fix | Delete
[1408] Fix | Delete
// Skip if the context has no callback handler.
[1409] Fix | Delete
if ( ! is_callable( $callback ) ) {
[1410] Fix | Delete
continue;
[1411] Fix | Delete
}
[1412] Fix | Delete
[1413] Fix | Delete
// @phpcs:ignore Generic.PHP.ForbiddenFunctions.Found
[1414] Fix | Delete
$context_data = call_user_func( $callback, $context_args );
[1415] Fix | Delete
[1416] Fix | Delete
// Skip if the context data is empty or WP_Error object.
[1417] Fix | Delete
if ( ! $context_data || is_wp_error( $context_data ) ) {
[1418] Fix | Delete
continue;
[1419] Fix | Delete
}
[1420] Fix | Delete
[1421] Fix | Delete
// Set the context data for each breakpoints.
[1422] Fix | Delete
foreach ( $context_data as $mode => $context_value ) {
[1423] Fix | Delete
$data[ $context ][ $mode ] = $context_value;
[1424] Fix | Delete
}
[1425] Fix | Delete
}
[1426] Fix | Delete
[1427] Fix | Delete
return $this->filter_data( $data );
[1428] Fix | Delete
}
[1429] Fix | Delete
[1430] Fix | Delete
/**
[1431] Fix | Delete
* Populate content data context.
[1432] Fix | Delete
*
[1433] Fix | Delete
* @since 3.27.1
[1434] Fix | Delete
*
[1435] Fix | Delete
* @param string $content Data contexts.
[1436] Fix | Delete
*
[1437] Fix | Delete
* @return array
[1438] Fix | Delete
*/
[1439] Fix | Delete
protected function populate_data__content( $content ) {
[1440] Fix | Delete
if ( ! $content || ! is_string( $content ) ) {
[1441] Fix | Delete
return new WP_Error();
[1442] Fix | Delete
}
[1443] Fix | Delete
[1444] Fix | Delete
$data = array();
[1445] Fix | Delete
[1446] Fix | Delete
if ( preg_match_all( $this->pattern, $content, $matches, PREG_SET_ORDER, 0 ) ) {
[1447] Fix | Delete
$replacements = array();
[1448] Fix | Delete
[1449] Fix | Delete
foreach ( $matches as $match ) {
[1450] Fix | Delete
if ( ! isset( $match[1] ) ) {
[1451] Fix | Delete
continue;
[1452] Fix | Delete
}
[1453] Fix | Delete
[1454] Fix | Delete
$values = $this->get_values( $match[1] );
[1455] Fix | Delete
[1456] Fix | Delete
if ( $values ) {
[1457] Fix | Delete
$replacements[ $match[0] ] = array(
[1458] Fix | Delete
'context' => 'content',
[1459] Fix | Delete
'name' => $match[1],
[1460] Fix | Delete
'values' => $values,
[1461] Fix | Delete
);
[1462] Fix | Delete
}
[1463] Fix | Delete
}
[1464] Fix | Delete
[1465] Fix | Delete
if ( $replacements ) {
[1466] Fix | Delete
foreach ( $replacements as $find => $replacement ) {
[1467] Fix | Delete
foreach ( $replacement['values'] as $mode => $value ) {
[1468] Fix | Delete
// Manipulate the value if needed.
[1469] Fix | Delete
$value = $this->filter_value(
[1470] Fix | Delete
$value,
[1471] Fix | Delete
array_merge(
[1472] Fix | Delete
$replacement,
[1473] Fix | Delete
array(
[1474] Fix | Delete
'mode' => $mode,
[1475] Fix | Delete
)
[1476] Fix | Delete
)
[1477] Fix | Delete
);
[1478] Fix | Delete
[1479] Fix | Delete
if ( ! is_wp_error( $value ) ) {
[1480] Fix | Delete
if ( ! isset( $data[ $mode ] ) ) {
[1481] Fix | Delete
$data[ $mode ] = $content;
[1482] Fix | Delete
}
[1483] Fix | Delete
[1484] Fix | Delete
$data[ $mode ] = str_replace( $find, $value, $data[ $mode ] );
[1485] Fix | Delete
}
[1486] Fix | Delete
}
[1487] Fix | Delete
}
[1488] Fix | Delete
}
[1489] Fix | Delete
} else {
[1490] Fix | Delete
// Manipulate the value if needed.
[1491] Fix | Delete
$value = $this->filter_value(
[1492] Fix | Delete
$content,
[1493] Fix | Delete
array(
[1494] Fix | Delete
'context' => 'content',
[1495] Fix | Delete
'mode' => 'desktop',
[1496] Fix | Delete
)
[1497] Fix | Delete
);
[1498] Fix | Delete
[1499] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function