taxonomy = Advanced_Ads::AD_GROUP_TAXONOMY; $this->post_type = Advanced_Ads::POST_TYPE_SLUG; $this->load_groups(); $this->types = $this->get_ad_group_types(); } /** * load ad groups */ public function load_groups(){ // load all groups $search = ! empty($_REQUEST['s']) ? trim( wp_unslash( $_REQUEST['s'] ) ) : ''; $args = array( 'taxonomy' => $this->taxonomy, 'search' => $search, 'hide_empty' => 0, ); // get wp term objects $terms = Advanced_Ads::get_ad_groups( $args ); // add meta data to groups $this->groups = $this->load_groups_objects_from_terms( $terms ); } /** * load ad groups objects from wp term objects * * @param arr $terms array of wp term objects */ protected function load_groups_objects_from_terms(array $terms){ $groups = array(); foreach ( $terms as $_group ){ $groups[] = new Advanced_Ads_Group( $_group ); } return $groups; } /** * render group list header */ public function render_header(){ $file = ADVADS_BASE_PATH . 'admin/views/ad-group-list-header.php'; require_once($file); } /** * render list rows */ public function render_rows(){ foreach ( $this->groups as $_group ){ $this->render_row( $_group ); $this->render_form_row( $_group ); } } /** * render a single row * * @param obj $group the ad group object */ public function render_row( Advanced_Ads_Group $group ) { $file = ADVADS_BASE_PATH . 'admin/views/ad-group-list-row.php'; require($file); } /** * render the form row of a group * * @param obj $group the ad group object */ public function render_form_row(Advanced_Ads_Group $group){ // query ads $ads = $this->get_ads( $group ); $weights = $group->get_ad_weights(); $ad_form_rows = $weights; arsort( $ad_form_rows ); $max_weight = Advanced_Ads_Group::get_max_ad_weight( $ads->post_count ); // The Loop if ( $ads->post_count ) { foreach ( $ads->posts as $_ad ) { $row = ''; $ad_id = $_ad->ID; $row .= '' . $_ad->post_title . ''; $row .= ''; for ( $i = 0; $i <= $max_weight; $i++ ) { $new_ad_weights .= ''; } $new_ad_weights .= ''; require ADVADS_BASE_PATH . 'admin/views/ad-group-list-form-row.php'; } /** * render the ads list * * @param $obj $group group object */ public function render_ads_list(Advanced_Ads_Group $group){ $ads = $this->get_ads( $group ); $weights = $group->get_ad_weights(); $weight_sum = array_sum( $weights ); $ads_output = $weights; arsort( $ads_output ); // The Loop if ( $ads->have_posts() ) { echo ($group->type == 'default' && $weight_sum) ? '' : ''; if( $ads->post_count > 4 ){ $hidden_ads = $ads->post_count - 3; echo '

+ ' . sprintf(__( 'show %d more ads', 'advanced-ads' ), $hidden_ads ) . '

'; } if ( $group->ad_count === 'all' ) { echo '

' . __( 'all published ads are displayed', 'advanced-ads' ) . '

'; } elseif ( $group->ad_count > 1 ) { echo '

' . sprintf( __( 'up to %d ads displayed', 'advanced-ads' ), $group->ad_count ) . '

'; } } else { _e( 'No ads assigned', 'advanced-ads' ); ?>
+ $value ){ if ( is_int( $value ) ) { unset($ads_output[$key]); } } return $ads_output; } /** * get ads for this group * * @param obj $group group object * @return obj $ads WP_Query result with ads for this group */ public function get_ads($group){ $args = array( 'post_type' => $this->post_type, 'post_status' => array('publish', 'pending', 'future', 'private'), 'taxonomy' => $group->taxonomy, 'term' => $group->slug, 'posts_per_page' => -1 ); return $ads = new WP_Query( $args ); } /** * list of all ads to display in select dropdown * * @return array */ public function ads_for_select(){ $select = array(); $model = Advanced_Ads::get_instance()->get_model(); // load all ads $ads = $model->get_ads( array('orderby' => 'title', 'order' => 'ASC') ); foreach ( $ads as $_ad ){ $select[ $_ad->ID ] = esc_html( $_ad->post_title ); } return $select; } /** * return ad group types * * @return arr $types ad group information */ public function get_ad_group_types(){ $types = array( 'default' => array( 'title' => __( 'Random ads', 'advanced-ads' ), 'description' => __( 'Display random ads based on ad weight', 'advanced-ads' ) ), 'ordered' => array( 'title' => __( 'Ordered ads', 'advanced-ads' ), 'description' => __( 'Display ads with the highest ad weight first', 'advanced-ads' ), ) ); return apply_filters( 'advanced-ads-group-types', $types ); } /** * render ad group action links * * @param $obj $group group object */ public function render_action_links($group){ global $tax; $tax = get_taxonomy( $this->taxonomy ); $actions = array(); if ( current_user_can( $tax->cap->edit_terms ) ) { $actions['edit'] = '' . __( 'Edit', 'advanced-ads' ) . ''; $actions['usage'] = '' . __( 'Usage', 'advanced-ads' ) . ''; } if ( current_user_can( $tax->cap->delete_terms ) ){ $args = array( 'action' => 'delete', 'group_id' => $group->id ); $delete_link = self::group_page_url( $args ); $actions['delete'] = "id ) . "'>" . __( 'Delete', 'advanced-ads' ) . ''; } if ( ! count( $actions ) ) { return; } echo '
'; foreach ( $actions as $action => $link ) { echo "$link"; } echo '
'; } /** * create a new group * */ public function create_group(){ // check nonce if ( ! isset( $_POST['advads-group-add-nonce'] ) || ! wp_verify_nonce( $_POST['advads-group-add-nonce'], 'add-advads-groups' ) ){ return new WP_Error( 'invalid_ad_group', __( 'Invalid Ad Group', 'advanced-ads' ) ); } // check user rights if( ! current_user_can( Advanced_Ads_Plugin::user_cap( 'advanced_ads_edit_ads') ) ) { return new WP_Error( 'invalid_ad_group_rights', __( 'You don’t have permission to change the ad groups', 'advanced-ads' ) ); } if ( isset($_POST['advads-group-name']) && '' !== $_POST['advads-group-name'] ){ $title = sanitize_text_field( $_POST['advads-group-name'] ); $new_group = wp_create_term( $title, Advanced_Ads::AD_GROUP_TAXONOMY ); if( is_wp_error($new_group ) ){ return $new_group; } // save default values if( is_array( $new_group ) ){ $group = new Advanced_Ads_Group( $new_group['term_id'] ); // allow other add-ons to save their own group attributes $atts = apply_filters( 'advanced-ads-group-save-atts', array( 'type' => 'default', 'ad_count' => 1, 'options' => array(), ), $group); $group->save( $atts ); } // reload groups $this->load_groups(); } else { return new WP_Error( 'no_ad_group_created', __( 'No ad group created', 'advanced-ads' ) ); } return true; } private function get_groups_by_ad_id($ad_id){ $ids = array(); $terms = wp_get_object_terms($ad_id, $this->taxonomy); foreach ($terms as $term){ $ids[] = $term->term_id; } return $ids; } /** * bulk update groups * */ public function update_groups(){ // check nonce if ( ! isset( $_POST['advads-group-update-nonce'] ) || ! wp_verify_nonce( $_POST['advads-group-update-nonce'], 'update-advads-groups' ) ){ return new WP_Error( 'invalid_ad_group', __( 'Invalid Ad Group', 'advanced-ads' ) ); } // check user rights if( ! current_user_can( Advanced_Ads_Plugin::user_cap( 'advanced_ads_edit_ads') ) ) { return new WP_Error( 'invalid_ad_group_rights', __( 'You don’t have permission to change the ad groups', 'advanced-ads' ) ); } /** empty group settings * edit: emptying disabled, because when only a few groups are saved (e.g. when filtered by search), options are reset * todo: needs a solution that also removes options when the group is removed */ // empty weights // update_option( 'advads-ad-weights', array() ); $all_weights = get_option( 'advads-ad-weights', array() ); // ad_id => group_ids $ad_groups_assoc = array(); if ( isset( $_POST['advads-groups-removed-ads'] ) && is_array( $_POST['advads-groups-removed-ads'] ) && isset( $_POST['advads-groups-removed-ads-gid'])) { $len = count($_POST['advads-groups-removed-ads']); for ($i=0; $i<$len; $i++){ $ad_id = $_POST['advads-groups-removed-ads'][$i]; $group_id = $_POST['advads-groups-removed-ads-gid'][$i]; $ad_groups_assoc[ $ad_id ] = array(); // remove it from the weights if ( isset($all_weights[$group_id]) && isset($all_weights[$group_id][$ad_id])){ unset($all_weights[$group_id][$ad_id]); } // we need to load all the group ids, that are allocated to this ad and then remove the right one only. $group_ids = $this->get_groups_by_ad_id($ad_id); foreach ($group_ids as $gid){ if ($gid != $group_id){ $ad_groups_assoc[$ad_id][] = $gid; } } } } // iterate through groups if ( isset($_POST['advads-groups']) && count( $_POST['advads-groups'] ) ){ foreach ( $_POST['advads-groups'] as $_group_id => $_group ){ // save basic wp term wp_update_term( $_group_id, Advanced_Ads::AD_GROUP_TAXONOMY, $_group ); $group = new Advanced_Ads_Group( $_group['id'] ); if ( isset( $_group['ads'] ) && is_array( $_group['ads'] ) ) { foreach ( $_group['ads'] as $_ad_id => $_ad_weight ) { /** * check if this ad is representing the current group and remove it in this case * could cause an infinite loop otherwise * see also /classes/ad_type_group.php::remove_from_ad_group() */ $ad = new Advanced_Ads_Ad( $_ad_id ); // we will have to load all the groups allocated to this ad. if (! isset($ad_groups_assoc[$_ad_id])){ $ad_groups_assoc[$_ad_id] = $this->get_groups_by_ad_id($_ad_id); } if( isset( $ad->type ) && 'group' === $ad->type && isset( $ad->output['group_id'] ) && absint( $ad->output['group_id'] ) == $_group_id ){ unset( $_group['ads'][ $_ad_id ] ); } else { $ad_groups_assoc[ $_ad_id ][] = (int) $_group_id; } } // save ad weights $all_weights[$group->id] = $group->sanitize_ad_weights( $_group['ads'] ); //$group->save_ad_weights( $_group['ads'] ); } // save other attributes $type = isset($_group['type']) ? $_group['type'] : 'default'; $ad_count = isset($_group['ad_count']) ? $_group['ad_count'] : 1; $options = isset($_group['options']) ? $_group['options'] : array(); // allow other add-ons to save their own group attributes $atts = apply_filters( 'advanced-ads-group-save-atts', array( 'type' => $type, 'ad_count' => $ad_count, 'options' => $options, ), $_group); $group->save( $atts ); } foreach ( $ad_groups_assoc as $_ad_id => $group_ids ) { wp_set_object_terms( $_ad_id, $group_ids, $this->taxonomy); } } update_option( 'advads-ad-weights', $all_weights ); // reload groups $this->load_groups(); return true; } /** * returns a link to the ad group list page * * @since 1.0.0 * @param arr $args additional arguments, e.g. action or group_id * @return string admin url */ public static function group_page_url($args = array()) { $plugin = Advanced_Ads::get_instance(); $defaultargs = array( // 'post_type' => constant("Advanced_Ads::POST_TYPE_SLUG"), 'page' => 'advanced-ads-groups', ); $args = $args + $defaultargs; return add_query_arg( $args, admin_url( 'admin.php' ) ); } }