Skip to content
Read For Learn
Read For Learn
  • Database
    • Oracle
    • SQL
  • C
  • C++
  • Java
  • Java Script
  • jQuery
  • PHP
Read For Learn
  • Database
    • Oracle
    • SQL
  • C
  • C++
  • Java
  • Java Script
  • jQuery
  • PHP

Generate multiple goo.gl shortlinks for qtranslate bilingual blog

So I’ve managed to solve this. The googl_shortlink function from above now looks like this:

function googl_shortlink($url, $post_id = false) {
    global $post;
    if (!$post_id && $post) $post_id = $post->ID;
    elseif ($post_id) $post = get_post($post_id);
    // list all the active languages in an array 
    $enabled_languages = get_option('qtranslate_enabled_languages');

    if (is_404())
        return;

    if ($post && $post->post_status != 'publish')
        return "";

    // go through each active language, get the properly formatted permalink,
    // shorten it with goo.gl, then add it as a post_meta
    foreach ($enabled_languages as $lid=>$lang) {
        if ((is_singular() || $post) && !is_front_page() && qtrans_isAvailableIn($post_id,$lang)) {
            $shortlink = get_post_meta($post_id, '_googl_'.$lang.'_shortlink', true);
            if ($shortlink)
                return $shortlink;

            // the last parameter here was the major headache. It's called $forceadmin and defaults
            // to false (by default it doesn't prepend language-specific path to links generate in /wp-admin)
            $permalink = qtrans_convertURL(get_permalink($post_id),$lang,true);
            $shortlink = googl_shorten($permalink); // shorten the url. No changes done here

            if ($shortlink !== $url) {
                add_post_meta($post_id, '_googl_'.$lang.'_shortlink', $shortlink, true);
            } else {
                add_post_meta($post_id, '_googl_'.$lang.'_shortlink', $url, true);
            }
        }
    }
}

Trigger on save:

function googl_save_post($post_ID, $post) {
    // Don't act on auto drafts.
    if ($post->post_status == 'auto-draft')
        return;
    $enabled_languages = get_option('qtranslate_enabled_languages');
    foreach ($enabled_languages as $lid=>$lang)
        delete_post_meta($post_ID, '_googl_'.$lang.'_shortlink');
}
add_action('save_post', 'googl_save_post', 10, 2);

And show up in dashboard:

function googl_post_columns($columns) {
    $columns['shortlink'] = 'Shortlink';
    return $columns;    
}

function googl_custom_columns($column) {
    global $post;

    if ('shortlink' == $column) {
        $enabled_languages = get_option('qtranslate_enabled_languages');
        foreach ($enabled_languages as $lid=>$lang) {
            if (qtrans_isAvailableIn($post->ID,$lang)) {
                $shorturl = get_post_meta($post->ID, '_googl_'.$lang.'_shortlink', true);
                $shorturl_caption = str_replace('http://', '', $shorturl);
                $shorturl_info = str_replace('goo.gl/', 'goo.gl/info/', $shorturl);
                echo "$lang: <a href="https://wordpress.stackexchange.com/questions/53401/{$shorturl}">{$shorturl_caption}</a> (<a href="{$shorturl_info}">info</a>)<br />";
            }
        }
    }
}
add_action('manage_posts_custom_column', 'googl_custom_columns');
add_filter('manage_edit-post_columns', 'googl_post_columns');

Drawbacks

I was unable to make wp_get_shortlink() to work with the new shortlink schema. The above googl_shortlink doesn’t return anything, since that would make the foreach loop bail out after processing the first language. Quick replacement (could be easily wrapped in a function to make it more friendly):

// can be used anywhere in the loop to get the 
// shortlink for a specific post and language
get_post_meta($post->ID, '_googl_'.qtrans_getLanguage().'_shortlink', true);

Same thing goes for wp_shortlink_wp_head() (since it calls on wp_get_shortlink):

function googl_shortlink_wp_head() {
    global $post;
    $shortlink = get_post_meta($post->ID, '_googl_'.qtrans_getLanguage().'_shortlink', true);

    if (empty($shortlink))
        return;

    echo "<link rel="shortlink" href="".esc_url($shortlink)."" />\n";
}
// out with the old, in with the new
remove_action('wp_head','wp_shortlink_wp_head',10,0);
add_action('wp_head','googl_shortlink_wp_head',10,0);

Credits

Kudos goes to Konstantin Kovshenin for the simple, yet effective googl plugin.

Related Posts:

  1. How do I retrieve the slug of the current page?
  2. Most efficient way to get posts with postmeta
  3. Get posts by meta value
  4. Explanation of update_post_(meta/term)_cache
  5. How to extract data from a post meta serialized array?
  6. How to save an array with one metakey in postmeta?
  7. WordPress is stripping escape backslashes from JSON strings in post_meta
  8. Best WordPress Multi-language Plugin? [closed]
  9. How can I get the post ID from a WP_Query loop?
  10. Check if Post Title exists, Insert post if doesn’t, Add Incremental # to Meta if does
  11. How to update_post_meta value as array
  12. qTranslate get content by language [closed]
  13. Adding meta tag without plugin
  14. What’s the point of get_post_meta’s $single param?
  15. What is the different between an attachment in wp_posts and an attachment in wp_postmeta?
  16. How to edit a post meta data in a Gutenberg Block?
  17. Sanitizing integer input for update_post_meta
  18. post formats – how to switch meta boxes when changing format?
  19. Execute action after post is saved with all related post_meta records (data)
  20. Lack of composite indexes for meta tables
  21. Get a single post by a unique meta value
  22. if get_post_meta is empty do something
  23. How to determine current active language in qtranslate plugin? [closed]
  24. How we get_post_meta without post id
  25. How get post id from meta value
  26. What is the code to get the download link for a product in WooCommerce?
  27. Safe to delete blank postmeta?
  28. advanced custom fields update_field for field type: Taxonomy
  29. update_post_meta not saving when value is zero
  30. Content hooks vs User hooks
  31. Meta compare with date (stored as string) not working
  32. Titles in my sidebar widget appear in all languages – with qtranslate
  33. Trying to get custom post meta through Jetpack JSON API [closed]
  34. Disable qTranslate by post type in admin + disable per page / post ID on front-end [closed]
  35. How to update/insert custom field(post meta) data with wordpress REST API?
  36. Restrict post edit/delete based on user ID and custom field
  37. get_post_meta returning empty string when data shows in the database
  38. publish_post action hook doesn’t give post_meta_data
  39. Multi-language permalink in qtranslate
  40. Remove WordPress.org Meta link
  41. Remove post meta keys
  42. How to access the post meta of a post that has just been published?
  43. Why time functions show invalid time zone when using ‘c’ time format?
  44. Why is get_post_meta returning an array when I specify it as single?
  45. How to update/delete array in post meta value?
  46. How to get all term meta for a taxonomy – getting term_meta for taxonomy
  47. Adding an assisting editor box to Post page
  48. Is there a way to localize role labels?
  49. delete unused postmeta
  50. Should I sanitize custom post meta if it is going to be escaped later?
  51. Add post meta based on another post meta value before publish post
  52. Qtranslate displays empty categories with get_categories()
  53. How do I retrieve multi-dimensional arrays from the wp_postmeta table, & display on a website?
  54. Front-end update_post_meta snippet displays white screen?
  55. Query between two meta values?
  56. Save both current and new version of post meta
  57. Get Advanced Custom Fields values before saving [closed]
  58. Give extra post-meta to RSS feeds
  59. How to get meta value in wp_attachment_metadata
  60. WP REST API “rest_no_route” when trying to update meta
  61. Clean up output added via wp_head()
  62. List posts under meta_value heading
  63. Why am I getting an infinite loop with have_posts?
  64. Custom Meta Field not Working with qTranslate [closed]
  65. get_post_meta – get a single value
  66. delete value 0 in post meta [closed]
  67. Separate backend “Widgets” page for each language
  68. Can I safely delete a record, manually, in the wp postmeta table?
  69. How to store post meta in an array?
  70. What action hook updates post meta?
  71. Can’t translate the post meta data (Date) in another language
  72. get_post_meta / update_post_meta array
  73. adding a URL to a post meta
  74. Exclude a category from the filed under list
  75. Short of raw SQL, can I query for multiple attachment metadata that have a given array key?
  76. How do I access post meta data when publishing a new post in Gutenberg?
  77. update_post_meta() not working when used with WordPress action
  78. Qtranslate + Advanced Custom Fields: how to have a multilanguage wysiwyg editor? [closed]
  79. Using Advanced Custom Field (ACF) to insert meta description on each page
  80. Triple meta_key on custom SELECT query
  81. get_post_custom()
  82. Adding meta data to an attachment post
  83. update_post_meta not adding anything.(Nor add_post_meta)
  84. loop through all meta keys with get_post_meta
  85. Get posts by meta value with date
  86. How to add meta tag to wordpress posts filter?
  87. Are multiple values from get_post_meta guaranteed to be ordered?
  88. Identifying Importer Posts
  89. Get updated post meta on save_post action?
  90. Get post from meta_key and meta_value
  91. Add a post metadata if only the key and value does not exist
  92. get_post_meta returns bool(false)
  93. How metadata API works?
  94. Correct processing of `$_POST`, following WordPress Coding Standards
  95. Metabox Data not being saved [closed]
  96. How can I get values using key in Carbon Fields from Multiselect?
  97. Delete post meta conditionally after save post
  98. How to sanitize post meta field value?
  99. Problem With Order Item Meta In Woocommerce
  100. Job of meta_key meta_value fields in database tables
Categories post-meta Tags multi-language, plugin-qtranslate, post-meta
Update a users role based on number of posts published
Setting multiple image urls using WordPress’ Media Uploader

Recommended Hostings

Cloudways: Realize Your Website's Potential With Flexible & Affordable Hosting. 24/7/365 Support, Managed Security, Automated Backups, and 24/7 Real-time Monitoring.

FastComet: Fast SSD Hosting, Free Migration, Hack-Free Security, 24/7 Super Fast Support, 45 Day Money Back Guarantee.

Recent Added Topics

  • Bug in translation system: load_theme_textdomain() returns true, files are available and accessible but the language defaults to english
  • Custom Elementor controls not appearing in the widget Advanced tab using injection hooks
  • Get the name of the template/*html file used
  • Trying to Add Paging to Single Post Page
  • Sharing media files between live and staging servers
  • How to display the description of a custom post type in the dashboard?
  • Critical error on image display
  • Copying WP data and files into new install?
  • How to determine the DirectAdmin WordPress backup date?
  • How to get list of ALL tables in the database?
© 2026 Read For Learn
  • Database
    • Oracle
    • SQL
  • algorithm
  • asp.net
  • assembly
  • binary
  • c#
  • Git
  • hex
  • HTML
  • iOS
  • language angnostic
  • math
  • matlab
  • Tips & Trick
  • Tools
  • windows
  • C
  • C++
  • Java
  • javascript
  • Python
  • R
  • Java Script
  • jQuery
  • PHP
  • WordPress