<?php declare( strict_types=1 ); namespace Automattic\WooCommerce\GoogleListingsAndAds\Admin\BulkEdit; use Automattic\Jetpack\Constants; use Automattic\WooCommerce\GoogleListingsAndAds\Coupon\CouponMetaHandler; use Automattic\WooCommerce\GoogleListingsAndAds\HelperTraits\ViewHelperTrait; use Automattic\WooCommerce\GoogleListingsAndAds\Infrastructure\AdminConditional; use Automattic\WooCommerce\GoogleListingsAndAds\Infrastructure\Registerable; use Automattic\WooCommerce\GoogleListingsAndAds\MerchantCenter\MerchantCenterService; use Automattic\WooCommerce\GoogleListingsAndAds\MerchantCenter\TargetAudience; use Automattic\WooCommerce\GoogleListingsAndAds\Value\ChannelVisibility; use WC_Coupon; defined( 'ABSPATH' ) || exit; /** * Class CouponBulkEdit * * @package Automattic\WooCommerce\GoogleListingsAndAds\Admin\BulkEdit */ class CouponBulkEdit implements BulkEditInterface, Registerable { use AdminConditional; use ViewHelperTrait; protected const VIEW_PATH = 'views/bulk-edit/shop_coupon.php'; protected const TARGET_COLUMN = 'usage'; /** * @var CouponMetaHandler */ protected $meta_handler; /** * @var MerchantCenterService */ protected $merchant_center; /** * @var TargetAudience */ protected $target_audience; /** * AbstractMetaBox constructor. * * @param CouponMetaHandler $meta_handler * @param MerchantCenterService $merchant_center * @param TargetAudience $target_audience */ public function __construct( CouponMetaHandler $meta_handler, MerchantCenterService $merchant_center, TargetAudience $target_audience ) { $this->meta_handler = $meta_handler; $this->merchant_center = $merchant_center; $this->target_audience = $target_audience; } /** * Register a service. */ public function register(): void { add_action( 'bulk_edit_custom_box', [ $this, 'render_view' ], 10, 2 ); add_action( 'bulk_edit_save_post', [ $this, 'handle_submission' ], 10, 2 ); } /** * The screen on which to show the bulk edit view. * * @return string */ public function get_screen(): string { return self::SCREEN_COUPON; } /** * Render the coupon bulk edit view. * * @param string $column_name Column being shown. * @param string $post_type Post type being shown. */ public function render_view( $column_name, $post_type ) { if ( $this->get_screen() !== $post_type || self::TARGET_COLUMN !== $column_name ) { return; } if ( ! $this->merchant_center->is_setup_complete() ) { return; } $target_country = $this->target_audience->get_main_target_country(); if ( ! $this->merchant_center->is_promotion_supported_country( $target_country ) ) { return; } include path_join( dirname( __DIR__, 3 ), self::VIEW_PATH ); } /** * Handle the coupon bulk edit submission. * * @param int $post_id Post ID being saved. * @param object $post Post object being saved. * * @return int $post_id */ public function handle_submission( int $post_id, $post ): int { $request_data = $this->request_data(); // If this is an autosave, our form has not been submitted, so we don't want to do anything. if ( Constants::is_true( 'DOING_AUTOSAVE' ) ) { return $post_id; } // Don't save revisions and autosaves. if ( wp_is_post_revision( $post_id ) || wp_is_post_autosave( $post_id ) || $this->get_screen() !== $post->post_type || ! current_user_can( 'edit_post', $post_id ) ) { return $post_id; } // Check nonce. // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash if ( ! isset( $request_data['woocommerce_gla_bulk_edit'] ) || ! wp_verify_nonce( $request_data['woocommerce_gla_bulk_edit_nonce'], 'woocommerce_gla_bulk_edit_nonce' ) ) { return $post_id; } if ( ! empty( $request_data['change_channel_visibility'] ) ) { // Get the coupon and save. $coupon = new WC_Coupon( $post_id ); $visibility = ChannelVisibility::cast( sanitize_key( $request_data['change_channel_visibility'] ) ); if ( $this->meta_handler->get_visibility( $coupon ) !== $visibility ) { $this->meta_handler->update_visibility( $coupon, $visibility ); do_action( 'woocommerce_gla_bulk_update_coupon', $post_id ); } } return $post_id; } /** * Get the current request data ($_REQUEST superglobal). * This method is added to ease unit testing. * * @return array The $_REQUEST superglobal. */ protected function request_data(): array { // Nonce must be verified manually. //phpcs:ignore WordPress.Security.NonceVerification.Recommended return $_REQUEST; } }