9 hacks and snippets to extend WordPress functionality

9 hacks and snippets to extend WordPress functionality

It's been a long time that I haven't published a list of fresh and super useful snippets and hacks to enhance your WordPress install. So today I'm happy to show you this nifty list of coding tips to make your WordPress blog even more powerful.


Shortcode to display external files

If you need to display external files without posts or pages, here’s a useful shortcode to help. The code below goes into your theme’s functions.php:

function show_file_func( $atts ) {
  extract( shortcode_atts( array(
    'file' => ''
  ), $atts ) );
 
  if ($file!='')
    return @file_get_contents($file);
}
 
add_shortcode( 'show_file', 'show_file_func' );

And here’s how you use it:

[show_file file="https://catswhocode.com/blog"]

Source: Specky Boy

Remove featured image when deleting a post

The code below will automatically delete the featured image associated with a post, when the post in question is deleted. Just insert it into functions.php.

add_action( 'before_delete_post', 'wps_remove_attachment_with_post', 10 );
function wps_remove_attachment_with_post($post_id) {
        if(has_post_thumbnail( $post_id ))
        {
          $attachment_id = get_post_thumbnail_id( $post_id );
          wp_delete_attachment($attachment_id, true);
        }
}

Source: WP Snipp

Set default fallback thumbnail for featured images

This handy code snippet allows you to define a default fallback image for posts where a featured image isn’t defined.

This code has to be pasted anywhere you want the featured image or its fallback to be displayed, most commonly on index.php and single.php. Edit line 4 and replace the URL with the URL of your fallback image.

<?php if ( has_post_thumbnail() ) {
the_post_thumbnail();
} else { ?>
<img src="<?php bloginfo('template_directory'); ?>/images/default-image.jpg" alt="<?php the_title(); ?>" />
<?php } ?>

Source: WP Expertz

Manually move scripts and CSS files to the footer

In order to optimize your website speed, you sometimes might want to move scripts and stylesheet on the footer of your site. This example features how to do it on a WordPress blog, but any developer with a little bit of experience can modify the code to make it fit any kind of website.

First, open your functions.php file and paste the following code in it:

/**
 * Filter HTML code and leave allowed/disallowed tags only
 *
 * @param string 	$text 	Input HTML code.
 * @param string 	$tags 	Filtered tags.
 * @param bool 		$invert Define whether should leave or remove tags.
 * @return string Filtered tags
 */
function theme_strip_tags_content($text, $tags = '', $invert = false) {

    preg_match_all( '/<(.+?)[\s]*\/?[\s]*>/si', trim( $tags ), $tags );
    $tags = array_unique( $tags[1] );

    if ( is_array( $tags ) AND count( $tags ) > 0 ) {
        if ( false == $invert ) {
            return preg_replace( '@<(?!(?:'. implode( '|', $tags ) .')\b)(\w+)\b.*?>.*?</\1>@si', '', $text );
        }
        else {
            return preg_replace( '@<('. implode( '|', $tags ) .')\b.*?>.*?</\1>@si', '', $text );
        }
    }
    elseif ( false == $invert ) {
        return preg_replace( '@<(\w+)\b.*?>.*?</\1>@si', '', $text );
    }

    return $text;
}

/**
 * Generate script tags from given source code
 *
 * @param string $source HTML code.
 * @return string Filtered HTML code with script tags only
 */
function theme_insert_js($source) {

    $out = '';

    $fragment = new DOMDocument();
    $fragment->loadHTML( $source );

    $xp = new DOMXPath( $fragment );
    $result = $xp->query( '//script' );

    $scripts = array();
    $scripts_src = array();
    foreach ( $result as $key => $el ) {
        $src = $result->item( $key )->attributes->getNamedItem( 'src' )->value;
        if ( ! empty( $src ) ) {
            $scripts_src[] = $src;
        } else {
            $type = $result->item( $key )->attributes->getNamedItem( 'type' )->value;
            if ( empty( $type ) ) {
                $type = 'text/javascript';
            }

            $scripts[$type][] = $el->nodeValue;
        }
    }

    //used by inline code and rich snippets type like application/ld+json
    foreach ( $scripts as $key => $value ) {
        $out .= '<script type="'.$key.'">';

        foreach ( $value as $keyC => $valueC ) {
            $out .= "\n".$valueC;
        }

        $out .= '</script>';
    }

    //external script
    foreach ( $scripts_src as $value ) {
        $out .= '<script src="'.$value.'"></script>';
    }

    return $out;
}

Once done, edit your header.php file. Replace the wp_head() tag by this:

<?php
ob_start();
wp_head();
$themeHead = ob_get_contents();
ob_end_clean();
define( 'HEAD_CONTENT', $themeHead );

$allowedTags = '<style><link><meta><title>';
print theme_strip_tags_content( HEAD_CONTENT, $allowedTags );
?>

And finally, place the code below into your footer.php file, just before the closing </body> tag.

<?php theme_insert_js( HEAD_CONTENT ); ?>

Credit: Tomasz Dobrynski.

Only allow post author to reply to a comment on their post

If for some reason you only want to allow the post author to reply to comments, here’s a working solution. As often, you should add it to your theme’s functions.php file.

add_action( 'pre_comment_on_post', 'wpq_pre_commenting' );

function wpq_pre_commenting( $pid ) {
    $parent_id = filter_input( INPUT_POST, 'comment_parent', FILTER_SANITIZE_NUMBER_INT );
    $post = get_post( $pid );
    $cuid = get_current_user_id();

    if( ! is_null( $post ) && $post->post_author == $cuid && 0 == $parent_id ) {
        wp_die(	'Sorry, only post author can reply to a comment!' );
    }
} 

Source: GitHub

Display last modified date of a post

When you update your existing posts frequently, it is often more relevant to display the date of modification rather than the publishing date. Just paste this code where you want the date to be displayed. The function needs to be used within the loop.

<p>Last modified: <?php the_modified_date(); ?></p>

Source: WordPress Codex

Add Theme Editor shortcut to admin bar

If you often make modifications to your theme by using the built-in editor, it can be handy to add a shortcut to WordPress’ admin bar. Simply paste the code below in your functions.php file to proceed.

function admin_bar_theme_editor_option() {
    global $wp_admin_bar;
        if ( !is_super_admin() || !is_admin_bar_showing() )
        return;
        $wp_admin_bar->add_menu(
            array( 'id' => 'edit-theme',
            'title' => __('Edit Theme'),
                        'href' => admin_url( 'theme-editor.php')
        )
        );
    }
 
add_action( 'admin_bar_menu', 'admin_bar_theme_editor_option', 100 );

Source: WP Snippet

Schedule cron jobs with WordPress

Cron is a time-based job scheduler in Unix-like computer operating systems. It can be used within WordPress to schedule events, for example emptying your spam comment queue.
Here’s a basic code snippet to paste in your functions.php file, that will allow you to create a scheduled event.

<?php
add_action('my_hourly_event', 'do_this_hourly');

function my_activation() {
	if ( !wp_next_scheduled( 'my_hourly_event' ) ) {
		wp_schedule_event(time(), 'hourly', 'my_hourly_event');
	}
}
add_action('wp', 'my_activation');

function do_this_hourly() {
	// do something every hour
}
?>

Source: WP Snippets

Display a disclaimer on older posts

If you blog about technology, some articles that may have been useful 5 years ago can be completely outdated today. If a post is very old, it can be a good thing to warn your readers about it so they’ll know that the information they’re reading might be out of date.

Paste the following code in your single.php file, within the loop. Edit the sentence on line 7 as desired.

<?
$ageunix = get_the_time('U');
$days_old_in_seconds = ((time() - $ageunix));
$days_old = (($days_old_in_seconds/86400));

if ($days_old > 365) {
  echo '<div class="disclaimer">DISCLAIMER: this post is older than one year and may not be up to date with the latest WordPress version.</div>'; 
} 
?>

Source: CatsWhoCode

Enjoyed this article? Please consider donating: 3FVR5qaxYV8yAgNUUS7FC3o8c54YfDR5zK