__('Product', 'wp-ultimo'), // singular name of the listed records
'plural' => __('Products', 'wp-ultimo'), // plural name of the listed records
'ajax' => true, // does this table support ajax?
'add_new' => [
'url' => wu_network_admin_url('wp-ultimo-edit-product'),
'classes' => '',
],
]
);
}
/**
* Displays the content of the product column.
*
* @since 2.0.0
*
* @param WP_Ultimo\Models\Product $item Product object.
* @return string
*/
public function column_name($item) {
$url_atts = [
'id' => $item->get_id(),
'model' => 'product',
];
$title = sprintf('%s', wu_network_admin_url('wp-ultimo-edit-product', $url_atts), $item->get_name());
// Concatenate the two blocks
$title = "$title";
$actions = [
'edit' => sprintf('%s', wu_network_admin_url('wp-ultimo-edit-product', $url_atts), __('Edit', 'wp-ultimo')),
'duplicate' => sprintf(
'%s',
wu_network_admin_url(
'wp-ultimo-products',
[
'action' => 'duplicate',
'id' => $item->get_id(),
]
),
__('Duplicate', 'wp-ultimo')
),
'delete' => sprintf('%s', __('Delete', 'wp-ultimo'), wu_get_form_url('delete_modal', $url_atts), __('Delete', 'wp-ultimo')),
];
return $title . $this->row_actions($actions);
}
/**
* Displays the type of the product.
*
* @since 2.0.0
*
* @param WP_Ultimo\Models\Product $item Product object.
* @return string
*/
public function column_type($item) {
$label = $item->get_type_label();
$class = $item->get_type_class();
return "{$label}";
}
/**
* Displays the slug of the product.
*
* @since 2.0.0
*
* @param WP_Ultimo\Models\Product $item Product object.
* @return string
*/
public function column_slug($item) {
$slug = $item->get_slug();
return "{$slug}";
}
/**
* Displays the price of the product.
*
* @since 2.0.0
*
* @param WP_Ultimo\Models\Product $item Product object.
* @return string
*/
public function column_amount($item) {
if ($item->get_pricing_type() === 'contact_us') {
return __('None', 'wp-ultimo') . sprintf('
%s', __('Requires contact', 'wp-ultimo'));
}
if (empty($item->get_amount())) {
return __('Free', 'wp-ultimo');
}
$amount = wu_format_currency($item->get_amount(), $item->get_currency());
if ($item->is_recurring()) {
$duration = $item->get_duration();
$message = sprintf(
// translators: %1$s is the formatted price, %2$s the duration, and %3$s the duration unit (day, week, month, etc)
_n('every %2$s', 'every %1$s %2$s', $duration, 'wp-ultimo'), // phpcs:ignore
$duration,
$item->get_duration_unit()
);
if ( ! $item->is_forever_recurring()) {
$billing_cycles_message = sprintf(
// translators: %s is the number of billing cycles.
_n('for %s cycle', 'for %s cycles', $item->get_billing_cycles(), 'wp-ultimo'),
$item->get_billing_cycles()
);
$message .= ' ' . $billing_cycles_message;
}
} else {
$message = __('one time payment', 'wp-ultimo');
}
return sprintf('%s
%s', $amount, $message);
}
/**
* Displays the setup fee of the product.
*
* @since 2.0.0
*
* @param WP_Ultimo\Models\Product $item Product object.
* @return string
*/
public function column_setup_fee($item) {
if ($item->get_pricing_type() === 'contact_us') {
return __('None', 'wp-ultimo') . sprintf('
%s', __('Requires contact', 'wp-ultimo'));
}
if ( ! $item->has_setup_fee()) {
return __('No Setup Fee', 'wp-ultimo');
}
return wu_format_currency($item->get_setup_fee(), $item->get_currency());
}
/**
* Handles the bulk processing adding duplication.
*
* @since 2.0.0
* @return void
*/
public function process_single_action(): void {
$bulk_action = $this->current_action();
if ($bulk_action === 'duplicate') {
$product = wu_request('id');
$product = wu_get_product($product);
if ( ! $product) {
WP_Ultimo()->notices->add(__('Product not found.', 'wp-ultimo'), 'error', 'network-admin');
return;
}
$new_product = $product->duplicate();
$new_name = sprintf(__('Copy of %s', 'wp-ultimo'), $product->get_name());
$new_product->set_name($new_name);
$new_product->set_slug(sanitize_title($new_name . '-' . time()));
$new_product->set_date_created(wu_get_current_time('mysql', true));
$result = $new_product->save();
if (is_wp_error($result)) {
WP_Ultimo()->notices->add($result->get_error_message(), 'error', 'network-admin');
return;
}
$redirect_url = wu_network_admin_url(
'wp-ultimo-edit-product',
[
'id' => $new_product->get_id(),
'updated' => 1,
]
);
wp_redirect($redirect_url);
exit;
}
}
/**
* Returns the list of columns for this particular List Table.
*
* @since 2.0.0
* @return array
*/
public function get_columns() {
$columns = [
'cb' => '',
'featured_image_id' => '',
'name' => __('Name', 'wp-ultimo'),
'type' => __('Type', 'wp-ultimo'),
'slug' => __('Slug', 'wp-ultimo'),
'amount' => __('Price', 'wp-ultimo'),
'setup_fee' => __('Setup Fee', 'wp-ultimo'),
'id' => __('ID', 'wp-ultimo'),
];
return $columns;
}
/**
* Handles the item display for grid mode.
*
* @since 2.0.0
*
* @param WP_Ultimo\Models\Product $item The line item being displayed.
* @return void
*/
public function single_row_grid($item): void {
wu_get_template(
'base/products/grid-item',
[
'item' => $item,
'table' => $this,
]
);
}
/**
* Returns the filters for this page.
*
* @since 2.0.0
*/
public function get_filters(): array {
return [
'filters' => [],
];
}
/**
* Returns the pre-selected filters on the filter bar.
*
* @since 2.0.0
* @return array
*/
public function get_views() {
return [
'all' => [
'field' => 'type',
'url' => add_query_arg('type', 'all'),
'label' => __('All Products', 'wp-ultimo'),
'count' => 0,
],
'plan' => [
'field' => 'type',
'url' => add_query_arg('type', 'plan'),
'label' => __('Plans', 'wp-ultimo'),
'count' => 0,
],
'package' => [
'field' => 'type',
'url' => add_query_arg('type', 'package'),
'label' => __('Packages', 'wp-ultimo'),
'count' => 0,
],
'service' => [
'field' => 'type',
'url' => add_query_arg('type', 'service'),
'label' => __('Services', 'wp-ultimo'),
'count' => 0,
],
];
}
}