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
File: ab-testing.php
unset( $cached_data['subjects_totals'][ $subject_total_id ] );
[500] Fix | Delete
continue;
[501] Fix | Delete
}
[502] Fix | Delete
}
[503] Fix | Delete
[504] Fix | Delete
// Rank by engagement
[505] Fix | Delete
$cached_subjects_ranks = wp_list_pluck( $cached_data['subjects_totals'], $rank_metrics );
[506] Fix | Delete
$cached_subjects_ranks_index = 0;
[507] Fix | Delete
[508] Fix | Delete
// Sort from high to low, mantain keys
[509] Fix | Delete
arsort( $cached_subjects_ranks );
[510] Fix | Delete
[511] Fix | Delete
// Push color data
[512] Fix | Delete
foreach ( $cached_subjects_ranks as $subject_rank_id => $subject_rank_value ) {
[513] Fix | Delete
$is_empty_rank_value = 0 === $subject_rank_value;
[514] Fix | Delete
$has_subject_rank_color = isset( $subject_rank_colors[ $cached_subjects_ranks_index ] );
[515] Fix | Delete
[516] Fix | Delete
// If the rank value (derived from engagement) is empty, display default subject color
[517] Fix | Delete
if ( $is_empty_rank_value ) {
[518] Fix | Delete
$cached_data['subjects_totals'][ $subject_rank_id ]['color'] = '#F3CB57';
[519] Fix | Delete
} else {
[520] Fix | Delete
$cached_data['subjects_totals'][ $subject_rank_id ]['color'] = $has_subject_rank_color ? $subject_rank_colors[ $cached_subjects_ranks_index ] : '#7E0000';
[521] Fix | Delete
}
[522] Fix | Delete
[523] Fix | Delete
$cached_subjects_ranks_index++;
[524] Fix | Delete
}
[525] Fix | Delete
}
[526] Fix | Delete
[527] Fix | Delete
return $cached_data;
[528] Fix | Delete
}
[529] Fix | Delete
[530] Fix | Delete
$wpdb->et_divi_ab_testing_stats = $wpdb->prefix . 'et_divi_ab_testing_stats';
[531] Fix | Delete
[532] Fix | Delete
// do nothing if no stats table exists in current WP
[533] Fix | Delete
if ( ! $wpdb->get_var( "SHOW TABLES LIKE '$wpdb->et_divi_ab_testing_stats'" ) ) {
[534] Fix | Delete
return false;
[535] Fix | Delete
}
[536] Fix | Delete
[537] Fix | Delete
// Main placeholder
[538] Fix | Delete
$event_types = et_pb_ab_get_event_types();
[539] Fix | Delete
$analysis_types = et_pb_ab_get_analysis_types();
[540] Fix | Delete
$analysis_formulas = et_pb_ab_get_analysis_formulas();
[541] Fix | Delete
$time = $time ? $time : date( 'Y-m-d H:i:s', current_time( 'timestamp' ) );
[542] Fix | Delete
$stats = array(
[543] Fix | Delete
'subjects_id' => $subjects_id,
[544] Fix | Delete
'subjects_logs' => array(),
[545] Fix | Delete
'subjects_analysis' => array(),
[546] Fix | Delete
'subjects_totals' => array(),
[547] Fix | Delete
'events_totals' => array(),
[548] Fix | Delete
'dates' => array(),
[549] Fix | Delete
);
[550] Fix | Delete
[551] Fix | Delete
// Get all logs in test
[552] Fix | Delete
switch ( $duration ) {
[553] Fix | Delete
case 'all':
[554] Fix | Delete
$date_range_interval = 'week';
[555] Fix | Delete
$query = $wpdb->prepare(
[556] Fix | Delete
"SELECT subject_id, event, YEARWEEK(record_date) AS 'date', COUNT(id) AS 'count' FROM `{$wpdb->et_divi_ab_testing_stats}` WHERE test_id = %d GROUP BY subject_id, YEARWEEK(record_date), event",
[557] Fix | Delete
$post_id
[558] Fix | Delete
);
[559] Fix | Delete
break;
[560] Fix | Delete
[561] Fix | Delete
case 'month':
[562] Fix | Delete
$date_range_interval = 'day';
[563] Fix | Delete
$query = $wpdb->prepare(
[564] Fix | Delete
"SELECT subject_id, event, DATE(record_date) AS 'date', COUNT(id) AS 'count' FROM `{$wpdb->et_divi_ab_testing_stats}` WHERE test_id = %d AND record_date <= %s AND record_date > DATE_SUB( %s, INTERVAL 1 MONTH ) GROUP BY subject_id, DAYOFMONTH(record_date), event",
[565] Fix | Delete
$post_id,
[566] Fix | Delete
$time,
[567] Fix | Delete
$time
[568] Fix | Delete
);
[569] Fix | Delete
break;
[570] Fix | Delete
[571] Fix | Delete
case 'day':
[572] Fix | Delete
$date_range_interval = 'hour';
[573] Fix | Delete
$query = $wpdb->prepare(
[574] Fix | Delete
"SELECT subject_id, event, DATE_FORMAT(record_date, %s) AS 'date', COUNT(id) AS 'count' FROM `{$wpdb->et_divi_ab_testing_stats}` WHERE test_id = %d AND record_date <= %s AND record_date > DATE_SUB( %s, INTERVAL 1 DAY ) GROUP BY subject_id, HOUR(record_date), event",
[575] Fix | Delete
'%Y-%m-%d %H:00',
[576] Fix | Delete
$post_id,
[577] Fix | Delete
$time,
[578] Fix | Delete
$time
[579] Fix | Delete
);
[580] Fix | Delete
break;
[581] Fix | Delete
[582] Fix | Delete
default:
[583] Fix | Delete
$date_range_interval = 'day';
[584] Fix | Delete
$query = $wpdb->prepare(
[585] Fix | Delete
"SELECT subject_id, event, DATE(record_date) AS 'date', COUNT(id) AS 'count' FROM `{$wpdb->et_divi_ab_testing_stats}` WHERE test_id = %d AND record_date <= %s AND record_date > DATE_SUB( %s, INTERVAL 1 WEEK ) GROUP BY subject_id, DAYOFMONTH(record_date), event",
[586] Fix | Delete
$post_id,
[587] Fix | Delete
$time,
[588] Fix | Delete
$time
[589] Fix | Delete
);
[590] Fix | Delete
break;
[591] Fix | Delete
}
[592] Fix | Delete
[593] Fix | Delete
$results = $wpdb->get_results( $query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- value of $query was prepared in above switch statement.
[594] Fix | Delete
[595] Fix | Delete
unset( $wpdb->et_divi_ab_testing_stats );
[596] Fix | Delete
[597] Fix | Delete
if ( ! empty( $results ) ) {
[598] Fix | Delete
// Get min and max timestamp based on query result
[599] Fix | Delete
$min_max_date = et_pb_ab_get_min_max_timestamp( $results, $date_range_interval );
[600] Fix | Delete
[601] Fix | Delete
// Create default list
[602] Fix | Delete
$date_list = et_pb_ab_get_date_range( $min_max_date['min'], $min_max_date['max'], $date_range_interval );
[603] Fix | Delete
[604] Fix | Delete
// Insert date list to main placeholder
[605] Fix | Delete
$stats['dates'] = $date_list;
[606] Fix | Delete
[607] Fix | Delete
// Format YYYYWW format on all-time stats into human-readable format (M jS)
[608] Fix | Delete
foreach ( $stats['dates'] as $date_key => $date_time ) {
[609] Fix | Delete
if ( 'all' === $duration ) {
[610] Fix | Delete
// Format weekly label
[611] Fix | Delete
$week_in_seconds = 60 * 60 * 24 * 7;
[612] Fix | Delete
$current_time = current_time( 'timestamp' );
[613] Fix | Delete
$week_start_time = strtotime( substr( $date_time, 0, 4 ) . 'W' . substr( $date_time, 4, 2 ) );
[614] Fix | Delete
$week_end_time = $week_start_time + $week_in_seconds;
[615] Fix | Delete
[616] Fix | Delete
// Don't let the end time pass current time
[617] Fix | Delete
if ( $week_end_time > $current_time ) {
[618] Fix | Delete
$week_end_time = $current_time;
[619] Fix | Delete
}
[620] Fix | Delete
[621] Fix | Delete
// Simplify the label by removing the end month when the start and end month are identical
[622] Fix | Delete
if ( date( 'M', $week_start_time ) === date( 'M', $week_end_time ) ) {
[623] Fix | Delete
$stats['dates'][ $date_key ] = date( 'M jS', $week_start_time ) . ' - ' . date( 'jS', $week_end_time );
[624] Fix | Delete
} else {
[625] Fix | Delete
$stats['dates'][ $date_key ] = date( 'M jS', $week_start_time ) . ' - ' . date( 'M jS', $week_end_time );
[626] Fix | Delete
}
[627] Fix | Delete
} else if ( 'day' === $duration ) {
[628] Fix | Delete
$stats['dates'][ $date_key ] = date( 'H:i', strtotime( $date_time ) );
[629] Fix | Delete
} else {
[630] Fix | Delete
$stats['dates'][ $date_key ] = date( 'M jS', strtotime( $date_time ) );
[631] Fix | Delete
}
[632] Fix | Delete
}
[633] Fix | Delete
[634] Fix | Delete
// Fill subject logs placeholder with proper default
[635] Fix | Delete
$stats['subjects_logs'] = array_fill_keys(
[636] Fix | Delete
$subjects,
[637] Fix | Delete
array_fill_keys(
[638] Fix | Delete
$event_types,
[639] Fix | Delete
array_fill_keys(
[640] Fix | Delete
$date_list,
[641] Fix | Delete
0
[642] Fix | Delete
)
[643] Fix | Delete
)
[644] Fix | Delete
);
[645] Fix | Delete
[646] Fix | Delete
// Loop query result and place into placeholder
[647] Fix | Delete
foreach ( $results as $log ) {
[648] Fix | Delete
if ( ! in_array( $log->subject_id, $subjects_id ) ) {
[649] Fix | Delete
continue;
[650] Fix | Delete
}
[651] Fix | Delete
[652] Fix | Delete
$log_date = $log->date;
[653] Fix | Delete
[654] Fix | Delete
// Format year-week to ensure the given date is equal to the expected format. MySQl YEARWEEK() seems to output
[655] Fix | Delete
// the date in ISO-8601 format (first week of the year becomes 201753 instead of the expected 201801)
[656] Fix | Delete
if ( 'all' === $duration ) {
[657] Fix | Delete
$log_date = date( 'YW', strtotime( substr( $log_date, 0, 4 ) . 'W' . substr( $log_date, 4, 2 ) ) );
[658] Fix | Delete
}
[659] Fix | Delete
[660] Fix | Delete
$stats['subjects_logs'][ "subject_{$log->subject_id}" ][ $log->event ][ $log_date ] = $log->count;
[661] Fix | Delete
}
[662] Fix | Delete
[663] Fix | Delete
// Determine logs' totals and run analysis
[664] Fix | Delete
foreach ( $stats['subjects_logs'] as $subject_log_id => $subject_log ) {
[665] Fix | Delete
[666] Fix | Delete
// Push stats total data
[667] Fix | Delete
foreach ( $subject_log as $log_type => $logs ) {
[668] Fix | Delete
$stats['subjects_totals'][ $subject_log_id ][ $log_type ] = array_sum( $logs );
[669] Fix | Delete
}
[670] Fix | Delete
[671] Fix | Delete
// Run analysis for stats' total data
[672] Fix | Delete
foreach ( $analysis_types as $analysis_type ) {
[673] Fix | Delete
$numerator_event = $analysis_formulas[ $analysis_type ]['numerator'];
[674] Fix | Delete
$denominator_event = $analysis_formulas[ $analysis_type ]['denominator'];
[675] Fix | Delete
$numerator = isset( $stats['subjects_totals'][ $subject_log_id ][ $numerator_event ] ) ? $stats['subjects_totals'][ $subject_log_id ][ $numerator_event ] : 0;
[676] Fix | Delete
$denominator = isset( $stats['subjects_totals'][ $subject_log_id ][ $denominator_event ] ) ? $stats['subjects_totals'][ $subject_log_id ][ $denominator_event ] : 0;
[677] Fix | Delete
$analysis = $denominator === 0 ? 0 : floatval( number_format( ( $numerator / $denominator ) * 100, 2 ) );
[678] Fix | Delete
[679] Fix | Delete
if ( $analysis_formulas[ $analysis_type ]['inverse'] && 0 !== $numerator && 0 !== $denominator_event ) {
[680] Fix | Delete
$analysis = 100 - $analysis;
[681] Fix | Delete
}
[682] Fix | Delete
[683] Fix | Delete
$stats['subjects_totals'][ $subject_log_id ][ $analysis_type ] = $analysis;
[684] Fix | Delete
}
[685] Fix | Delete
[686] Fix | Delete
// Run analysis for each log date
[687] Fix | Delete
foreach ( $date_list as $log_date ) {
[688] Fix | Delete
[689] Fix | Delete
// Run analysis per analysis type
[690] Fix | Delete
foreach ( $analysis_types as $analysis_type ) {
[691] Fix | Delete
$numerator_event = $analysis_formulas[ $analysis_type ]['numerator'];
[692] Fix | Delete
$denominator_event = $analysis_formulas[ $analysis_type ]['denominator'];
[693] Fix | Delete
$numerator = isset( $stats['subjects_logs'][ $subject_log_id ][ $numerator_event ][ $log_date ] ) ? intval( $stats['subjects_logs'][ $subject_log_id ][ $numerator_event ][ $log_date ] ) : 0;
[694] Fix | Delete
$denominator = isset( $stats['subjects_logs'][ $subject_log_id ][ $denominator_event ][ $log_date ] ) ? intval( $stats['subjects_logs'][ $subject_log_id ][ $denominator_event ][ $log_date ] ) : 0;
[695] Fix | Delete
$analysis = $denominator === 0 ? 0 : floatval( number_format( ( $numerator / $denominator ) * 100, 2 ) );
[696] Fix | Delete
[697] Fix | Delete
if ( $analysis_formulas[ $analysis_type ]['inverse'] ) {
[698] Fix | Delete
$analysis = 100 - $analysis;
[699] Fix | Delete
}
[700] Fix | Delete
[701] Fix | Delete
$stats['subjects_analysis'][ $subject_log_id ][ $analysis_type ][ $log_date ] = $analysis;
[702] Fix | Delete
}
[703] Fix | Delete
}
[704] Fix | Delete
}
[705] Fix | Delete
[706] Fix | Delete
// Push total events data
[707] Fix | Delete
foreach ( $event_types as $event_type ) {
[708] Fix | Delete
$stats['events_totals'][ $event_type ] = array_sum( wp_list_pluck( $stats['subjects_totals'], $event_type ) );
[709] Fix | Delete
}
[710] Fix | Delete
[711] Fix | Delete
foreach ( $analysis_types as $analysis_type ) {
[712] Fix | Delete
$analysis_data = wp_list_pluck( $stats['subjects_totals'], $analysis_type );
[713] Fix | Delete
$analysis_count = count( $analysis_data );
[714] Fix | Delete
$stats['events_totals'][ $analysis_type ] = floatval( number_format( array_sum( $analysis_data ) / $analysis_count, 2 ) );
[715] Fix | Delete
}
[716] Fix | Delete
[717] Fix | Delete
// Rank by engagement
[718] Fix | Delete
$subjects_ranks = wp_list_pluck( $stats['subjects_totals'], $rank_metrics );
[719] Fix | Delete
$subjects_ranks_index = 0;
[720] Fix | Delete
[721] Fix | Delete
// Sort from high to low, mantain keys
[722] Fix | Delete
arsort( $subjects_ranks );
[723] Fix | Delete
[724] Fix | Delete
// Push color data
[725] Fix | Delete
foreach ( $subjects_ranks as $subject_rank_id => $subject_rank_value ) {
[726] Fix | Delete
$is_empty_rank_value = 0 === $subject_rank_value;
[727] Fix | Delete
$has_subject_rank_color = isset( $subject_rank_colors[ $subjects_ranks_index ] );
[728] Fix | Delete
[729] Fix | Delete
// If the rank value (derived from engagement) is empty, display default subject color
[730] Fix | Delete
if ( $is_empty_rank_value ) {
[731] Fix | Delete
$stats['subjects_totals'][ $subject_rank_id ]['color'] = '#F3CB57';
[732] Fix | Delete
} else {
[733] Fix | Delete
$stats['subjects_totals'][ $subject_rank_id ]['color'] = $has_subject_rank_color ? $subject_rank_colors[ $subjects_ranks_index ] : '#7E0000';
[734] Fix | Delete
}
[735] Fix | Delete
[736] Fix | Delete
$subjects_ranks_index++;
[737] Fix | Delete
}
[738] Fix | Delete
[739] Fix | Delete
// update cache
[740] Fix | Delete
set_transient( 'et_pb_ab_' . $post_id . '_stats_' . $duration, $stats, DAY_IN_SECONDS );
[741] Fix | Delete
} else {
[742] Fix | Delete
// remove the cache if no logs found
[743] Fix | Delete
delete_transient( 'et_pb_ab_' . $post_id . '_stats_' . $duration );
[744] Fix | Delete
return false;
[745] Fix | Delete
}
[746] Fix | Delete
[747] Fix | Delete
return $stats;
[748] Fix | Delete
}
[749] Fix | Delete
[750] Fix | Delete
/**
[751] Fix | Delete
* Outputs get data stats duration
[752] Fix | Delete
*
[753] Fix | Delete
* @return array of data
[754] Fix | Delete
*/
[755] Fix | Delete
function et_pb_ab_get_stats_data_duration() {
[756] Fix | Delete
return apply_filters( 'et_pb_ab_get_stats_data_duration', array(
[757] Fix | Delete
'day',
[758] Fix | Delete
'week',
[759] Fix | Delete
'month',
[760] Fix | Delete
'all',
[761] Fix | Delete
) );
[762] Fix | Delete
}
[763] Fix | Delete
[764] Fix | Delete
/**
[765] Fix | Delete
* Get list of AB Testing event type
[766] Fix | Delete
*
[767] Fix | Delete
* @return array of event types
[768] Fix | Delete
*/
[769] Fix | Delete
function et_pb_ab_get_event_types() {
[770] Fix | Delete
return apply_filters( 'et_pb_ab_get_event_types', array(
[771] Fix | Delete
'view_page',
[772] Fix | Delete
'read_page',
[773] Fix | Delete
'view_goal',
[774] Fix | Delete
'read_goal',
[775] Fix | Delete
'click_goal',
[776] Fix | Delete
'con_goal',
[777] Fix | Delete
'con_short',
[778] Fix | Delete
) );
[779] Fix | Delete
}
[780] Fix | Delete
[781] Fix | Delete
/**
[782] Fix | Delete
* Get min and max timestamp from returned MySQL query
[783] Fix | Delete
*
[784] Fix | Delete
* @param array MySQL returned value. Expected to be array( array ( 'date' => 'YYYY-MM-DD' ) ) format
[785] Fix | Delete
* @param string day|week
[786] Fix | Delete
* @return array using min and max key
[787] Fix | Delete
*/
[788] Fix | Delete
function et_pb_ab_get_min_max_timestamp( $query_result, $interval = 'day' ) {
[789] Fix | Delete
$output = array(
[790] Fix | Delete
'min' => false,
[791] Fix | Delete
'max' => false,
[792] Fix | Delete
);
[793] Fix | Delete
[794] Fix | Delete
// Get all available dates from logs
[795] Fix | Delete
$dates = array_unique( wp_list_pluck( $query_result, 'date' ) );
[796] Fix | Delete
[797] Fix | Delete
// Sort low-to-high and reset array keys
[798] Fix | Delete
sort( $dates );
[799] Fix | Delete
[800] Fix | Delete
// Get min and max dates from logs
[801] Fix | Delete
$min_date = $dates[0];
[802] Fix | Delete
$max_date = $dates[ ( count( $dates ) - 1 ) ];
[803] Fix | Delete
[804] Fix | Delete
switch ( $interval ) {
[805] Fix | Delete
case 'week':
[806] Fix | Delete
$output['min'] = strtotime( substr( $min_date, 0, 4 ) . 'W' . substr( $min_date, 4, 2 ) );
[807] Fix | Delete
$output['max'] = strtotime( substr( $max_date, 0, 4 ) . 'W' . substr( $max_date, 4, 2 ) );
[808] Fix | Delete
break;
[809] Fix | Delete
[810] Fix | Delete
default:
[811] Fix | Delete
$output['min'] = strtotime( $min_date );
[812] Fix | Delete
$output['max'] = strtotime( $max_date );
[813] Fix | Delete
break;
[814] Fix | Delete
}
[815] Fix | Delete
[816] Fix | Delete
return $output;
[817] Fix | Delete
}
[818] Fix | Delete
[819] Fix | Delete
/**
[820] Fix | Delete
* Get all days between min and max dates from logs
[821] Fix | Delete
*
[822] Fix | Delete
* @param int start date timestamp
[823] Fix | Delete
* @param int end date timestamp
[824] Fix | Delete
* @param string day|week interval of rage
[825] Fix | Delete
* @return array of dates
[826] Fix | Delete
*/
[827] Fix | Delete
function et_pb_ab_get_date_range( $min_date_timestamp, $max_date_timestamp, $interval = 'day' ) {
[828] Fix | Delete
$day_timestamp = $min_date_timestamp;
[829] Fix | Delete
$full_dates = array();
[830] Fix | Delete
[831] Fix | Delete
switch ( $interval ) {
[832] Fix | Delete
case 'week':
[833] Fix | Delete
$date_format = 'YW';
[834] Fix | Delete
$time_interval = '+1 week';
[835] Fix | Delete
break;
[836] Fix | Delete
[837] Fix | Delete
case 'hour':
[838] Fix | Delete
$date_format = 'Y-m-d H:i';
[839] Fix | Delete
$time_interval = '+1 hour';
[840] Fix | Delete
break;
[841] Fix | Delete
[842] Fix | Delete
default:
[843] Fix | Delete
$date_format = 'Y-m-d';
[844] Fix | Delete
$time_interval = '+1 day';
[845] Fix | Delete
break;
[846] Fix | Delete
}
[847] Fix | Delete
[848] Fix | Delete
while ( $day_timestamp <= $max_date_timestamp ) {
[849] Fix | Delete
$full_dates[] = date( $date_format, $day_timestamp );
[850] Fix | Delete
$day_timestamp = strtotime( $time_interval, $day_timestamp );
[851] Fix | Delete
}
[852] Fix | Delete
[853] Fix | Delete
return $full_dates;
[854] Fix | Delete
}
[855] Fix | Delete
[856] Fix | Delete
/**
[857] Fix | Delete
* Get list of Split analysis types
[858] Fix | Delete
*
[859] Fix | Delete
* @return array analysis types
[860] Fix | Delete
*/
[861] Fix | Delete
function et_pb_ab_get_analysis_types() {
[862] Fix | Delete
return apply_filters( 'et_pb_ab_get_analysis_types', array(
[863] Fix | Delete
'clicks',
[864] Fix | Delete
'reads',
[865] Fix | Delete
'bounces',
[866] Fix | Delete
'engagements',
[867] Fix | Delete
'conversions',
[868] Fix | Delete
'shortcode_conversions',
[869] Fix | Delete
) );
[870] Fix | Delete
}
[871] Fix | Delete
[872] Fix | Delete
/**
[873] Fix | Delete
* Get numerator and denominator of various stats types
[874] Fix | Delete
*
[875] Fix | Delete
* @return array stats' data type formula
[876] Fix | Delete
*/
[877] Fix | Delete
function et_pb_ab_get_analysis_formulas() {
[878] Fix | Delete
return apply_filters( 'et_pb_ab_get_analysis_formulas', array(
[879] Fix | Delete
'clicks' => array(
[880] Fix | Delete
'numerator' => 'click_goal',
[881] Fix | Delete
'denominator' => 'view_page',
[882] Fix | Delete
'inverse' => false,
[883] Fix | Delete
),
[884] Fix | Delete
'reads' => array(
[885] Fix | Delete
'numerator' => 'read_goal',
[886] Fix | Delete
'denominator' => 'view_page',
[887] Fix | Delete
'inverse' => false,
[888] Fix | Delete
),
[889] Fix | Delete
'bounces' => array(
[890] Fix | Delete
'numerator' => 'read_page',
[891] Fix | Delete
'denominator' => 'view_page',
[892] Fix | Delete
'inverse' => true,
[893] Fix | Delete
),
[894] Fix | Delete
'engagements' => array(
[895] Fix | Delete
'numerator' => 'read_goal',
[896] Fix | Delete
'denominator' => 'view_goal',
[897] Fix | Delete
'inverse' => false,
[898] Fix | Delete
),
[899] Fix | Delete
'conversions' => array(
[900] Fix | Delete
'numerator' => 'con_goal',
[901] Fix | Delete
'denominator' => 'view_page',
[902] Fix | Delete
'inverse' => false,
[903] Fix | Delete
),
[904] Fix | Delete
'shortcode_conversions' => array(
[905] Fix | Delete
'numerator' => 'con_short',
[906] Fix | Delete
'denominator' => 'view_page',
[907] Fix | Delete
'inverse' => false,
[908] Fix | Delete
),
[909] Fix | Delete
) );
[910] Fix | Delete
}
[911] Fix | Delete
[912] Fix | Delete
/**
[913] Fix | Delete
* List modules' slug which has conversions support
[914] Fix | Delete
*
[915] Fix | Delete
* @return array slugs of modules which have conversions support
[916] Fix | Delete
*/
[917] Fix | Delete
function et_pb_ab_get_modules_have_conversions() {
[918] Fix | Delete
return apply_filters( 'et_pb_ab_get_modules_have_conversions', array(
[919] Fix | Delete
'et_pb_shop',
[920] Fix | Delete
'et_pb_contact_form',
[921] Fix | Delete
'et_pb_signup',
[922] Fix | Delete
'et_pb_comments',
[923] Fix | Delete
) );
[924] Fix | Delete
}
[925] Fix | Delete
[926] Fix | Delete
/**
[927] Fix | Delete
* Check whether AB Testing active on current page
[928] Fix | Delete
*
[929] Fix | Delete
* @since 4.0 Added the $post_id parameter.
[930] Fix | Delete
*
[931] Fix | Delete
* @param integer $post_id
[932] Fix | Delete
*
[933] Fix | Delete
* @return bool
[934] Fix | Delete
*/
[935] Fix | Delete
function et_is_ab_testing_active( $post_id = 0 ) {
[936] Fix | Delete
$post_id = $post_id > 0 ? $post_id : get_the_ID();
[937] Fix | Delete
$post_id = apply_filters( 'et_is_ab_testing_active_post_id', $post_id );
[938] Fix | Delete
[939] Fix | Delete
$ab_testing_status = 'on' === get_post_meta( $post_id, '_et_pb_use_ab_testing', true );
[940] Fix | Delete
[941] Fix | Delete
$fb_enabled = function_exists( 'et_fb_enabled' ) ? et_fb_enabled() : false;
[942] Fix | Delete
[943] Fix | Delete
if ( ! $ab_testing_status && $fb_enabled && 'publish' !== get_post_status() ) {
[944] Fix | Delete
$ab_testing_status = 'on' === get_post_meta( $post_id, '_et_pb_use_ab_testing_draft', true );
[945] Fix | Delete
}
[946] Fix | Delete
[947] Fix | Delete
return $ab_testing_status;
[948] Fix | Delete
}
[949] Fix | Delete
[950] Fix | Delete
/**
[951] Fix | Delete
* Check whether AB Testing has report
[952] Fix | Delete
*
[953] Fix | Delete
* @return bool
[954] Fix | Delete
*/
[955] Fix | Delete
function et_pb_ab_has_report( $post_id ) {
[956] Fix | Delete
global $wpdb;
[957] Fix | Delete
[958] Fix | Delete
if ( ! et_is_ab_testing_active() ) {
[959] Fix | Delete
return false;
[960] Fix | Delete
}
[961] Fix | Delete
[962] Fix | Delete
$wpdb->et_divi_ab_testing_stats = $wpdb->prefix . 'et_divi_ab_testing_stats';
[963] Fix | Delete
[964] Fix | Delete
$result = $wpdb->get_row( $wpdb->prepare(
[965] Fix | Delete
"SELECT * FROM `{$wpdb->et_divi_ab_testing_stats}` WHERE test_id = %d",
[966] Fix | Delete
$post_id
[967] Fix | Delete
) ) ? true : false;
[968] Fix | Delete
[969] Fix | Delete
unset( $wpdb->et_divi_ab_testing_stats );
[970] Fix | Delete
[971] Fix | Delete
return apply_filters( 'et_pb_ab_has_report', $result, $post_id );
[972] Fix | Delete
}
[973] Fix | Delete
[974] Fix | Delete
/**
[975] Fix | Delete
* Check the status of the ab db version
[976] Fix | Delete
* @return bool
[977] Fix | Delete
*/
[978] Fix | Delete
function et_pb_db_status_up_to_date() {
[979] Fix | Delete
return ( $ab_db_settings = get_option( 'et_pb_ab_test_settings' ) ) && version_compare( $ab_db_settings['db_version'], ET_PB_AB_DB_VERSION, '>=' );
[980] Fix | Delete
}
[981] Fix | Delete
[982] Fix | Delete
/**
[983] Fix | Delete
* Create AB Testing table needed for AB Testing feature
[984] Fix | Delete
*
[985] Fix | Delete
* @return void
[986] Fix | Delete
*/
[987] Fix | Delete
function et_pb_create_ab_tables() {
[988] Fix | Delete
if ( isset( $_POST['et_pb_ab_nonce'] ) && ! wp_verify_nonce( $_POST['et_pb_ab_nonce'], 'ab_testing_builder_nonce' ) ) {
[989] Fix | Delete
die( -1 );
[990] Fix | Delete
}
[991] Fix | Delete
[992] Fix | Delete
// Verify user permission
[993] Fix | Delete
if ( ! current_user_can( 'edit_posts' ) || ! et_pb_is_allowed( 'ab_testing' ) ) {
[994] Fix | Delete
die( -1 );
[995] Fix | Delete
}
[996] Fix | Delete
[997] Fix | Delete
// Verify update is needed
[998] Fix | Delete
if ( et_pb_db_status_up_to_date() ) {
[999] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function