woocommerce / woocommerce

A customizable, open-source ecommerce platform built on WordPress. Build any commerce solution you can imagine.
https://woocommerce.com
9.32k stars 10.75k forks source link

ERROR FeaturesUtil::declare_compatibility: woocommerce-advanced-categories is not a known WordPress plugin. #38763

Closed danielbarenkamp closed 11 months ago

danielbarenkamp commented 1 year ago

Prerequisites

Describe the bug

Hi there,

we coded around 20 WooCommerce plugins, that we offer to our customers. Since HPOS you require to declare compatiblity. We do this in a framework plugin of ours for ALL our Woo plugins. However when a customer does NOT have all plugins instalelled an error occurs:

ERROR FeaturesUtil::declare_compatibility: woocommerce-advanced-categories is not a known WordPress plugin.

Can you implement a check on your site if the plugin really exists?

Code for declarity

add_action( 'before_woocommerce_init', function() {
    if ( class_exists( \Automattic\WooCommerce\Utilities\FeaturesUtil::class ) ) {
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-advanced-categories', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-alloy-surcharge', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-attribute-images', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-better-compare', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-booking', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-bottle-deposit', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-bought-together', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-buying-guide', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-cart-pdf', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-catalog-mode', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-dark-pattern', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-delivery', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-enhanced-ecommerce-analytics', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-filtering-revamped', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-gallery-images', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-google-analytics-integration', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-group-attributes', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-multi-currency', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-multi-inventory', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-multisite-duplicate', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-my-account', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-packing-slips', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-pdf-catalog', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-pdf-catalog-builder', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-print-products', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-product-accessories', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-product-bundles', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-product-retailers', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-quick-order', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-quick-view', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-quote-negotiation', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-reward-points', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-shop-look', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-similar-products', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-single-variations', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-sticky-cart', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-tm-extra-product-options', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-ultimate-pdf-invoices', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-ultimate-pricing', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-ultimate-tabs', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-variations-table', true );
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'woocommerce-wishlist', true );
    }
} );

Expected behavior

Declarity checks if plugin exists

Actual behavior

No check is performed

Steps to reproduce

install our welaunch framework plugin: https://www.welaunch.io/en/2021/01/switching-from-redux-to-our-own-framework/

WordPress Environment

Latest

Isolating the problem

jorgeatorres commented 11 months ago

Hi @danielbarenkamp!

Thanks for reaching out. I understand adding the compatibility declaration to all of your plugins might be a bit time consuming, and adding it to your framework code definitely makes sense, as long as you're able to do it once per plugin.

I'm obviously not familiar with the framework you're using, but isn't there any way you can "grab" the current plugin ID/name/filename from within the framework? If not, I guess you can create a function in your framework and call it from your plugin code to mark it as HPOS compatible (it'd hook onto before_woocommerce_init on behalf of the plugin). Say, something like Framework::mark_hpos_compatible( __FILE__ ). You can then use the passed filename argument to figure out the correct name of the plugin. That said, you'd still have to update all plugins with this new code, even if it's less verbose.

At this point, we don't want to silently ignore incorrect compatibility declarations (such as those here, made by a plugin on behalf of another non-installed plugin) and that's why we log the error. That said, beyond the error being logged nothing much should happen. Is this not what you're seeing?

Please let me know if the above makes sense to you. I'd be more than happy to continue the discussion.

danielbarenkamp commented 11 months ago

I use the plugin exist check now in my plugin, case closed :)