phpwordpresswoocommerceadvanced-custom-fieldsacfpro

Get ACF field value from product attribute on WooCommerce single product page


I have made a field to add to the WooCommerce attributes. I have added a picture below for more clearance.

enter image description here

I am trying to display the field on the single product page. I have added the following code to the content-single-product.php template file.

$terms = get_the_terms( $product->id, 'pa_merk');
var_dump($terms);

$image = get_field('afbeelding_merk', $terms->taxonomy . '_' . $terms->slug);

// Display the image if it exists
if ($image) {
    echo '<img src="' . $image . '" />';
} else {
    echo "<p>Foto niet gevonden.</p>";
}

What am I doing wrong?

I tried multiple ways to retrieve the terms taxonomy and slug. But on multiple ways it says NULL. I have tried searching on the internet and asking chatgpt. I have also tried to change the part "$terms->slug" to "$terms->term_id", but that did not help either.


Solution

  • Updated: There are mistakes in your code. Try the following instead:

    $product_id = $product->get_id(); // get the product ID
    $taxonomy   = 'pa_merk';
    $terms      = wp_get_post_terms( $product_id, $taxonomy ); // get the product terms
    
    if ( ! is_wp_error($terms) && ! empty($terms) ) {
        $term = reset($terms); // get the first WP_Term object
    
        $image = get_field('afbeelding_merk', $taxonomy . '_' . $term->term_id);
    
        // Display the image if it exists
        if ( ! empty($image) ) {
            echo '<img src="'.isset($image['url']) ? $image['url'] : $image.'" />';
        } else {
            echo "<p>Foto niet gevonden.</p>";
        }
    } else {
        echo "<p>Foto niet gevonden.</p>";
    }
    

    Or the shorter WooCommerce version:

    $taxonomy   = 'pa_merk';
    $term_name  = $product->get_attribute($taxonomy); // get attribute term name
    
    if ( ! empty($term_name) ) {
        $term  = get_term_by('name', $term_name,  $taxonomy);
        $image = get_field('afbeelding_merk', $taxonomy . '_' . $term->term_id);
    
        // Display the image if it exists
        if ( ! empty($image) ) {
            $image = ;
            echo '<img src="'.isset($image['url']) ? $image['url'] : $image.'" />';
        } else {
            echo "<p>Foto niet gevonden.</p>";
        }
    } else {
        echo "<p>Foto niet gevonden.</p>";
    }
    

    Both should work