How to fix Open Graph meta tags for single entry pages when using the WordPress SEO plugin

This article is meant to help you fix the Open Graph metatags of the single entry view when using the WordPress SEO plugin by Yoast. This will help you get a better behaviour when sharing your single entry view content on the social networks, specially on Facebook.

By default WordPress SEO plugin will output the following on the head section of a single entry view page:

<!-- This site is optimized with the Yoast WordPress SEO plugin v1.7.1 - https://yoast.com/wordpress/plugins/seo/ -->
<meta name="description" content="My WordPress SEO meta description"/>
<link rel="canonical" href="http://example.com/view/my-demo-issue-tracker/" />
<meta property="og:locale" content="en_US" />
<meta property="og:type" content="article" />
<meta property="og:title" content="My demo issue tracker view" />
<meta property="og:description" content="My WordPress SEO meta description" />
<meta property="og:url" content="http://example.com/view/my-demo-issue-tracker/" />
<meta property="og:site_name" content="Sandbox" />
<!-- / Yoast WordPress SEO plugin. -->

Fix the canonical link

As shown in the example above we want to transform the default canonical link

<link rel="canonical" href="http://example.com/view/my-demo-issue-tracker/" /> 

in the link to the current single entry view and not to the multiple entries view. To accomplish it, please paste the following code in your theme's functions.php:

# For all Yoast versions
add_filter( 'wpseo_canonical', 'my_gv_yoast_canonical_url' );

function my_gv_yoast_canonical_url( $canonical_url ) {
    return ( function_exists( 'gravityview_is_single_entry' ) && gravityview_is_single_entry() ) ? 
        add_query_arg( array() ) : 
        $canonical_url;
};

The new link will look like this: <link rel="canonical" href="http://example.com/view/my-demo-issue-tracker/entry/1384/" />

Fix the og:title and title 

In order to make sure the opengraph title tag is specific for your single entry view, please add the following code to your theme's functions.php making sure to customise the code for your own FORM ID and choosing the right form field (FIELD ID) to be used as input for the title.

# For Yoast v13 and below
add_filter( 'wpseo_title', 'my_gv_yoast_title_and_opengraph_title', 10, 1 );

# For Yoast v14 and above
add_filter( 'wpseo_title', 'my_gv_yoast_title_and_opengraph_title', 10, 1 );
add_filter( 'wpseo_opengraph_title', 'my_gv_yoast_title_and_opengraph_title', 10, 1 );

function my_gv_yoast_title_and_opengraph_title( $title ) {
    if ( ! function_exists( 'gravityview_is_single_entry' ) || ! function_exists( 'gravityview_get_entry' ) ) {
        return $title;
    }

    // Get single Entry id
    $entry_id = gravityview_is_single_entry();
    if ( empty( $entry_id ) ) {
        return $title;
    }

    // Get Entry
    $entry = gravityview_get_entry( $entry_id );
    if (! $entry ) {
        return $title;
    }

    $form_id = empty( $entry['form_id'] ) ? '' : $entry['form_id'];
    $title_field = null;

    switch ( $form_id ) {
        // Your form ID
        case '1':
            // Title field ID
            $title_field = '2';
            break;
    }

    return ( $title_field && ! empty( $entry[ $title_field ] ) ) ? 
        $entry[ $title_field ] : 
        $title;
};

After applying this code you should expect a different og:title meta: <meta property="og:title" content="Sit amet turpis elementum ligula vehicula" />

Fix the og:description and description

If you would like to make sure the description meta tag is also customised according to the entry information, place the following code into your theme's functions.php making sure to adapt it to your own FORM ID and selecting the FIELD ID that will populate the meta values.

# For Yoast v13 and below
add_filter( 'wpseo_metadesc', 'my_gv_yoast_meta_and_opengraph_description', 10, 1 );

# For Yoast v14 and above
add_filter( 'wpseo_metadesc', 'my_gv_yoast_meta_and_opengraph_description', 10, 1 );
add_filter( 'wpseo_opengraph_desc', 'my_gv_yoast_meta_and_opengraph_description', 10, 1 );

function my_gv_yoast_meta_and_opengraph_description( $desc ) {
    if ( ! function_exists( 'gravityview_is_single_entry' ) || ! function_exists( 'gravityview_get_entry' ) ) {
        return $desc;
    }

    // Get single Entry id
    $entry_id = gravityview_is_single_entry();
    if ( empty( $entry_id ) ) {
        return $desc;
    }

    // Get Entry
    $entry = gravityview_get_entry( $entry_id );
    if (! $entry ) {
        return $desc;
    }

    $form_id = empty( $entry['form_id'] ) ? '' : $entry['form_id'];
    $desc_field = null;

    switch ( $form_id ) {
        // Your form ID
        case '1':
            // Description field ID
            $desc_field = '2';
            break;
    }

    return ( $desc_field && ! empty( $entry[ $desc_field ] ) ) ? 
        $entry[ $desc_field ] : 
        $desc;
};

This code will affect the following lines:

<meta name="description" content="sit amet turpis elementum ligula vehicula consequat morbi a ipsum integer a nibh in quis justo maecenas"/>
<meta property="og:description" content="sit amet turpis elementum ligula vehicula consequat morbi a ipsum integer a nibh in quis justo maecenas" />

Fix the og:image

To make sure WordPress SEO picks the image according to the displayed entry, paste the following code into your theme's functions.php, making sure to address the correct FORM ID and FIELD ID.

# For Yoast v13 and below
add_action( 'wpseo_opengraph', 'my_gv_yoast_v13_opengraph_image', 10, 1);

function my_gv_yoast_v13_opengraph_image( $img ) {
    if ( ! function_exists( 'gravityview_is_single_entry' ) || ! function_exists( 'gravityview_get_entry' ) ) {
        return $img;
    }

    // Get single Entry ID
    $entry_id = gravityview_is_single_entry();
    if ( empty( $entry_id ) ) {
        return $img;
    }

    // Get Entry
    $entry = gravityview_get_entry( $entry_id );
    if (! $entry ) {
        return $img;
    }

    $form_id = empty( $entry['form_id'] ) ? '' : $entry['form_id'];
    $img_field = null;

    switch ( $form_id ) {
       // Your form ID
        case '1':
            // Image field ID
            $img_field = '2';
            break;
    }

    $img = ( $img_field && ! empty( $entry[ $img_field ] ) ) ? $entry[ $img_field ] : $img;

    $opengraph_image = new WPSEO_OpenGraph_Image( $image, $GLOBALS['wpseo_og'] );
    $opengraph_image->add_image( $img );
    $opengraph_image->show();
};

# For Yoast v14 and above
add_filter( 'wpseo_opengraph_image', 'my_gv_yoast_v14_opengraph_image', 10, 1 );

function my_gv_yoast_v14_opengraph_image( $img ) {
    if ( ! function_exists( 'gravityview_is_single_entry' ) || ! function_exists( 'gravityview_get_entry' ) ) {
        return $img;
    }

    // Get single Entry ID
    $entry_id = gravityview_is_single_entry();
    if ( empty( $entry_id ) ) {
        return $img;
    }

    // Get Entry
    $entry = gravityview_get_entry( $entry_id );
    if (! $entry ) {
        return $img;
    }

    $form_id = empty( $entry['form_id'] ) ? '' : $entry['form_id'];
    $img_field = null;

    switch ( $form_id ) {
       // Your form ID
        case '1':
            // Image field ID
            $img_field = '2';
            break;
    }

    return ( $img_field && ! empty( $entry[ $img_field ] ) ) ? 
        $entry[ $img_field ] : 
        $img;
};

You should get a proper image meta tag as follows: <meta property="og:image" content="https://example.com/131357700_9b7f1079d4.jpg" />

Read more about the  WordPress SEO plugin available hooks.

Did this answer your question? Thanks for the feedback There was a problem submitting your feedback. Please try again later.