register_type( Type_Grid::class ); } /** * Get ids from ads in the order they should be displayed * * @param array $ordered_ad_ids Ad ids in the order from the main plugin. * @param string $type Group type. * @param array $ads Array with ad objects. * @param array $weights Array with ad weights. * @param Group $group Group instance. * * @return array $ad_ids */ public function output_ad_ids( $ordered_ad_ids, $type, $ads, $weights, $group ) { // For some reason a client had an issue with $group not being the correct class. if ( ! is_a_group( $group ) ) { return $ordered_ad_ids; } if ( 'grid' === $type ) { if ( $group->get_prop( 'random' ) ) { return $group->shuffle_ads(); } else { return array_keys( $weights ); } } return $ordered_ad_ids; } /** * Adjust the ad group number if the ad type is a grid. * * @param int|string $ad_count The number of ads, is an integer or string 'all'. * @param Group $group Group instance. * * @return int|string The number of ads, either an integer or string 'all'. */ public function adjust_ad_group_number( $ad_count, $group ) { if ( $group->is_type( 'grid' ) ) { return $group->get_columns() * $group->get_rows(); } return $ad_count; } /** * Adjust ad count in group page for grid groups * * @param int $displayed_ad_count Displayed ad count from the base plugin. * @param Group $group Group instance. * * @return int */ public function adjust_ad_group_displayed_ad_count( $displayed_ad_count, $group ) { return $group->get_columns() * $group->get_rows(); } /** * Add extra output markup for grid * * @param array $ad_content Array with ad contents. * @param Group $group Group instance. * * @return array $ad_content with extra markup */ public function output_markup( array $ad_content, Group $group ) { if ( count( $ad_content ) <= 1 || ! $group->is_type( 'grid' ) ) { return $ad_content; } $i = 1; $markup = $this->get_grid_markup( $group ); foreach ( $ad_content as $_key => $_content ) { foreach ( $markup['each'] as $_column_index => $_format ) { if ( 'all' === $_column_index || 0 === $i % $_column_index ) { $ad_content[ $_key ] = sprintf( $_format, $_content ); break; } } ++$i; } array_unshift( $ad_content, $markup['before'] ); array_push( $ad_content, $markup['after'] ); return $ad_content; } /** * Add grid markup to passive cache-busting. * * @param array $group_data Group data. * @param Group $group Group instance. * @param string $element_id Element ID. */ public function add_grid_markup_passive( $group_data, Group $group, $element_id ) { if ( $element_id && $group->is_type( 'grid' ) ) { $group_data['random'] = $group->get_prop( 'grid.random' ); $group_data['group_wrap'][] = $this->get_grid_markup( $group ); } return $group_data; } /** * Get markup to inject around each ad and around entire set of ads. * * @param Group $group Group instance. * * @return array */ public function get_grid_markup( Group $group ) { $columns = $group->get_columns(); $prefix = wp_advads()->get_frontend_prefix(); $grid_id = $prefix . 'grid-' . $group->get_id(); $min_width = $group->get_prop( 'min_width' ); $full_width_breakpoint = absint( $group->get_prop( 'full_width_breakpoint' ) ) ?? false; $inner_margin = absint( $group->get_prop( 'inner_margin' ) ); $width = absint( ( 100 - ( $columns - 1 ) * $inner_margin ) / $columns ); // Generate styles. $css = "'; return [ 'before' => '' . $css, 'each' => [ $columns => '
  • %s
  • ', 'all' => '
  • %s
  • ', ], 'min_ads' => 2, ]; } }