Search code examples
phpwordpressshortcode

Wordpress custom shortcode function with variable string (Newbie)


I am trying to create a simple Wordpress shortcode based function that will take a defined number and convert it to the end user's local currency. Where I am stuck is how to search the post for the shortcode because the defined number is subject to change. If someone could please let me know how best to extract the number as a variable, I can then run it through the exchange rate function (which works fine, I have tested it with custom field stored data).

{customShortcode - priceAdditions [400]}

I have tried to explode() it around the [] and that seems to show promise but I can't work out how to extract it, also with the prospect of more than one instance of this being used with different numbers. I think regex or preg_match may be the way to go but I don't quite understand that just yet.

If you need more info, please let me know. Thanks in advance.

Dan

Edit - The function for the shortcode that works -

$thePostContent =   get_the_content($post->ID); 
$thePostContent =   str_replace('{customShortcode - price}',thePrice(),$thePostContent);

The function -

function thePrice(){
$pageURL = 'http';
if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
$pageURL .= "://";
if ($_SERVER["SERVER_PORT"] != "80") {
 $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
} else {
  $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
$Exploded_URL = explode("/",$pageURL);
if      ($Exploded_URL[4] == ''){$thePostIsIn   =   217;}
elseif  ($Exploded_URL[4] == 'productA'){$thePostIsIn   =   347;}
elseif  ($Exploded_URL[4] == 'productB'){$thePostIsIn   =   345;}
else    {$thePostIsIn   =   217;}
if      (empty($_COOKIE['userLocate']) || $_COOKIE['userLocate'] == 'US' || ($_COOKIE['userLocate'] != 'EU' && $_COOKIE['userLocate'] != 'AU' && $_COOKIE['userLocate'] != 'GB')){
    $currencyCode   =   'USD';
    $currencyPrefix =   '$';
}
elseif  ($_COOKIE['userLocate'] == 'EU'){
    $currencyCode   =   'EUR';
    $currencyPrefix =   '€';
}
elseif  ($_COOKIE['userLocate'] == 'AU'){
    $currencyCode   =   'AUD';
    $currencyPrefix =   'A$';
}
elseif  ($_COOKIE['userLocate'] == 'GB'){
    $currencyCode   =   'GBP';
    $currencyPrefix =   '£';
}
else {
    $currencyCode   =   'USD';
    $currencyPrefix =   '$';
}

$args=array(
'post_type' =>'page',
'post__in' => array($thePostIsIn)
);
$recent_posts = get_posts($args);
foreach( $recent_posts as $recent ){    

    $mypages        =   get_post( $recent->ID );
    $theBaseRate    =   get_post_meta($recent->ID, "Payment Cost",1);

    if(get_post_meta($recent->ID, "Payment Period",1)){
        $payPeriod  =   get_post_meta($recent->ID, "Payment Period",1);
    }
    else{
        $payPeriod  =   "per month";
    }

    $rssFeedUrl     =   "http://themoneyconverter.com/rss-feed/GBP/rss.xml";
    $rss            =   simplexml_load_file($rssFeedUrl);
    foreach($rss->channel->item as $feedItem){
        $currency   =   explode('/',$feedItem->title);
        if(strpos($currency[0], $currencyCode )!== false){
            $content    =   $feedItem->description;
            $content    =   explode('= ',$content);
            $content    =   substr($content[1],0,7);
            $theCost    =   $theBaseRate * $content;
            $theCost    =   number_format($theCost, 2, '.', '');
        }
    }
}
echo '<p class="rentCost"><span class="rentalCost">'.$currencyPrefix.$theCost.' '.$payPeriod.'</span></p><div class="clear"></div>';
}

Solution

  • You should use the built-in shortcode api from wordpress.

    In your functions.php

    function thePrice( $atts ) {
    
    
       extract( shortcode_atts( array(
            'price' => 0 //default price
        ), $atts ) );
    
        //$price is now available and will hold the user entered price 
        //in the example below this would be 400
    
        /*
         Your conversion code here
         */
    
    }
    
    add_shortcode( 'convert_price', 'thePrice' );
    

    How to use the shortcode in the editor

    [convert_price price="400"]

    Now you can simply use the_content() in your template loop and the shortcodes will be properly rendered.