1

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

0

1 Answer 1

0

$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.

2
  • I mean, "(an undefined and)" and "but if it's not, try using gm_ads_products" ..
    – Sally CJ
    Feb 8, 2021 at 9:06
  • 1
    Thank you very much. It's finally doing its job :) I have to use both global $post; $post = get_post();and gm_ads_products in place of $wpdb->gm_ads_products, as suggested, but it works now. All the best. Feb 8, 2021 at 15:46

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.