* @since 1.48.2
*/
namespace AdvancedAds\Admin;
use WP_Meta_Query;
use WP_Term_Query;
use AdvancedAds\Modal;
use WP_Terms_List_Table;
use AdvancedAds\Constants;
use AdvancedAds\Framework\Utilities\Params;
defined( 'ABSPATH' ) || exit;
/**
* Admin Groups List Table.
*/
class Groups_List_Table extends WP_Terms_List_Table {
/**
* Missing type error.
*
* @var string
*/
private $type_error = '';
/**
* Array with all ads.
*
* @var $all_ads
*/
private $all_ads = [];
/**
* Array of group ads info.
*
* @var array
*/
private $group_ads_info = [];
/**
* Hints html.
*
* @var string
*/
private $hints_html = null;
/**
* Construct the current list
*/
public function __construct() {
parent::__construct();
$this->prepare_items();
add_action( 'pre_get_terms', [ $this, 'sorting_query' ] );
add_filter( 'default_hidden_columns', [ $this, 'default_hidden_columns' ] );
}
/**
* Modify sorting query
*
* @param WP_Term_Query $query Query object.
*
* @return WP_Term_Query
*/
public function sorting_query( $query ) {
switch ( $query->query_vars['orderby'] ) {
case 'date':
// phpcs:ignore Generic.Formatting.MultipleStatementAlignment.NotSameWarning
$meta_query_args = [
'relation' => 'OR',
[
'key' => 'modified_date',
'compare' => 'EXISTS',
],
[
'key' => 'modified_date',
'compare' => 'NOT EXISTS',
],
]; // include all groups with and without a modified date so empty date groups are shown.
$meta_query = new WP_Meta_Query( $meta_query_args );
$query->meta_query = $meta_query;
$query->query_vars['orderby'] = 'meta_value';
break;
case 'details':
$query->query_vars['orderby'] = 'term_id';
break;
}
return $query;
}
/**
* Load groups
*
* @return void
*/
public function prepare_items(): void {
parent::prepare_items();
$args = $this->callback_args;
$args['taxonomy'] = $this->screen->taxonomy;
$args['hide_empty'] = 0;
$args['offset'] = ( $args['page'] - 1 ) * $args['number'];
// Save the values because 'number' and 'offset' can be subsequently overridden.
$this->callback_args = $args;
if ( is_taxonomy_hierarchical( $args['taxonomy'] ) && ! isset( $args['orderby'] ) ) {
// We'll need the full set of terms then.
$args['number'] = 0;
$args['offset'] = $args['number'];
}
$args = $this->query_filters( $args );
$this->items = get_terms( $args );
$this->set_pagination_args(
[
'total_items' => wp_count_terms(
[
'taxonomy' => $args['taxonomy'],
'search' => $args['search'],
]
),
'per_page' => $args['number'],
]
);
$this->all_ads = wp_advads_get_ads_dropdown();
$this->items = array_map(
function ( $term_id ) {
return wp_advads_get_group( $term_id );
},
$this->items ?? []
);
}
/**
* Gets the number of items to display on a single page.
*
* @param string $option User option name.
* @param int $default_value The number of items to display.
*
* @return int
*/
protected function get_items_per_page( $option, $default_value = 20 ): int {
return 10000;
}
/**
* Gets a list of CSS classes for the WP_List_Table table tag.
*
* @return array
*/
protected function get_table_classes(): array {
return array_merge( parent::get_table_classes(), [ 'advads-table' ] );
}
/**
* Renders filters
*
* @return void
*/
public function render_filters(): void {
include ADVADS_ABSPATH . 'views/admin/tables/groups/filters.php';
}
/**
* No groups found
*
* @return void
*/
public function no_items(): void {
esc_html_e( 'No Ad Group found', 'advanced-ads' );
}
/**
* Get columns
*
* @return array
*/
public function get_columns(): array {
return [
'type' => __( 'Type', 'advanced-ads' ),
'name' => _x( 'Name', 'term name', 'advanced-ads' ),
'details' => __( 'Details', 'advanced-ads' ),
'ads' => __( 'Ads', 'advanced-ads' ),
'date' => __( 'Date', 'advanced-ads' ),
];
}
/**
* Hidden columns
*
* @param string[] $hidden Column list.
*
* @return array
*/
public function default_hidden_columns( $hidden ): array {
$hidden[] = 'date';
return $hidden;
}
/**
* Sortable columns
*
* @return array
*/
public function get_sortable_columns(): array {
return [
'date' => 'date',
'name' => 'name',
'details' => 'details',
];
}
/**
* Displays the table.
*
* @return void
*/
public function display(): void {
$singular = $this->_args['singular'];
$this->screen->render_screen_reader_content( 'heading_list' );
?>
print_table_description(); ?>
print_column_headers(); ?>
>
display_rows_or_placeholder(); ?>
items ) || ! is_array( $this->items ) ) {
echo '| '; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
$this->no_items();
echo ' |
';
return;
}
foreach ( $this->items as $term ) {
$this->single_row( $term );
}
}
/**
* Render single row.
*
* @param Group $group Term object.
* @param int $level Depth level.
*
* @return void
*/
public function single_row( $group, $level = 0 ): void {
$this->type_error = '';
// Set the group to behave as default, if the original type is not available.
$group_type = $group->get_type_object();
if ( $group_type->is_premium() ) {
$this->type_error = sprintf(
/* translators: %s is the group type string */
__( 'The originally selected group type ā%sā is not enabled.', 'advanced-ads' ),
$group_type->get_title()
);
}
echo ''; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
$this->single_row_columns( $group );
echo '
';
}
/**
* Column type
*
* @param Group $group Group instance.
*
* @return void
*/
public function column_type( $group ): void {
include ADVADS_ABSPATH . 'views/admin/tables/groups/column-type.php';
}
/**
* Column name
*
* @param Group $group Group instance.
*
* @return void
*/
public function column_name( $group ): void {
$this->render_edit_modal( $group );
$this->render_usage_modal( $group );
include ADVADS_ABSPATH . 'views/admin/tables/groups/column-name.php';
}
/**
* Column details
*
* @param Group $group Group instance.
*
* @return void
*/
public function column_details( $group ): void {
include ADVADS_ABSPATH . 'views/admin/tables/groups/column-details.php';
}
/**
* Column ads
*
* @param Group $group Group instance.
*
* @return void
*/
public function column_ads( $group ): void {
$template = empty( $group->get_ad_weights() ) ? 'list-row-loop-none.php' : 'list-row-loop.php';
include ADVADS_ABSPATH . 'views/admin/tables/groups/' . $template;
}
/**
* Column date
*
* @param Group $group Group instance.
*
* @return void
*/
public function column_date( $group ) {
$publish_date = $group->get_publish_date();
$modified_date = $group->get_modified_date();
if ( ! $publish_date && ! $modified_date ) {
return;
}
$date_time_regex = get_option( 'date_format' ) . ' \\a\\t ' . get_option( 'time_format' );
$date_prefix = $publish_date === $modified_date ? __( 'Published', 'advanced-ads' ) : __( 'Last Modified', 'advanced-ads' );
$date_to_show = get_date_from_gmt( $publish_date === $modified_date ? $publish_date : $modified_date, $date_time_regex );
echo esc_html( $date_prefix ) . '
' . esc_html( $date_to_show );
}
/**
* Generates and displays row action links.
*
* @param Group $group Group instance.
* @param string $column_name Column name.
* @param string $primary Primary column name.
*
* @return string
*/
protected function handle_row_actions( $group, $column_name, $primary ): string {
global $tax;
if ( $primary !== $column_name ) {
return '';
}
$actions = [];
if ( ! $this->type_error && current_user_can( $tax->cap->edit_terms ) ) {
// edit group link.
$actions['edit'] = '' . esc_html__( 'Edit', 'advanced-ads' ) . '';
// duplicate group upgrade link.
if ( ! defined( 'AAP_VERSION' ) ) {
$actions['duplicate-group'] = ( new Upgrades() )->create_duplicate_link();
}
}
$actions['usage'] = '' . esc_html__( 'Show Usage', 'advanced-ads' ) . '';
if ( current_user_can( $tax->cap->delete_terms ) ) {
$args = [
'action' => 'group',
'action2' => 'delete',
'group_id' => $group->get_id(),
'page' => 'advanced-ads-groups',
];
$delete_link = add_query_arg( $args, admin_url( 'admin.php' ) );
$actions['delete'] = "get_id() ) . "'>" . __( 'Delete', 'advanced-ads' ) . '';
}
$actions = apply_filters( Constants::TAXONOMY_GROUP . '_row_actions', $actions, $group );
return $this->row_actions( $actions );
}
/**
* Render edit form modal
*
* @param Group $group Group instance.
*
* @return void
*/
private function render_edit_modal( $group ): void {
ob_start();
require ADVADS_ABSPATH . 'views/admin/tables/groups/edit-form-modal.php';
$modal_content = ob_get_clean();
Modal::create(
[
'modal_slug' => 'group-edit-' . $group->get_id(),
'modal_content' => $modal_content,
'modal_title' => sprintf( '%s %s', __( 'Edit', 'advanced-ads' ), $group->get_name() ),
]
);
}
/**
* Render usage form modal
*
* @param Group $group Group instance.
*
* @return void
*/
private function render_usage_modal( $group ): void {
ob_start();
include ADVADS_ABSPATH . 'views/admin/tables/groups/column-usage.php';
$modal_content = ob_get_clean();
Modal::create(
[
'modal_slug' => 'group-usage-' . $group->get_id(),
'modal_content' => $modal_content,
'modal_title' => __( 'Usage', 'advanced-ads' ),
'cancel_action' => false,
'close_action' => __( 'Close', 'advanced-ads' ),
]
);
}
/**
* Check filters before loading group.
*
* @param array $args The arguments array for the groups list table.
*
* @return array The modified arguments array with the added meta query.
*/
private function query_filters( $args ): array {
$group_type = Params::get( 'group_type' );
if ( $group_type ) {
$args['meta_query'] = [ // phpcs:ignore
[
'key' => '_advads_group_type',
'value' => $group_type,
'compare' => '=',
],
];
}
return $args;
}
}