7

I am using wordpress and woocommerce ( an e-commerce plugin) to customize a shopping cart. Within my functions.php I am storing data in a variable like so:

add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );

function add_custom_price( $cart_object ) {
    foreach ( $cart_object->cart_contents as $key => $value ) {
        $newVar = $value['data']->price;
    }
}

I need to be able to use $newVar in a different function so I can echo the result on a different area of the page. For instance, if I had the following function, how would I use $newVar within it?

add_action( 'another_area', 'function_name' );

function function_name() {
    echo $newVar;
}

How can I do this?

JCHASE11
  • 3,901
  • 19
  • 69
  • 132

5 Answers5

13

You could make the variable global:

function add_custom_price( $cart_object ) {
    global $newVar;
    foreach ( $cart_object->cart_contents as $key => $value ) {
        $newVar = $value['data']->price;
    }
}

function function_name() {
    global $newVar;
    echo $newVar;
}

Or, if $newVar is already available in the global scope you could do:

function function_name($newVar) {
    echo $newVar;
}

// Add the hook
add_action( 'another_area', 'function_name' );

// Trigger the hook with the $newVar;
do_action('another_area', $newVar);
putvande
  • 15,068
  • 3
  • 34
  • 50
  • does global $newVar need to be defined in the new function? – JCHASE11 Aug 29 '13 at 18:03
  • 3
    a simple question...why declare $newVar global, is `global` a bad practice?? and should be $newVar an array?is a really question to clear up my ideas – Emilio Gort Aug 29 '13 at 18:05
  • @JCHASE11 yes `global $newVar` needs to be defined in both functions. No it is not a bad practice, it is necessary to get the variables in the right scope. You could also use superglobals http://php.net/manual/en/language.variables.superglobals.php. – putvande Aug 29 '13 at 18:08
4

Any reason why you can't call your function from within your foreach loop?

function add_custom_price( $cart_object ) {
    foreach ( $cart_object->cart_contents as $key => $value ) {
        $newVar = $value['data']->price;
        function_name($newVar);
    }
}
ChunkyBaconPlz
  • 580
  • 2
  • 10
3

You should use return $variable in your functions:

function add_custom_price( $cart_object ) {
  foreach ( $cart_object->cart_contents as $key => $value ) {
    $newVar = $value['data']->price;
  }
  return $newVar;
}

function function_name($newVar) {
//do something with $newVar
}

And use like this:

$variable = add_custom_price( $cart_object );

$xxx = function_name($variable);

UPDATE:

Looking at what @ChunkyBaconPlz said $newVar should be an array:

function add_custom_price( $cart_object ) {
  foreach ( $cart_object->cart_contents as $key => $value ) {
    $newVar[] = $value['data']->price;
  }
  return $newVar;
}
Emilio Gort
  • 3,475
  • 3
  • 29
  • 44
  • This is assuming he wants to set `$newVar` multiple times, and then return only the last iteration of `$newVar` set by his `foreach` loop. – ChunkyBaconPlz Aug 29 '13 at 17:57
2

even if its defined global its not working while calling in other function how ever if we call function in other function it seems to be working.

<?php

function one() {
    global $newVar;

        $newVar = "hello";

}

function two() {
    one();
    global $newVar;

    echo $newVar;
}
 two();

?>
Rakhi
  • 929
  • 15
  • 41
0

This is a scope issue. You need to instantiate (create) $newVar outside of the function first. Then it will be view-able by your other function.

You see, scope determines what objects can be seen other objects. If you create a variable within a function, it will only be usable from within that function. Once the function ends, that variable is eliminated!

So to fix, literally just create "$newVar" before you create the function and you should be good to go.