Plugin Directory

Changeset 3752867


Ignore:
Timestamp:
10/18/2026 10:10:08 AM (less than one hour ago)
Author:
propluginslab
Message:

Release 1.2.1: fixes a critical error on every page for logged in customers with completed or processing orders (since 1.2.0 the checkout block fields read the customer's orders before WooCommerce registered its order types); an unreadable order history no longer stops a page.

Location:
mercenza-b2b-for-woocommerce
Files:
16 edited
1 copied

Legend:

Unmodified
Added
Removed
  • mercenza-b2b-for-woocommerce/tags/1.2.1/languages/mercenza-b2b-for-woocommerce.pot

    r3752620 r3752867  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: Mercenza - B2B for WooCommerce 1.2.0\n"
     5"Project-Id-Version: Mercenza - B2B for WooCommerce 1.2.1\n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/mercenza-b2b-for-woocommerce\n"
    77"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    … …  
    1010"Content-Type: text/plain; charset=UTF-8\n"
    1111"Content-Transfer-Encoding: 8bit\n"
    12 "POT-Creation-Date: 2026-10-17T17:58:26+00:00\n"
     12"POT-Creation-Date: 2026-10-18T10:05:45+00:00\n"
    1313"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    1414"X-Generator: WP-CLI 2.12.0\n"
  • mercenza-b2b-for-woocommerce/tags/1.2.1/mercenza-b2b-for-woocommerce.php

    r3752620 r3752867  
    44 * Plugin URI: https://propluginslab.io/shop/plugins/pro-plugins/mercenza-b2b-for-woocommerce/
    55 * Description: B2B and wholesale toolkit for WooCommerce: customer groups, wholesale pricing, quantity rules, B2B only products, registration approval, company accounts, and more.
    6  * Version: 1.2.0
     6 * Version: 1.2.1
    77 * Author: ProPluginsLab
    88 * Author URI: https://propluginslab.io
    … …  
    3535}
    3636
    37 define( 'MERCENZA_VERSION', '1.2.0' );
     37define( 'MERCENZA_VERSION', '1.2.1' );
    3838
    3939// Which build this is. Only read when two copies are installed at once, to let
  • mercenza-b2b-for-woocommerce/tags/1.2.1/readme.txt

    r3752620 r3752867  
    77WC requires at least: 8.2
    88WC tested up to: 11.2.1
    9 Stable tag: 1.2.0
     9Stable tag: 1.2.1
    1010License: GPLv2 or later
    1111License URI: https://www.gnu.org/licenses/gpl-2.0.html
    … …  
    212212
    213213== Changelog ==
     214
     215= 1.2.1 - 2026-10-18 =
     216* Fix: Pages no longer stop with a critical error for logged in customers who have completed or processing orders. Since 1.2.0 the checkout block fields asked for the customer's past orders before WooCommerce had set up its order types.
     217* Fix: A customer's order history that cannot be read no longer stops a page; rules based on past purchases simply do not match.
    214218
    215219= 1.2.0 - 2026-10-17 =
    … …  
    251255== Upgrade Notice ==
    252256
     257= 1.2.1 =
     258Fixes a critical error on every page for logged in customers with orders, introduced in 1.2.0. Update now. No database changes.
     259
    253260= 1.2.0 =
    254261Enforces sub account permissions and order limits, shows the PO number on the Checkout block, fixes price CSV uploads and imports, and adds reCAPTCHA v2. Adds one database table.
  • mercenza-b2b-for-woocommerce/tags/1.2.1/src/Customers/Rules/FactsCollector.php

    r3747065 r3752867  
    102102                        );
    103103                }
    104                 $orders = wc_get_orders(
    105                         array(
    106                                 'customer_id' => $user_id,
    107                                 'status'      => array( 'wc-completed', 'wc-processing' ),
    108                                 'limit'       => 200,
    109                                 'orderby'     => 'date',
    110                                 'order'       => 'DESC',
    111                         )
    112                 );
     104                try {
     105                        $orders = wc_get_orders(
     106                                array(
     107                                        'customer_id' => $user_id,
     108                                        'status'      => array( 'wc-completed', 'wc-processing' ),
     109                                        'limit'       => 200,
     110                                        'orderby'     => 'date',
     111                                        'order'       => 'DESC',
     112                                )
     113                        );
     114                } catch ( \Throwable $e ) {
     115                        // A customer's order history must never take a page down (an order that cannot be loaded, or a call
     116                        // made before WooCommerce registered its order types): rules based on past purchases do not match.
     117                        if ( function_exists( 'wc_get_logger' ) ) {
     118                                wc_get_logger()->warning( 'Mercenza could not read the purchase history of user ' . $user_id . ': ' . $e->getMessage(), array( 'source' => 'mercenza' ) );
     119                        }
     120                        $orders = array();
     121                }
    113122                foreach ( (array) $orders as $order ) {
    114123                        if ( ! $order instanceof \WC_Order ) {
  • mercenza-b2b-for-woocommerce/tags/1.2.1/src/Utilities/Blocks.php

    r3752620 r3752867  
    4141
    4242        /**
    43          * Registers additional checkout fields on woocommerce_init, as WooCommerce
    44          * asks, or straight away when that has already fired.
     43         * Registers additional checkout fields once WooCommerce has registered its
     44         * post and order types (init priority 5, after woocommerce_init), or
     45         * straight away when that has already happened. The callbacks read the
     46         * buyer (group, company, past orders), and wc_get_orders() throws for a
     47         * customer with orders before the order types exist, which took the whole
     48         * site down for logged in customers with orders in 1.2.0. WooCommerce
     49         * accepts fields registered on woocommerce_init or later.
    4550         *
    4651         * @since 1.2.0
     52         * @since 1.2.1 Waits for woocommerce_after_register_post_type.
    4753         *
    4854         * @param callable $callback Callback.
    … …  
    5056         */
    5157        public static function when_fields_ready( callable $callback ): void {
    52                 if ( did_action( 'woocommerce_init' ) ) {
     58                if ( did_action( 'woocommerce_after_register_post_type' ) ) {
    5359                        $callback();
    5460                        return;
    5561                }
    56                 add_action( 'woocommerce_init', $callback );
     62                add_action( 'woocommerce_after_register_post_type', $callback );
    5763        }
    5864}
  • mercenza-b2b-for-woocommerce/tags/1.2.1/vendor/autoload.php

    r3752620 r3752867  
    2020require_once __DIR__ . '/composer/autoload_real.php';
    2121
    22 return ComposerAutoloaderInite7410be3d275e39ff2ab2d51f67e777a::getLoader();
     22return ComposerAutoloaderInitfe8a3b7a95c0e13a9b419782fecb1423::getLoader();
  • mercenza-b2b-for-woocommerce/tags/1.2.1/vendor/composer/autoload_real.php

    r3752620 r3752867  
    33// autoload_real.php @generated by Composer
    44
    5 class ComposerAutoloaderInite7410be3d275e39ff2ab2d51f67e777a
     5class ComposerAutoloaderInitfe8a3b7a95c0e13a9b419782fecb1423
    66{
    77    private static $loader;
    … …  
    2525        require __DIR__ . '/platform_check.php';
    2626
    27         spl_autoload_register(array('ComposerAutoloaderInite7410be3d275e39ff2ab2d51f67e777a', 'loadClassLoader'), true, true);
     27        spl_autoload_register(array('ComposerAutoloaderInitfe8a3b7a95c0e13a9b419782fecb1423', 'loadClassLoader'), true, true);
    2828        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
    29         spl_autoload_unregister(array('ComposerAutoloaderInite7410be3d275e39ff2ab2d51f67e777a', 'loadClassLoader'));
     29        spl_autoload_unregister(array('ComposerAutoloaderInitfe8a3b7a95c0e13a9b419782fecb1423', 'loadClassLoader'));
    3030
    3131        require __DIR__ . '/autoload_static.php';
    32         call_user_func(\Composer\Autoload\ComposerStaticInite7410be3d275e39ff2ab2d51f67e777a::getInitializer($loader));
     32        call_user_func(\Composer\Autoload\ComposerStaticInitfe8a3b7a95c0e13a9b419782fecb1423::getInitializer($loader));
    3333
    3434        $loader->setClassMapAuthoritative(true);
  • mercenza-b2b-for-woocommerce/tags/1.2.1/vendor/composer/autoload_static.php

    r3752620 r3752867  
    55namespace Composer\Autoload;
    66
    7 class ComposerStaticInite7410be3d275e39ff2ab2d51f67e777a
     7class ComposerStaticInitfe8a3b7a95c0e13a9b419782fecb1423
    88{
    99    public static $prefixLengthsPsr4 = array (
    … …  
    293293    {
    294294        return \Closure::bind(function () use ($loader) {
    295             $loader->prefixLengthsPsr4 = ComposerStaticInite7410be3d275e39ff2ab2d51f67e777a::$prefixLengthsPsr4;
    296             $loader->prefixDirsPsr4 = ComposerStaticInite7410be3d275e39ff2ab2d51f67e777a::$prefixDirsPsr4;
    297             $loader->classMap = ComposerStaticInite7410be3d275e39ff2ab2d51f67e777a::$classMap;
     295            $loader->prefixLengthsPsr4 = ComposerStaticInitfe8a3b7a95c0e13a9b419782fecb1423::$prefixLengthsPsr4;
     296            $loader->prefixDirsPsr4 = ComposerStaticInitfe8a3b7a95c0e13a9b419782fecb1423::$prefixDirsPsr4;
     297            $loader->classMap = ComposerStaticInitfe8a3b7a95c0e13a9b419782fecb1423::$classMap;
    298298
    299299        }, null, ClassLoader::class);
  • mercenza-b2b-for-woocommerce/trunk/languages/mercenza-b2b-for-woocommerce.pot

    r3752620 r3752867  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: Mercenza - B2B for WooCommerce 1.2.0\n"
     5"Project-Id-Version: Mercenza - B2B for WooCommerce 1.2.1\n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/mercenza-b2b-for-woocommerce\n"
    77"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    … …  
    1010"Content-Type: text/plain; charset=UTF-8\n"
    1111"Content-Transfer-Encoding: 8bit\n"
    12 "POT-Creation-Date: 2026-10-17T17:58:26+00:00\n"
     12"POT-Creation-Date: 2026-10-18T10:05:45+00:00\n"
    1313"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    1414"X-Generator: WP-CLI 2.12.0\n"
  • mercenza-b2b-for-woocommerce/trunk/mercenza-b2b-for-woocommerce.php

    r3752620 r3752867  
    44 * Plugin URI: https://propluginslab.io/shop/plugins/pro-plugins/mercenza-b2b-for-woocommerce/
    55 * Description: B2B and wholesale toolkit for WooCommerce: customer groups, wholesale pricing, quantity rules, B2B only products, registration approval, company accounts, and more.
    6  * Version: 1.2.0
     6 * Version: 1.2.1
    77 * Author: ProPluginsLab
    88 * Author URI: https://propluginslab.io
    … …  
    3535}
    3636
    37 define( 'MERCENZA_VERSION', '1.2.0' );
     37define( 'MERCENZA_VERSION', '1.2.1' );
    3838
    3939// Which build this is. Only read when two copies are installed at once, to let
  • mercenza-b2b-for-woocommerce/trunk/readme.txt

    r3752620 r3752867  
    77WC requires at least: 8.2
    88WC tested up to: 11.2.1
    9 Stable tag: 1.2.0
     9Stable tag: 1.2.1
    1010License: GPLv2 or later
    1111License URI: https://www.gnu.org/licenses/gpl-2.0.html
    … …  
    212212
    213213== Changelog ==
     214
     215= 1.2.1 - 2026-10-18 =
     216* Fix: Pages no longer stop with a critical error for logged in customers who have completed or processing orders. Since 1.2.0 the checkout block fields asked for the customer's past orders before WooCommerce had set up its order types.
     217* Fix: A customer's order history that cannot be read no longer stops a page; rules based on past purchases simply do not match.
    214218
    215219= 1.2.0 - 2026-10-17 =
    … …  
    251255== Upgrade Notice ==
    252256
     257= 1.2.1 =
     258Fixes a critical error on every page for logged in customers with orders, introduced in 1.2.0. Update now. No database changes.
     259
    253260= 1.2.0 =
    254261Enforces sub account permissions and order limits, shows the PO number on the Checkout block, fixes price CSV uploads and imports, and adds reCAPTCHA v2. Adds one database table.
  • mercenza-b2b-for-woocommerce/trunk/src/Customers/Rules/FactsCollector.php

    r3747065 r3752867  
    102102                        );
    103103                }
    104                 $orders = wc_get_orders(
    105                         array(
    106                                 'customer_id' => $user_id,
    107                                 'status'      => array( 'wc-completed', 'wc-processing' ),
    108                                 'limit'       => 200,
    109                                 'orderby'     => 'date',
    110                                 'order'       => 'DESC',
    111                         )
    112                 );
     104                try {
     105                        $orders = wc_get_orders(
     106                                array(
     107                                        'customer_id' => $user_id,
     108                                        'status'      => array( 'wc-completed', 'wc-processing' ),
     109                                        'limit'       => 200,
     110                                        'orderby'     => 'date',
     111                                        'order'       => 'DESC',
     112                                )
     113                        );
     114                } catch ( \Throwable $e ) {
     115                        // A customer's order history must never take a page down (an order that cannot be loaded, or a call
     116                        // made before WooCommerce registered its order types): rules based on past purchases do not match.
     117                        if ( function_exists( 'wc_get_logger' ) ) {
     118                                wc_get_logger()->warning( 'Mercenza could not read the purchase history of user ' . $user_id . ': ' . $e->getMessage(), array( 'source' => 'mercenza' ) );
     119                        }
     120                        $orders = array();
     121                }
    113122                foreach ( (array) $orders as $order ) {
    114123                        if ( ! $order instanceof \WC_Order ) {
  • mercenza-b2b-for-woocommerce/trunk/src/Utilities/Blocks.php

    r3752620 r3752867  
    4141
    4242        /**
    43          * Registers additional checkout fields on woocommerce_init, as WooCommerce
    44          * asks, or straight away when that has already fired.
     43         * Registers additional checkout fields once WooCommerce has registered its
     44         * post and order types (init priority 5, after woocommerce_init), or
     45         * straight away when that has already happened. The callbacks read the
     46         * buyer (group, company, past orders), and wc_get_orders() throws for a
     47         * customer with orders before the order types exist, which took the whole
     48         * site down for logged in customers with orders in 1.2.0. WooCommerce
     49         * accepts fields registered on woocommerce_init or later.
    4550         *
    4651         * @since 1.2.0
     52         * @since 1.2.1 Waits for woocommerce_after_register_post_type.
    4753         *
    4854         * @param callable $callback Callback.
    … …  
    5056         */
    5157        public static function when_fields_ready( callable $callback ): void {
    52                 if ( did_action( 'woocommerce_init' ) ) {
     58                if ( did_action( 'woocommerce_after_register_post_type' ) ) {
    5359                        $callback();
    5460                        return;
    5561                }
    56                 add_action( 'woocommerce_init', $callback );
     62                add_action( 'woocommerce_after_register_post_type', $callback );
    5763        }
    5864}
  • mercenza-b2b-for-woocommerce/trunk/vendor/autoload.php

    r3752620 r3752867  
    2020require_once __DIR__ . '/composer/autoload_real.php';
    2121
    22 return ComposerAutoloaderInite7410be3d275e39ff2ab2d51f67e777a::getLoader();
     22return ComposerAutoloaderInitfe8a3b7a95c0e13a9b419782fecb1423::getLoader();
  • mercenza-b2b-for-woocommerce/trunk/vendor/composer/autoload_real.php

    r3752620 r3752867  
    33// autoload_real.php @generated by Composer
    44
    5 class ComposerAutoloaderInite7410be3d275e39ff2ab2d51f67e777a
     5class ComposerAutoloaderInitfe8a3b7a95c0e13a9b419782fecb1423
    66{
    77    private static $loader;
    … …  
    2525        require __DIR__ . '/platform_check.php';
    2626
    27         spl_autoload_register(array('ComposerAutoloaderInite7410be3d275e39ff2ab2d51f67e777a', 'loadClassLoader'), true, true);
     27        spl_autoload_register(array('ComposerAutoloaderInitfe8a3b7a95c0e13a9b419782fecb1423', 'loadClassLoader'), true, true);
    2828        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
    29         spl_autoload_unregister(array('ComposerAutoloaderInite7410be3d275e39ff2ab2d51f67e777a', 'loadClassLoader'));
     29        spl_autoload_unregister(array('ComposerAutoloaderInitfe8a3b7a95c0e13a9b419782fecb1423', 'loadClassLoader'));
    3030
    3131        require __DIR__ . '/autoload_static.php';
    32         call_user_func(\Composer\Autoload\ComposerStaticInite7410be3d275e39ff2ab2d51f67e777a::getInitializer($loader));
     32        call_user_func(\Composer\Autoload\ComposerStaticInitfe8a3b7a95c0e13a9b419782fecb1423::getInitializer($loader));
    3333
    3434        $loader->setClassMapAuthoritative(true);
  • mercenza-b2b-for-woocommerce/trunk/vendor/composer/autoload_static.php

    r3752620 r3752867  
    55namespace Composer\Autoload;
    66
    7 class ComposerStaticInite7410be3d275e39ff2ab2d51f67e777a
     7class ComposerStaticInitfe8a3b7a95c0e13a9b419782fecb1423
    88{
    99    public static $prefixLengthsPsr4 = array (
    … …  
    293293    {
    294294        return \Closure::bind(function () use ($loader) {
    295             $loader->prefixLengthsPsr4 = ComposerStaticInite7410be3d275e39ff2ab2d51f67e777a::$prefixLengthsPsr4;
    296             $loader->prefixDirsPsr4 = ComposerStaticInite7410be3d275e39ff2ab2d51f67e777a::$prefixDirsPsr4;
    297             $loader->classMap = ComposerStaticInite7410be3d275e39ff2ab2d51f67e777a::$classMap;
     295            $loader->prefixLengthsPsr4 = ComposerStaticInitfe8a3b7a95c0e13a9b419782fecb1423::$prefixLengthsPsr4;
     296            $loader->prefixDirsPsr4 = ComposerStaticInitfe8a3b7a95c0e13a9b419782fecb1423::$prefixDirsPsr4;
     297            $loader->classMap = ComposerStaticInitfe8a3b7a95c0e13a9b419782fecb1423::$classMap;
    298298
    299299        }, null, ClassLoader::class);
Note: See TracChangeset for help on using the changeset viewer.