PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Monday, May 9, 2022

[FIXED] How to get the WC_Product object in woocommerce_after_main_content

 May 09, 2022     html, php, product, woocommerce, wordpress     No comments   

Issue

I have a function that outputs text after the main_content action hook in WordPress, but Woocommerce is telling me that I have an CRITICAL Uncaught Error: Call to a member function get_id() on null in .../function.php.

I've tried passing in the global $product, and checking if it is a product before running the function. The function seems to work fine, but I'm just trying to get rid of the fatal errors.

Is there something obvious I'm missing?

Here's my function:

add_action('woocommerce_after_main_content', 'display_prewired_notes');
    function display_prewired_notes() {
        global $product; //Tried global variable
        $product_id = $product->get_id(); //getting ID
        $product_name = $product->get_name(); //get name


        if (is_product() && has_term('prewired-pickguard', 'product_cat', $product_id)) { ?>

        //My HTML here
    
<?php
        }

        if (is_product() && $product_id == 6599) { ?>
    
        //More HTML for this specific product

<?php
        }
    };

Edit:

I've tried a few things based on @Martin 's suggestions, and I still can't get this to work.

I've tried:

1:

<?php

global $product


function display_prewired_notes($product) { // Pass it in

        $product_id = $product->get_id(); //getting ID
        $product_name = $product->get_name(); //get name

And I get atal error: Uncaught Error: Call to a member function get_id() on string

2:

Removing the global $product entirely, I get: Uncaught Error: Call to a member function get_id() on null

3:

Removing the global $product and keeping the $product as a parameter: Fatal error: Uncaught Error: Call to a member function get_id() on string


Solution

The hook woocommerce_after_main_content is mainly used in 2 WooCommerce templates:

  • templates/archive-product.php (WooCommerce archive pages)
  • templates/single-product.php (WooCommerce single product pages)

So you can only get the WC_Product Object from single product pages and you need to target first single product pages using the conditional tag is_product() where you will be able to get the WC_product Object this way:

add_action( 'woocommerce_after_main_content', 'display_prewired_notes' );
function display_prewired_notes() {
    // Targeting single product pages (before)
    if ( ! is_product() ) return; // exit

    global $product;
    
    // To be sure, If we don't get the product object
    if( ! is_a($product, 'WC_Product') ) {
        // Try to get an instance of the WC_Product object from Post id
        $product = wc_get_product( get_the_id() ); 
    }

    $product_name = $product->get_name(); //get product name

    if ( has_term(array('prewired-pickguard'), 'product_cat', $product->get_id() ) ) { 
        ?> 
        <!-- My HTML here -->
        <?php
    }

    if ( $product->get_id() == 6599 ) { 
        ?> 
        <!-- More HTML for this specific product -->
        <?php
    }
}

Code goes in functions.php file of the active child theme (or active theme). Tested and works.

On archive pages as it's a loop of products, it's not possible to get a product Id or/and the WC_Product Object…



Answered By - LoicTheAztec
Answer Checked By - Mildred Charles (PHPFixing Admin)
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing