0

I'm writing a simple SEO class that will add the various metatag to the header of wordpress. I've two little problems with the wordpress api. The first is that I need to remove the last comma from the tag list, I've tried with rtrim but without success. The secont problem is that I'm unable to load the content of the post or page to create the content of the description meta tag. How I can fix these two issues?

<?php

/*
* Plugin Name: Custom Meta Tag
*/

class WP_Custom_Meta_Tag{

  private $post_tags;
  private $key;
  private $keyword;
  private $description;

  public function init(){
    add_action('wp_head', array($this, 'add_meta_description'));
    add_action('wp_head', array($this, 'add_meta_keywords'));
  }

  /*
  * metatag keywords
  */
  public function add_meta_keywords(){
    if( is_single() ){
      $post_tags = get_the_tags( $post->ID );
      $key = '';
      foreach( $post_tags as $keyword ){
        $key .= $keyword->name.', ';
      }
      echo '<meta name="keywords" content="'.$key.'">';
    }

  }

  /*
  * metatag description
  */
  public function add_meta_description(){
    if( is_single() ){

      #$description = strip_tags( $post->post_content );
      $d = get_the_content( $post->ID );
      #$description = strip_shortcodes( $post->post_content );
      #$description = str_replace( array("\n", "\r", "\t"), ' ', $description );
      #$description = substr( $description, 0, 125 );

      #echo '<meta name="description" content="'. $description .'">';
      var_dump($d);
    }
  }

}

$meta = new WP_Custom_Meta_Tag;
$meta->init();
?> 

EDIT

I've fixed the issue, and now all seems to work correctly. If anyone has a suggestion to better trim the description text, please share an answer. I've read about wp_trim_words, but it will not work. Here is the updated code:

class WP_Custom_Meta_Tag{

  private $post_tags;
  private $key;
  private $keyword;
  private $description;

  public function init(){
    add_action('wp_head', array($this, 'add_metatags'), 1);
  }

  /*
  * metatag keywords
  */
  public function add_metatags(){
    global $post;
    if( is_single() || is_page() ){
      $post_tags = get_the_tags( $post->ID );
      $key = [];
      foreach( $post_tags as $keyword ){
        $key[] = $keyword->name;
      }
      // this part needs to be improved
      $description = strip_tags( $post->post_content );
      $description = strip_shortcodes( $post->post_content );
      $description = str_replace( array("\n", "\r", "\t"), ' ', $description );
      $description = substr( $description, 0, 140 );

      echo '<meta name="description" content="'. $description .'" />';
      echo '<meta name="keywords" content="'.implode(',' ,$key).'" />';
      echo '<meta property="og:title" content="'. get_the_title( $post->ID ) .'" />';
      echo '<meta property="og:description" content="'. $description .'"/>';
      #echo '<meta property="og:type" content="" />';
      echo '<meta property="og:url" content="'. get_the_permalink( $post->ID ) .'" />';
      if( has_post_thumbnail() ){
        echo '<meta property="og:image" content="'. get_the_post_thumbnail_url( $post->ID , 'full') .'" />';
      }
    }
  }

}

$meta = new WP_Custom_Meta_Tag;
$meta->init();
?>
0

I need to remove the last comma from the tag list

Put all $keyword->name into an array and use implode() to get the result.

I'm unable to load the content of the post or page

Object $post is not available in your function. Use global $post; to access $post->ID and $post->post_content etc.

So,

public function add_meta_keywords(){
    if( is_single() ){
      $post_tags = get_the_tags( $post->ID );
      $key = '';
      foreach( $post_tags as $keyword ){
        $key .= $keyword->name.', ';
      }
      echo '<meta name="keywords" content="'.$key.'">';
    }

  }

should be something like this

public function add_meta_keywords(){
    if( is_single() ){

      global $post;

      $post_tags = get_the_tags( $post->ID );
      $key = array();
      foreach( $post_tags as $keyword ){
        $key []= $keyword->name;
      }
      echo '<meta name="keywords" content="'.implode(', ',$key).'">';
    }

  }

And

public function add_meta_description(){
    if( is_single() ){

      #$description = strip_tags( $post->post_content );
      $d = get_the_content( $post->ID );
      #$description = strip_shortcodes( $post->post_content );
      #$description = str_replace( array("\n", "\r", "\t"), ' ', $description );
      #$description = substr( $description, 0, 125 );

      #echo '<meta name="description" content="'. $description .'">';
      var_dump($d);
    }
  }

should be

public function add_meta_description(){

    global $post;

    if( is_single() ){
      global $post;

      #$description = strip_tags( $post->post_content );
      $d = get_the_content( $post->ID );
      #$description = strip_shortcodes( $post->post_content );
      #$description = str_replace( array("\n", "\r", "\t"), ' ', $description );
      #$description = substr( $description, 0, 125 );

      #echo '<meta name="description" content="'. $description .'">';
      var_dump($d);
    }
  }

EDIT:

Better solution to trim the description to 140 characters.

TRY this

// Checks the content's length, if more 140 chars...
// Output  140 chars, but don't break a word

if ( strlen($description) > 140){

    $description = substr($description, 0, strpos($description, ' ', 140));
}

echo '<meta name="description" content="'. $description .'">';

I hope this helps.

  • thanks for your suggestions, I will try and let you know. – ZWPDev Mar 9 '19 at 13:22
  • If I want to assign to the add_action the execution priority, how I can do this? I've tried in the standard way, but the consolle will notify me an error, so I cant write the syntax add_action('wp_head', 'my_function', 1) – ZWPDev Mar 9 '19 at 13:31
  • @ZWPDev for priority issue, this answer may help. BTW what console error do yo get? – Qaisar Feroz Mar 9 '19 at 13:55
  • PHP Warning: call_user_func_array() expects parameter 1 to be a valid callback, array must have exactly two members I will look the answer, to try fix also this issue. I'm facing also a problem if I try to echo some og tags. – ZWPDev Mar 9 '19 at 14:06
  • It seems you used add_action('wp_head', array($this, 'add_meta_description', 1)); instead of ` add_action('wp_head', array($this, 'add_meta_description'), 1);` – Qaisar Feroz Mar 9 '19 at 14:12

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.