Ben Lobaugh Online

I think, therefore I am. I am, therefore I sail

Category: WordPress Page 2 of 20

WordPress: Add category to permalink and redirect old permalinks

Occasionally you run across a situation where a website permalink structure needs to be changed from what it has been to a new structure. Most sites that have been public will have links to them from other websites that need to properly redirect to the new permalink structure. Removing an element from the permalink structure and redirecting old links is trivial, however adding an additional element to the url structure can be difficult. For example:

A fairly typical structure is: /%year%/%month%/%day%/%postname%/

Lets use a simple example of adding the category to the permalink structure: /%category%/%year%/%month%/%day%/%postname%/

To provide a more useful example:

Original: https://ben.lobaugh.net/2016/05/15/cruising-the-san-juans
With category: https://ben.lobaugh.net/sailing/2016/05/15/cruising-the-san-juans

The original url is going to display the 404 page. I am going to provide an example that you can use in your own site to capture the url causing the 404 and attempt to locate the new post permalink. If none can be found it will fallback to the 404 page. As long as there is something in the original url you can use to locate a post (like the  %postname%) this method will work with minor tweaks.

add_action( 'template_redirect', 'maybe_redirect_404_old_permalink' );
/**
 * Attempts to forward old permalinks to the new permalink structure
 *
 * @author Ben Lobaugh
 */
function maybe_redirect_404_old_permalink() {
    // Only run this function if we are on a 404
    if( ! is_404() ) {
        return;
    }
 
    // "trick" to get the full URL
    $url = add_query_arg( '', '' );

    /*
     * Pull the URL path apart to find a slug (post_name)
     * The final segment should be the slug
     */
    $parts = explode( '/', $url );
    $parts = array_filter( $parts );
    $size = count( $parts );
    $maybe_slug = $parts[ $size ]; // We use size here because the filter turned 1 based

    // Attempt to locate corresponding post in the database
    $args = array(
        'name'        => $maybe_slug,
        'post_type'   => 'post',
        'post_status' => 'publish',
        'numberposts' => 1,
    );

    $posts = get_posts( $args );

    // Identify a found post
    if( $posts && ! empty( $posts[0]->ID ) ) {
        $post_id = $posts[0]->ID;

        $post_url = get_permalink( $post_id );

        // Attempt to forward to the new post permalink
        if( $post_url ) {
            wp_safe_redirect( $post_url, 301 ); // Permanent redirect
        }
    }

    /*
     * If we made it down here then we could not find a matching post in
     * the database. No biggie, simply do nothing and display the 404 page
     * as normal 🙂
     */
}

Prevent WordPress plugins from requesting updates

Ever need to “lock” a plugin into a specific version and do not want it showing in the updates list and getting accidentally updated?

This quick snippet allows you to specify a plugin(s) that should not appear in the update list. This will effectively block them from updating through WordPress itself. Manual updates/changes to the plugin(s) is still possible however.

add_filter( 'site_transient_update_plugins', array( 'no_updates_for_you' ) );

function no_updates_for_you( $value ) {
    $plugin = '[plugin_folder]/[plugin_file].php';
    if ( empty( $value ) || empty( $value->response[$plugin] ) ) {
      return $value;
    }
    unset( $value->response[$plugin] );
    return $value;
}

Be sure to change [plugin_folder]/[plugin_file].php to the plugin you want to prevent updating.

Getting social media shares with php

Quick snippets to help me (and maybe you!) remember how to quickly and easily get share counts from social networks.

What other networks would you like to see?

Facebook

function facebook_share_count( $post_id ) {
  $api = "https://graph.facebook.com/";
  
  $url = $api . urlencode( get_permalink( $post_id ) );
  
  $response = wp_remote_get( $url );
  if( is_wp_error( $response ) ) {
    return 0;
  }
  if( '200' != wp_remote_retrieve_response_code( $response ) ) {
    // Bad url
    return 0;
  }
  $body = wp_remote_retrieve_body( $response );
  $body = json_decode( $body );
  if( isset( $body->shares ) ) {
    // Shares will not be set if there are none!
    return $body->shares;
  }
  return 0;
}

Twitter

NOTE: ***Twitter will be shutting down this API*** No replacement has been announced.

function twitter_share_count( $post_id ) {
  // Check for transient
  if ( ! ( $count = get_transient( 'twitter_count' . $post_id ) ) ) {
    // Do API call
    $response = wp_remote_retrieve_body( wp_remote_get( 'https://cdn.api.twitter.com/1/urls/count.json?url=' . urlencode( get_permalink( $post_id ) ) ) );
    // If error in API call, stop and don't store transient
    if ( is_wp_error( $response ) )
      return 'error';
    // Decode JSON
    $json = json_decode( $response );
    // Set total count
    $count = absint( $json->count );
    // Set transient to expire every 30 minutes
    set_transient( 'twitter_count' . $post_id, absint( $count ), 30 * MINUTE_IN_SECONDS );
  }
 return absint( $count );
}

LinkedIn

function linkedin_share_count( $post_id ) {
  $api = 'http://www.linkedin.com/countserv/count/share?format=json&url=';
  $api .= urlencode( get_permalink( $post_id ) );
  if ( ! ( $count = get_transient( 'linkedin_count' . $post_id ) ) ) {
    $response = wp_remote_get( $api );
    if( is_wp_error( $response ) ) {
      // eat it
      return 0;
    }
    // Should verify the correct json is returned
    $json = json_decode( wp_remote_retrieve_body( $response ) );
    $count = (int) $json->count;
    set_transient( 'linkedin_count' . $post_id, absint( $count ), 30 * MINUTE_IN_SECONDS );
  }
  return $count;
}

Basic WordPress Terminology: What the Layperson Should Know

WordPress proudly touts its user first design for ease of use, but on other end of the spectrum are the website owners. Even the owner of a simple website is instantly barraged with the seeming jumble of terms, acronyms, and phrases that make up a typical WordPress installation. An experienced WordPress website owner may not give a second thought to this jungle of words, but a new WordPress website owner may be daunted by terms like ‘taxonomy’ and ‘shortcode.’

Read More

Remove admin color scheme picker from WordPress Profiles

If you want to clean up the WordPress user profile page in wp-admin by removing the color scheme picker here is a quick snippet that will do the task quickly for you.

remove_action( 'admin_color_scheme_picker', 'admin_color_scheme_picker' );

Page 2 of 20

Powered by WordPress & Drip City Coffee