Question

I've been struggling with this for a few days and still can't figure it how. What I am trying to do is to add a custom table field into the RSS feed, so I am using Code Snippets for this matter. Below is what I have nw, but believe I have tried all possible combinations that I could find on the WP site.

function featuredtoRSS($content) {
if ( has_post_thumbnail( $post->ID ) && get_post_type() == 'product'){
     global $wpdb;
     $price = $wpdb->get_row($wpdb->prepare("SELECT salePrice FROM ' . $wpdb->gm_ads_products . ' WHERE post_id = ' . $post->ID . '"));  //  this seems to be the issue
// $permalink_encoded = urlencode(get_post_permalink( $post->ID ));
$content = '<div>' . get_the_post_thumbnail( $post->ID, 'large', array( 'style' => 'margin-bottom: 15px;' ) ) . '</div><br/>&#9734;&#9734;&#9734;&#9734;&#9734; ' . wp_trim_words( get_the_title(), 10) . '<br/>' . $price . '<br/>' . wp_trim_words( get_the_content(), 55) . '<br/><a href="' . get_post_permalink( $post->ID ) . '"><button style="max-width:90% !important;display:block;position:relative;margin:0 auto;border: none; background: url(//4.bp.blogspot.com/-2EO8_Ohre5o/WlxIkEZmQfI/AAAAAAAAjQI/J6vLPjS2qxULn9W-NG9czoA2gfPspeS7gCLcBGAs/s320/get-it-now.jpg) no-repeat center left; padding: auto  auto; border-radius:20px;width:320px;height:72px;cursor:pointer;"></button></a>' . $price;
}
return $content;
}
add_filter('the_excerpt_rss', 'featuredtoRSS');
add_filter('the_content_feed', 'featuredtoRSS');

Any ideas? As you have already guessed, it is a shopping site. Not Woo. Everything works as it should in the code above, except for the $price, that does not show in the feed. The field I'd like to be displayed in the feed is salePrice, from the gm_ads_products table. It does display the result when executing a mysql query such as SELECT salePrice FROM gm_ads_products WHERE post_id = 244

Was it helpful?

Solution

$price = $wpdb->get_row($wpdb->prepare("SELECT salePrice FROM ' . $wpdb->gm_ads_products . ' WHERE post_id = ' . $post->ID . '")); // this seems to be the issue

Yes, that's right.

  1. First, because $wpdb->prepare() requires at least two parameters, one is the SQL query with placeholders like %d (for numbers) and the other is the replacement values that correspond to the placeholders used in the query.

  2. $wpdb->get_row() by default returns an object, hence you can't simply use the $price when outputting the salePrice value, i.e. echo $price; is like echo <object>; and that will cause a fatal error in PHP! So you should have used $price->salePrice, e.g. $price->salePrice . '<br/>' and not $price . '<br/>'.

  3. $post is not defined in your function, hence that $post->ID will not going to give you anything and instead, it would even throw a PHP notice saying you're trying to access a property of (and undefined and) a non-object variable.

  4. The generated SQL query is actually malformed which gives you something like this: SELECT salePrice FROM ' . table_name . ' WHERE post_id = ' . 1 . ' :( And that's because you used single quotes (') instead of double quotes (") when concatenating or generating the query.

How to fix the issue

  1. Define the $post variable by adding $post = get_post(); at the top in your function:

    function featuredtoRSS($content) {
    //  global $post; // Yes, this works.
        $post = get_post(); // But I prefer using get_post(). :)
    
        // ... the rest of your code here.
    }
    
  2. Then use this to query the salePrice value:

    $price = $wpdb->get_row( $wpdb->prepare(
        "SELECT salePrice FROM " . $wpdb->gm_ads_products . " WHERE post_id = %d",
        $post->ID // this will replace the placeholder %d above
    ) );
    $price = $price->salePrice;
    

    Alternatively, you can use $wpdb->get_var() which then enables you to do echo $price;, i.e. no need for the $price->salePrice:

    $id = (int) $post->ID;
    $price = $wpdb->get_var(
        "SELECT salePrice FROM " . $wpdb->gm_ads_products . " WHERE post_id = $id"
    );
    

    Note that in the above query, I didn't use $wpdb->prepare(), but I used the $id variable and I made sure that it's value is a number.

Also, make sure the $wpdb->gm_ads_products is actually defined and that it contains the correct table name — but it's not, try using gm_ads_products in place of $wpdb->gm_ads_products.

Licensed under: CC-BY-SA with attribution
Not affiliated with wordpress.stackexchange
scroll top