Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
File Manager
/
wp-content
/
test
/
test
/
test
/
wp-content
/
plugins
/
flexible-shipping
/
src
/
WPDesk
/
FS
/
TableRate
/
ShippingMethod
/
Duplicate
:
DuplicateAction.php
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php /** * Class DuplicateAction * * @package WPDesk\FS\TableRate\ShippingMethod\Duplicate */ namespace WPDesk\FS\TableRate\ShippingMethod\Duplicate; use FSVendor\WPDesk\PluginBuilder\Plugin\Hookable; use WPDesk\FS\TableRate\ShippingMethod\Management\ShippingMethodManagement; use WPDesk\FS\TableRate\ShippingMethodSingle; /** * Duplicate Action. */ class DuplicateAction implements Hookable { const ACTION = 'fs_duplicate_method'; const OPTION = 'fs_duplicate_method'; const PARAM_ID = 'instance_id'; /** * @var ShippingMethodManagement */ private $shipping_method_management; /** * @var DuplicatorChecker */ private $duplicator_checker; /** * @param DuplicatorChecker $duplicator_checker . * @param ShippingMethodManagement $shipping_method_management . */ public function __construct( DuplicatorChecker $duplicator_checker, ShippingMethodManagement $shipping_method_management ) { $this->duplicator_checker = $duplicator_checker; $this->shipping_method_management = $shipping_method_management; } /** * Init hooks (actions and filters). * * @return void */ public function hooks() { add_action( 'admin_post_' . self::ACTION, [ $this, 'action_duplicate' ] ); } public function action_duplicate() { check_admin_referer( self::ACTION ); $instance_id = (int) ( sanitize_text_field( wp_unslash( $_GET[ self::PARAM_ID ] ?? 0 ) ) ); if ( ! $instance_id ) { wp_die( __( 'Shipping method duplication error. Please try again later.', 'flexible-shipping' ) ); // phpcs:ignore return; } $title = $this->shipping_method_management->get_shipping_method( $instance_id )->get_title(); if ( ! $this->duplicator_checker->should_duplicate( $instance_id ) ) { wp_redirect( $this->get_redirect_url( 'error', $title ) ); $this->end_request(); return; } $zone = $this->shipping_method_management->get_shipping_zone( $instance_id ); $new_instance_id = $zone->add_shipping_method( ShippingMethodSingle::SHIPPING_METHOD_ID ); $options = $this->get_instance_settings( $instance_id ); if ( empty( $options['method_title'] ?? '' ) ) { $options['method_title'] = __( 'Flexible Shipping', 'flexible-shipping' ); } $options['method_title'] .= ' ' . __( '(Copy)', 'flexible-shipping' ); add_option( $this->get_option_settings_field( $new_instance_id ), $options ); $this->shipping_method_management->set_shipping_method_status( $new_instance_id, false, $zone ); $this->update_usage_functionality(); wp_redirect( $this->get_redirect_url( 'success', $title ) ); $this->end_request(); } /** * @codeCoverageIgnore */ protected function end_request() { die(); } /** * @param int $instance_id . * * @return array */ private function get_instance_settings( int $instance_id ): array { return (array) get_option( $this->get_option_settings_field( $instance_id ), [] ); } /** * @param int $instance_id . * * @return string */ private function get_option_settings_field( int $instance_id ): string { return sprintf( 'woocommerce_%s_%d_settings', ShippingMethodSingle::SHIPPING_METHOD_ID, $instance_id ); } private function update_usage_functionality() { $current = (int) get_option( self::OPTION, 0 ); update_option( self::OPTION, ++$current ); } /** * @param string $status . * @param string $method_title . * * @return string */ private function get_redirect_url( string $status, string $method_title ): string { return add_query_arg( [ self::ACTION => true, 'status' => $status, 'method_title' => urlencode( $method_title ), ], wp_get_referer() ); } }