Skip to content

Instantly share code, notes, and snippets.

View barryhughes's full-sized avatar
🇨🇦

Barry Hughes barryhughes

🇨🇦
  • Automattic
  • Vancouver Island, Canada
View GitHub Profile
@barryhughes
barryhughes / single-product-canonical-redirect.php
Created September 18, 2024 23:40
WooCommerce (9.3.x and earlier): redirect to the canonical single product URL if the category slug is invalid.
<?php
/**
* When the product permalink structure is `product/%product_cat%`, WooCommerce (9.3.x or earlier)
* accepts any value as the `%product_cat%`, which is not always desirable.
*
* This snippet attempts to detect this situation, and will redirect to the canonical URL as needed.
* You can add it as a mu-plugin. For example:
*
* wp-content/mu-plugins/canonical-product-redirect.php
@barryhughes
barryhughes / site-visibility-remove.php
Created September 13, 2024 15:59
WooCommerce > 9.3.1 > Remove "live" (site visiblity) from admin bar
<?php
/**
* Removes the 'site visibility badge' from the WordPress admin bar.
*
* Intended for use with WooCommerce 9.3.1, can be used via a code
* snippet manager or else you may wish to add as a mu-plugin, ie:
*
* wp-content/mu-plugin/disable-site-visibility-badge.php
*/
@barryhughes
barryhughes / wc-rest-api-orders-ids-only.php
Last active September 9, 2024 21:46
WooCommerce > REST API > Orders > IDs Only
<?php
add_filter(
'rest_post_dispatch',
function ( $response, $server, $request ) {
if (
$request->get_route() === '/wc/v3/orders'
&& $request->get_param( '_fields' ) === [ 'id' ]
&& $request->get_param( '_vendor' ) === 'flag'
) {
<?php
$tests = [
true,
false,
-1,
0,
1,
-5.0,
1.0,
@barryhughes
barryhughes / entity-arb-data-maps.php
Created March 6, 2024 21:23
WooCommerce/dynamic properties: associating arbitrary values with individual entity instances.
<?php
/**
* Simple approach showing a structured approach to associating arbitrary, ephemeral
* (non-persisted) data with individual product objects and other entities.
*
* Benefits include avoidance of collisions between two plugins using the same key,
* the range of checks that can be applied to stored values, etc.
*
* @link https://github.com/woocommerce/woocommerce/issues/45286
*/
@barryhughes
barryhughes / scenarios-for-17355.php
Created January 30, 2024 15:25
Mu-plugin code that continuously assigns (currently unassigned) product attribute terms to products, then creates yet more unassigned product attribute terms. This purposefully uses the WP API and avoids the WC API, as a way to replicate conditions that *might* lead to the problem described in https://github.com/woocommerce/woocommerce/issues/17355
<?php
/**
* Assigns currently unassigned product attribute terms to products, to try and
* replicate the problem in the linked issue. Also generates new unassigned terms
* on each request, to further exacerbate things.
*
* We deliberately do not use the WooCommerce API, because in this case we are
* try to circumvent WC's cache invalidation logic.
*
* @see https://github.com/woocommerce/woocommerce/issues/17355
@barryhughes
barryhughes / detect-legacy-wc-rest-api-usage.php
Last active November 27, 2023 18:11
Detect usage of WooCommerce's legacy REST API. Logs any attempts, and displays an admin notice.
<?php
/**
* Plugin name: Detect Legacy REST API Usage (WooCommerce)
* Description: Attempts to detect and log usage of WooCommerce's legacy REST API.
* Version: 2023-11-24.1
*/
function detect_and_log_wc_legacy_api_requests() {
global $wp;
@barryhughes
barryhughes / woocommerce-802-kill-top-seller-query.php
Created August 23, 2023 17:02
"Nullify" the top seller query, within the WooCommerce Status dashboard widget (might be helpful, until such time as the query results are cached).
<?php
/**
* The top-seller query (used for the WooCommerce Status dashboard widget)
* runs on every dashboard request.
*
* It can effectively be nullified using this snippet, if the performance
* impact is too great.
*
* (Tested with WC 8.0.2)
@barryhughes
barryhughes / woo-store-api.full-variation-data.php
Last active May 12, 2023 13:44
Alter the wp-json/wc/store/v1/products/<ID> response so that it includes 'more complete' information about variations.
<?php
/**
* Modify /wp-json/wc/store/v1/products/<ID> so that it returns more complete data about each variation.
*
* Not extensively tested, just captures an idea about how we might do this.
*/
add_filter( 'rest_request_after_callbacks', function ( $response, $handler, $request ) {
// If this is not a Store API product request, do not interfere.
if ( ! str_starts_with( $request->get_route(), '/wc/store/v1/products/' ) || $request->get_method() !== 'GET' ) {
@barryhughes
barryhughes / pr37847-alt__shipping-flat-rate-class-handling.diff
Created May 10, 2023 23:48
A possible alternative to the initial solution in WooCommerce PR#37847 (relates to this comment: https://github.com/woocommerce/woocommerce/pull/37847#issuecomment-1542940612)
diff --git a/plugins/woocommerce/includes/shipping/flat-rate/class-wc-shipping-flat-rate.php b/plugins/woocommerce/includes/shipping/flat-rate/class-wc-shipping-flat-rate.php
index 4b140a814f..5719a8a12b 100644
--- a/plugins/woocommerce/includes/shipping/flat-rate/class-wc-shipping-flat-rate.php
+++ b/plugins/woocommerce/includes/shipping/flat-rate/class-wc-shipping-flat-rate.php
@@ -177,8 +177,16 @@ class WC_Shipping_Flat_Rate extends WC_Shipping_Method {
// Also handles BW compatibility when slugs were used instead of ids.
$shipping_class_term = get_term_by( 'slug', $shipping_class, 'product_shipping_class' );
$class_cost_string = $shipping_class_term && $shipping_class_term->term_id ? $this->get_option( 'class_cost_' . $shipping_class_term->term_id, $this->get_option( 'class_cost_' . $shipping_class, '' ) ) : $this->get_option( 'no_class_cost', '' );
-
- if ( '' === $class_cost_string ) {