Can I modify WooCommerce functions within the 'wc-template-functions.php' file or should I stick with the 'functions.php' file for such modifications? Can I modify WooCommerce functions within the 'wc-template-functions.php' file or should I stick with the 'functions.php' file for such modifications? wordpress wordpress

Can I modify WooCommerce functions within the 'wc-template-functions.php' file or should I stick with the 'functions.php' file for such modifications?


Your 1,2,3 understanding is correct.

However, the files wc-template-functions.php and wc-templates-hooks.php are not overridden by placing similar files in your theme, so having them in your theme would not do anything.

It's also, a bad idea (in my opinion) to wholesale copy/override files when you want to change something specific. I had to hunt through an entire folder of WooCommerce templates when a client's site crashed to find the actual changes that needed to be maintained.

There's not anything wrong with separating your functions.php file into smaller, more manageable files. And so, you could have a woocommerce-functions.php file named whatever you'd like to store your WooCommerce-specific code.

Edit to expand some thoughts

Anytime WooCommerce (or any WordPress function really) shows you this pattern:

if ( ! function_exists( 'some_function_name' ) ) {    function some_function_name() {        echo 'taco';    }}

you have a pluggable function and you can just define it in your theme's function.php and WooCommerce will use your version of some_function_name().

However, pluggable functions are hooked where they are hooked and you can't move them by redefining them in your theme/plugin. So a more powerful approach is to remove the function from it's hook and either add to back to a different hook, or add your own custom function, or both. Here's an example that moves a custom title to after the price:

function kia_switch_loop_title(){    remove_action( 'woocommerce_shop_loop_item_title', 'woocommerce_template_loop_product_title', 10 );    add_action( 'woocommerce_after_shop_loop_item_title', 'kia_template_loop_product_title', 15 );}add_action( 'woocommerce_before_shop_loop_item', 'kia_switch_loop_title' );function kia_template_loop_product_title() {    echo '<h4 class="we-do-what-we-want">' . get_the_title() . '</h4>';}


was struggling with how to make related products sorting in desc way, just found solution. In case anybody needs it

function custom_remove_hook(){    remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20 );    add_action( 'woocommerce_after_single_product_summary', 'custom_function_to_sort_related', 22 );}add_action( 'woocommerce_after_single_product_summary', 'custom_remove_hook' );function custom_function_to_sort_related( $args = array() ) {        global $product;        if ( ! $product ) {            return;        }        $defaults = array(            'posts_per_page' => 4,            'columns'        => 4,            'orderby'        => 'price', // @codingStandardsIgnoreLine.            'order'          => 'desc'        );        $args = wp_parse_args( $args, $defaults );        // Get visible related products then sort them at random.        $args['related_products'] = array_filter( array_map( 'wc_get_product', wc_get_related_products( $product->get_id(), $args['posts_per_page'], $product->get_upsell_ids() ) ), 'wc_products_array_filter_visible' );        // Handle orderby.        $args['related_products'] = wc_products_array_orderby( $args['related_products'], $args['orderby'], $args['order'] );        // Set global loop values.        wc_set_loop_prop( 'name', 'related' );        wc_set_loop_prop( 'columns', apply_filters( 'woocommerce_related_products_columns', $args['columns'] ) );        wc_get_template( 'single-product/related.php', $args );    }