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/wp-conte.../plugins/advanced.../classes
File: ad_placements.php
}
[500] Fix | Delete
[501] Fix | Delete
/**
[502] Fix | Delete
* Get the placements that includes the ad or group.
[503] Fix | Delete
*
[504] Fix | Delete
* @param string $type 'ad' or 'group'.
[505] Fix | Delete
* @param int $id Id.
[506] Fix | Delete
*
[507] Fix | Delete
* @return array
[508] Fix | Delete
*/
[509] Fix | Delete
public static function get_placements_by( $type, $id ) {
[510] Fix | Delete
$result = [];
[511] Fix | Delete
[512] Fix | Delete
$placements = Advanced_Ads::get_ad_placements_array();
[513] Fix | Delete
foreach ( $placements as $_id => $_placement ) {
[514] Fix | Delete
if ( isset( $_placement['item'] ) && $_placement['item'] === $type . '_' . $id ) {
[515] Fix | Delete
$result[ $_id ] = $_placement;
[516] Fix | Delete
}
[517] Fix | Delete
}
[518] Fix | Delete
[519] Fix | Delete
return $result;
[520] Fix | Delete
}
[521] Fix | Delete
[522] Fix | Delete
/**
[523] Fix | Delete
* Get the markup for the group/ad selection for each placement.
[524] Fix | Delete
*
[525] Fix | Delete
* @param string $slug Slug for current placement. This is passed to the view.
[526] Fix | Delete
* @param array $placement The current placement.
[527] Fix | Delete
*
[528] Fix | Delete
* @return string
[529] Fix | Delete
*/
[530] Fix | Delete
public static function get_items_for_placement_markup( $slug, $placement ) {
[531] Fix | Delete
$placement['item'] = $placement['item'] ?? '';
[532] Fix | Delete
// Get the currently selected item.
[533] Fix | Delete
$placement_item_array = explode( '_', $placement['item'] );
[534] Fix | Delete
$placement_item_type = $placement_item_array[0];
[535] Fix | Delete
$placement_item_id = (int) ( $placement_item_array[1] ?? 0 );
[536] Fix | Delete
[537] Fix | Delete
$items = self::get_items_for_placement( $placement['type'], $placement['item'] );
[538] Fix | Delete
[539] Fix | Delete
// check for missing items
[540] Fix | Delete
if ( $placement_item_type && ! array_key_exists( $placement['item'], $items[ $placement_item_type . 's' ]['items'] ) ) {
[541] Fix | Delete
$method = $placement_item_type === 'group' ? 'get_ad_groups' : 'get_ads';
[542] Fix | Delete
$item = \Advanced_Ads::get_instance()->get_model()->{$method}( [ 'include' => $placement_item_id ] )[0] ?? null;
[543] Fix | Delete
[544] Fix | Delete
$items[ $placement_item_type . 's' ]['items'][ $placement['item'] ] = [
[545] Fix | Delete
'selected' => true,
[546] Fix | Delete
'disabled' => true,
[547] Fix | Delete
];
[548] Fix | Delete
[549] Fix | Delete
if ( $item instanceof WP_Post ) {
[550] Fix | Delete
$items[ $placement_item_type . 's' ]['items'][ $placement['item'] ]['name'] = $item->post_title;
[551] Fix | Delete
} elseif ( $item instanceof Advanced_Ads_Group ) {
[552] Fix | Delete
$items[ $placement_item_type . 's' ]['items'][ $placement['item'] ]['name'] = $item->name;
[553] Fix | Delete
} else {
[554] Fix | Delete
unset( $items[ $placement_item_type . 's' ]['items'][ $placement['item'] ] );
[555] Fix | Delete
}
[556] Fix | Delete
[557] Fix | Delete
if ( isset( $items[ $placement_item_type . 's' ]['items'][ $placement['item'] ] ) ) {
[558] Fix | Delete
$items = array_map( static function( $items_group ) {
[559] Fix | Delete
$keys = array_column( $items_group['items'], 'name' );
[560] Fix | Delete
array_multisort( $keys, SORT_ASC, SORT_NATURAL, $items_group['items'] );
[561] Fix | Delete
[562] Fix | Delete
return $items_group;
[563] Fix | Delete
}, $items );
[564] Fix | Delete
}
[565] Fix | Delete
}
[566] Fix | Delete
[567] Fix | Delete
$items = array_filter( $items, static function( $items_group ) {
[568] Fix | Delete
return ! empty( $items_group['items'] );
[569] Fix | Delete
} );
[570] Fix | Delete
[571] Fix | Delete
ob_start();
[572] Fix | Delete
[573] Fix | Delete
include ADVADS_ABSPATH . 'admin/views/placements-item.php';
[574] Fix | Delete
[575] Fix | Delete
return ob_get_clean();
[576] Fix | Delete
}
[577] Fix | Delete
[578] Fix | Delete
/**
[579] Fix | Delete
* Get the available items for the selected placement.
[580] Fix | Delete
*
[581] Fix | Delete
* @param string $type The current placement type.
[582] Fix | Delete
* @param string $item The ad/group id.
[583] Fix | Delete
*
[584] Fix | Delete
* @return array[]
[585] Fix | Delete
*/
[586] Fix | Delete
public static function get_items_for_placement( string $type, string $item = 'ad_0' ) : iterable {
[587] Fix | Delete
$placement_type = self::get_placement_types()[ $type ];
[588] Fix | Delete
$items = [
[589] Fix | Delete
'groups' => [
[590] Fix | Delete
'label' => __( 'Ad Groups', 'advanced-ads' ),
[591] Fix | Delete
'items' => $placement_type->get_allowed_groups(),
[592] Fix | Delete
],
[593] Fix | Delete
'ads' => [
[594] Fix | Delete
'label' => __( 'Ads', 'advanced-ads' ),
[595] Fix | Delete
'items' => $placement_type->get_allowed_ads(),
[596] Fix | Delete
],
[597] Fix | Delete
];
[598] Fix | Delete
[599] Fix | Delete
return array_map( static function( $items_group ) use ( $item ) {
[600] Fix | Delete
array_walk( $items_group['items'], static function( &$value, $key ) use ( $item ) {
[601] Fix | Delete
$value = [
[602] Fix | Delete
'name' => $value,
[603] Fix | Delete
'selected' => $key === $item,
[604] Fix | Delete
'disabled' => false,
[605] Fix | Delete
];
[606] Fix | Delete
} );
[607] Fix | Delete
[608] Fix | Delete
return $items_group;
[609] Fix | Delete
}, $items );
[610] Fix | Delete
}
[611] Fix | Delete
[612] Fix | Delete
/**
[613] Fix | Delete
* Get paths of ancestors that should not contain ads.
[614] Fix | Delete
*
[615] Fix | Delete
* @param object $xpath DOMXPath object.
[616] Fix | Delete
*
[617] Fix | Delete
* @return array Paths of ancestors.
[618] Fix | Delete
*/
[619] Fix | Delete
private static function get_ancestors_to_limit( $xpath ) {
[620] Fix | Delete
$query = self::get_ancestors_to_limit_query();
[621] Fix | Delete
if ( ! $query ) {
[622] Fix | Delete
return [];
[623] Fix | Delete
}
[624] Fix | Delete
[625] Fix | Delete
$node_list = $xpath->query( $query );
[626] Fix | Delete
$ancestors_to_limit = [];
[627] Fix | Delete
[628] Fix | Delete
foreach ( $node_list as $a ) {
[629] Fix | Delete
$ancestors_to_limit[] = $a->getNodePath();
[630] Fix | Delete
}
[631] Fix | Delete
[632] Fix | Delete
return $ancestors_to_limit;
[633] Fix | Delete
}
[634] Fix | Delete
[635] Fix | Delete
[636] Fix | Delete
/**
[637] Fix | Delete
* Remove paragraphs that has ancestors that should not contain ads.
[638] Fix | Delete
*
[639] Fix | Delete
* @param array $paragraphs An array of `DOMNode` objects to insert ads before or after.
[640] Fix | Delete
* @param array $ancestors_to_limit Paths of ancestor that should not contain ads.
[641] Fix | Delete
*
[642] Fix | Delete
* @return array $new_paragraphs An array of `DOMNode` objects to insert ads before or after.
[643] Fix | Delete
*/
[644] Fix | Delete
private static function filter_by_ancestors_to_limit( $paragraphs, $ancestors_to_limit ) {
[645] Fix | Delete
$new_paragraphs = [];
[646] Fix | Delete
[647] Fix | Delete
foreach ( $paragraphs as $k => $paragraph ) {
[648] Fix | Delete
foreach ( $ancestors_to_limit as $a ) {
[649] Fix | Delete
if ( 0 === stripos( $paragraph->getNodePath(), $a ) ) {
[650] Fix | Delete
continue 2;
[651] Fix | Delete
}
[652] Fix | Delete
}
[653] Fix | Delete
[654] Fix | Delete
$new_paragraphs[] = $paragraph;
[655] Fix | Delete
}
[656] Fix | Delete
[657] Fix | Delete
return $new_paragraphs;
[658] Fix | Delete
}
[659] Fix | Delete
[660] Fix | Delete
/**
[661] Fix | Delete
* Get query to select ancestors that should not contain ads.
[662] Fix | Delete
*
[663] Fix | Delete
* @return string/false DOMXPath query or false.
[664] Fix | Delete
*/
[665] Fix | Delete
private static function get_ancestors_to_limit_query() {
[666] Fix | Delete
/**
[667] Fix | Delete
* TODO:
[668] Fix | Delete
* - support `%` (rand) at the start
[669] Fix | Delete
* - support plain text that node should contain instead of CSS selectors
[670] Fix | Delete
* - support `prev` and `next` as `type`
[671] Fix | Delete
*/
[672] Fix | Delete
[673] Fix | Delete
/**
[674] Fix | Delete
* Filter the nodes that limit injection.
[675] Fix | Delete
*
[676] Fix | Delete
* @param array An array of arrays, each of which contains:
[677] Fix | Delete
*
[678] Fix | Delete
* @type string $type Accept: `ancestor` - limit injection inside the ancestor.
[679] Fix | Delete
* @type string $node A "class selector" which targets one class (.) or "id selector" which targets one id (#),
[680] Fix | Delete
* optionally with `%` at the end.
[681] Fix | Delete
*/
[682] Fix | Delete
$items = apply_filters(
[683] Fix | Delete
'advanced-ads-content-injection-nodes-without-ads',
[684] Fix | Delete
[
[685] Fix | Delete
[
[686] Fix | Delete
// a class anyone can use to prevent automatic ad injection into a specific element.
[687] Fix | Delete
'node' => '.advads-stop-injection',
[688] Fix | Delete
'type' => 'ancestor',
[689] Fix | Delete
],
[690] Fix | Delete
[
[691] Fix | Delete
// Product Slider for Beaver Builder by WooPack.
[692] Fix | Delete
'node' => '.woopack-product-carousel',
[693] Fix | Delete
'type' => 'ancestor',
[694] Fix | Delete
],
[695] Fix | Delete
[
[696] Fix | Delete
// WP Author Box Lite.
[697] Fix | Delete
'node' => '#wpautbox-%',
[698] Fix | Delete
'type' => 'ancestor',
[699] Fix | Delete
],
[700] Fix | Delete
[
[701] Fix | Delete
// GeoDirectory Post Slider.
[702] Fix | Delete
'node' => '.geodir-post-slider',
[703] Fix | Delete
'type' => 'ancestor',
[704] Fix | Delete
],
[705] Fix | Delete
]
[706] Fix | Delete
);
[707] Fix | Delete
[708] Fix | Delete
$query = [];
[709] Fix | Delete
foreach ( $items as $p ) {
[710] Fix | Delete
$sel = $p['node'];
[711] Fix | Delete
[712] Fix | Delete
$sel_type = substr( $sel, 0, 1 );
[713] Fix | Delete
$sel = substr( $sel, 1 );
[714] Fix | Delete
[715] Fix | Delete
$rand_pos = strpos( $sel, '%' );
[716] Fix | Delete
$sel = str_replace( '%', '', $sel );
[717] Fix | Delete
$sel = sanitize_html_class( $sel );
[718] Fix | Delete
[719] Fix | Delete
if ( '.' === $sel_type ) {
[720] Fix | Delete
if ( false !== $rand_pos ) {
[721] Fix | Delete
$query[] = "@class and contains(concat(' ', normalize-space(@class), ' '), ' $sel')";
[722] Fix | Delete
} else {
[723] Fix | Delete
$query[] = "@class and contains(concat(' ', normalize-space(@class), ' '), ' $sel ')";
[724] Fix | Delete
}
[725] Fix | Delete
}
[726] Fix | Delete
if ( '#' === $sel_type ) {
[727] Fix | Delete
if ( false !== $rand_pos ) {
[728] Fix | Delete
$query[] = "@id and starts-with(@id, '$sel')";
[729] Fix | Delete
} else {
[730] Fix | Delete
$query[] = "@id and @id = '$sel'";
[731] Fix | Delete
}
[732] Fix | Delete
}
[733] Fix | Delete
}
[734] Fix | Delete
[735] Fix | Delete
if ( ! $query ) {
[736] Fix | Delete
return false;
[737] Fix | Delete
}
[738] Fix | Delete
[739] Fix | Delete
return '//*[' . implode( ' or ', $query ) . ']';
[740] Fix | Delete
}
[741] Fix | Delete
[742] Fix | Delete
/**
[743] Fix | Delete
* Sort placements
[744] Fix | Delete
*
[745] Fix | Delete
* @param array $placements Existing placements.
[746] Fix | Delete
* @param string $orderby The field to order by. Accept `name` or `type`.
[747] Fix | Delete
* @return array $placements Sorted placements.
[748] Fix | Delete
*/
[749] Fix | Delete
public static function sort( $placements, $orderby = 'name' ) {
[750] Fix | Delete
if ( ! is_array( $placements ) ) {
[751] Fix | Delete
return [];
[752] Fix | Delete
}
[753] Fix | Delete
if ( 'name' === $orderby ) {
[754] Fix | Delete
ksort( $placements, SORT_NATURAL );
[755] Fix | Delete
return $placements;
[756] Fix | Delete
}
[757] Fix | Delete
uasort( $placements, [ 'Advanced_Ads_Placements', 'sort_by_type_callback' ] );
[758] Fix | Delete
return $placements;
[759] Fix | Delete
[760] Fix | Delete
}
[761] Fix | Delete
[762] Fix | Delete
/**
[763] Fix | Delete
* Callback to sort placements by type.
[764] Fix | Delete
*
[765] Fix | Delete
* @param array $f First placement.
[766] Fix | Delete
* @param array $s Second placement.
[767] Fix | Delete
* @return int 0 If placements are equal, -1 if the first should come first, 1 otherwise.
[768] Fix | Delete
*/
[769] Fix | Delete
private static function sort_by_type_callback( $f, $s ) {
[770] Fix | Delete
// A placement with the "Words Between Ads" option set to non-zero gets injected after others
[771] Fix | Delete
// because it reads existing ads.
[772] Fix | Delete
if ( ! empty( $f['options']['words_between_repeats'] ) xor ! empty( $s['options']['words_between_repeats'] ) ) {
[773] Fix | Delete
return ! empty( $f['options']['words_between_repeats'] ) ? 1 : -1;
[774] Fix | Delete
}
[775] Fix | Delete
[776] Fix | Delete
$types = self::get_placement_types();
[777] Fix | Delete
[778] Fix | Delete
$f_o = ( isset( $f['type'] ) && isset( $types[ $f['type'] ]['order'] ) ) ? $types[ $f['type'] ]['order'] : 100;
[779] Fix | Delete
$s_o = ( isset( $s['type'] ) && isset( $types[ $s['type'] ]['order'] ) ) ? $types[ $s['type'] ]['order'] : 100;
[780] Fix | Delete
[781] Fix | Delete
if ( $f_o === $s_o ) {
[782] Fix | Delete
// Sort by index.
[783] Fix | Delete
if ( 'post_content' === $f['type'] && isset( $f['options']['index'] ) && isset( $s['options']['index'] )
[784] Fix | Delete
&& $f['options']['index'] !== $s['options']['index'] ) {
[785] Fix | Delete
return ( $f['options']['index'] < $s['options']['index'] ) ? -1 : 1;
[786] Fix | Delete
}
[787] Fix | Delete
[788] Fix | Delete
// Sort by name.
[789] Fix | Delete
if ( isset( $f['name'] ) && isset( $s['name'] ) ) {
[790] Fix | Delete
return 0 > strnatcmp( $f['name'], $s['name'] ) ? -1 : 1;
[791] Fix | Delete
}
[792] Fix | Delete
return 0;
[793] Fix | Delete
}
[794] Fix | Delete
[795] Fix | Delete
// Sort by order.
[796] Fix | Delete
return ( $f_o < $s_o ) ? -1 : 1;
[797] Fix | Delete
[798] Fix | Delete
}
[799] Fix | Delete
[800] Fix | Delete
[801] Fix | Delete
}
[802] Fix | Delete
[803] Fix | Delete
12
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function