Match tag names with form titles

The question:

I am trying to match tag names with form titles to fetch the correct form into the current post, to subscribe to new posts tagged with the current posts tag.
I only have 1 tag assigned per post.

The code for categories works well, and I tried to transcribe it for tags, but I am afraid there are syntax errors in the code, because it does not work.

How do I write the correct code?

add_shortcode( 'subscribe-to-tag', function() {
   global $wpdb, $post;
$the_tag = get_the_tags( $post->ID );
$tag_name = $the_tag[0]->tag_name;
   $id = $wpdb->get_var($wpdb->prepare("SELECT ID FROM wptq_forms WHERE name = '{$tag_name}';"));
   if (is_null($id)) { return ''; }
   return do_shortcode( '[newsletter_form id="' . intval( $id ) . '"]' );
} ); 

The Solutions:

Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.

Method 1

I don’t see PHP syntax errors (like unwanted brackets) in your code, but there are two WordPress-specific issues that need to be fixed:

  1. Note that wpdb::prepare() needs one or more placeholders (e.g. %s for strings and %d for numbers) and the replacement value for each placeholder.

    So in your case, the correct $wpdb->prepare() would be:

    $wpdb->prepare( "SELECT ID FROM wptq_forms WHERE name = %s", $tag_name );
  2. get_the_tags() returns an array of term objects on successful requests, and each object is a WP_Term instance which does not have a tag_name property, only name.

    Therefore $the_tag[0]->tag_name should instead be $the_tag[0]->name.

All methods was sourced from or, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Comment