HEX
Server: Apache
System: Linux efa57bbe-abb1-400d-2985-3b056fbc2701.secureserver.net 6.1.147-1.el9.elrepo.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Jul 24 12:33:32 EDT 2025 x86_64
User: root (0)
PHP: 8.0.30.4
Disabled: NONE
Upload Files
File: //var/www/wp-content/mu-plugins/vendor/godaddy/mwc-core/src/Features/CostOfGoods/CostOfGoods.php
<?php

namespace GoDaddy\WordPress\MWC\Core\Features\CostOfGoods;

use Exception;
use GoDaddy\WordPress\MWC\Common\Configuration\Configuration;
use GoDaddy\WordPress\MWC\Common\Events\Events;
use GoDaddy\WordPress\MWC\Common\Events\FeatureEnabledEvent;
use GoDaddy\WordPress\MWC\Common\Features\AbstractFeature;
use GoDaddy\WordPress\MWC\Common\Helpers\StringHelper;
use GoDaddy\WordPress\MWC\Common\Platforms\PlatformRepositoryFactory;
use GoDaddy\WordPress\MWC\Common\Register\Register;
use GoDaddy\WordPress\MWC\Core\Events\ButtonClickedEvent;
use GoDaddy\WordPress\MWC\Core\WooCommerce\Views\Components\GoDaddyBranding;
use function GoDaddy\WordPress\MWC\CostOfGoods\wc_cog;
use GoDaddy\WordPress\MWC\CostOfGoods\WC_COG_Loader;

/**
 * The Cost of Goods feature loader.
 *
 * @since 2.15.0
 */
class CostOfGoods extends AbstractFeature
{
    /** @var string the plugin name */
    protected static $communityPluginName = 'woocommerce-cost-of-goods/woocommerce-cost-of-goods.php';

    /** @var string the community plugin slug */
    protected static $communityPluginSlug = 'woocommerce-cost-of-goods';

    /**
     * {@inheritDoc}
     */
    public static function getName() : string
    {
        return 'cost_of_goods';
    }

    /**
     * Registers hooks.
     *
     * @since 2.15.0
     *
     * @throws Exception
     */
    protected function registerHooks()
    {
        Register::action()
            ->setGroup('admin_init')
            ->setHandler([$this, 'maybeDeactivateCostOfGoodsPlugin'])
            ->execute();

        Register::action()
            ->setGroup('admin_head')
            ->setHandler([$this, 'registerGoDaddyBrandingHooks'])
            ->execute();

        Register::action()
            ->setGroup('wp_ajax_wc_cog_apply_costs_to_previous_orders')
            ->setHandler([$this, 'broadcastApplyCostsToPreviousOrdersEvent'])
            ->setArgumentsCount(0)
            ->execute();

        Register::action()
            ->setGroup('load-plugins.php')
            ->setHandler([$this, 'removePluginUpdateNotice'])
            ->setPriority(PHP_INT_MAX)
            ->setCondition([self::class, 'shouldLoad'])
            ->execute();
    }

    /**
     * Registers hooks needed for adding GoDaddy branding.
     *
     * @internal
     *
     * @throws Exception
     */
    public function registerGoDaddyBrandingHooks() : void
    {
        Register::action()
            ->setGroup('admin_footer')
            ->setHandler([$this, 'addGoDaddyBrandingStyles'])
            ->setCondition([$this, 'shouldAddGoDaddyBranding'])
            ->setPriority(PHP_INT_MAX)
            ->execute();

        Register::filter()
            ->setGroup('admin_footer_text')
            ->setHandler('__return_empty_string')
            ->setCondition([$this, 'shouldAddGoDaddyBranding'])
            ->execute();

        Register::filter()
            ->setGroup('update_footer')
            ->setHandler('__return_empty_string')
            ->setCondition([$this, 'shouldAddGoDaddyBranding'])
            ->setPriority(PHP_INT_MAX)
            ->execute();
    }

    /**
     * Removes the WP action that displays the plugin update notice below each plugin on the Plugins page.
     */
    public function removePluginUpdateNotice()
    {
        remove_action('after_plugin_row_'.static::$communityPluginName, 'wp_plugin_update_row');
    }

    /**
     * May deactivate the Cost of Goods plugin.
     *
     * @since 2.15.0
     *
     * @throws Exception
     */
    public function maybeDeactivateCostOfGoodsPlugin()
    {
        if (! static::isCogsPluginActive()) {
            return;
        }

        update_option('mwc_cost_of_goods_show_notice_cogs_users', 'yes');

        if (false === get_option('mwc_cost_of_goods_show_notice_reactivation_cogs', false)) {
            // the community plugin is being deactivated automatically for the 1st time, so this is not a reactivation attempt
            add_option('mwc_cost_of_goods_show_notice_reactivation_cogs', 'no', '', false);
        } else {
            // the community plugin was already deactivated automatically before, this is a reactivation attempt
            update_option('mwc_cost_of_goods_show_notice_reactivation_cogs', 'yes');
            // we want to display the notice again even it was previously dismissed
            wc_cog()->get_admin_notice_handler()->undismiss_notice(wc_cog()->get_id_dasherized().'-reactivation-cogs');
        }

        $this->deactivateCostOfGoodsPlugin();
    }

    /**
     * Deactivates the Cost of Goods plugin.
     *
     * @since 2.15.0
     *
     * @throws Exception
     */
    protected function deactivateCostOfGoodsPlugin()
    {
        if (! function_exists('deactivate_plugins')) {
            return;
        }

        deactivate_plugins(static::$communityPluginName);

        // unset GET param so that the "Plugin activated." notice is not displayed
        if (isset($_GET['activate'])) {
            unset($_GET['activate']);
        }

        Events::broadcast(new FeatureEnabledEvent('cost_of_goods'));
    }

    /**
     * Checks if should add GoDaddy branding to module settings page.
     *
     * @since 3.0.0
     *
     * @throws Exception
     * @return bool
     */
    public function shouldAddGoDaddyBranding() : bool
    {
        return ! PlatformRepositoryFactory::getNewInstance()->getPlatformRepository()->isReseller()
            && wc_cog()->is_plugin_settings()
            // only add branding if another feature is not already adding it
            && ! has_action('admin_footer', [GoDaddyBranding::getInstance(), 'render']);
    }

    /**
     * Overwrites hiding the wpfooter which is present in the base wooCommerce styles.
     */
    public function addGoDaddyBrandingStyles()
    {
        echo '<style>#wpfooter { display: block ! important; }</style>';
    }

    /**
     * Loads feature main file as well as SV Framework from root vendor folder.
     *
     * @since 2.15.0
     *
     * @param string $vendorPath
     */
    protected function loadRequiredFeatureFiles(string $vendorPath)
    {
        // load plugin class file
        require_once $vendorPath.'godaddy/mwc-cost-of-goods/woocommerce-cost-of-goods.php';

        // plugin class
        require_once $vendorPath.'skyverge/wc-plugin-framework/woocommerce/class-sv-wc-plugin.php';

        // async request class
        require_once $vendorPath.'skyverge/wc-plugin-framework/woocommerce/utilities/class-sv-wp-async-request.php';

        // background job handler class
        require_once $vendorPath.'skyverge/wc-plugin-framework/woocommerce/utilities/class-sv-wp-background-job-handler.php';
    }

    /**
     * Broadcasts an event indicating that the user clicked on the Apply Costs button.
     *
     * @since 2.15.0
     *
     * @throws Exception
     */
    public function broadcastApplyCostsToPreviousOrdersEvent()
    {
        Events::broadcast(new ButtonClickedEvent('wc_cog_apply_costs_to_previous_orders'));
    }

    /**
     * Checks if Cost of Good plugin is active.
     *
     * @since 2.15.0
     *
     * @return bool
     */
    public static function isCogsPluginActive() : bool
    {
        return function_exists('is_plugin_active') && is_plugin_active(static::$communityPluginName);
    }

    /**
     * {@inheritDoc}
     */
    public function load()
    {
        $rootVendorPath = StringHelper::trailingSlash(Configuration::get('system_plugin.project_root').'/vendor');

        $this->loadRequiredFeatureFiles($rootVendorPath);

        WC_COG_Loader::instance()->init_plugin();

        $this->registerHooks();
    }
}