A small snippet from the WordPress Codex that displays the time since a post was published.
Add the following code to your functions.php file:
/**
* Display time since post was published
*
* @uses human_time_diff() Return time difference in easy to read format
* @uses get_the_time() Get the time the post was published
* @uses current_time() Get the current time
*
* @return string Timestamp since post was published
*
*/
function get_time_since_posted() {
$time_since_posted = 'Posted ' . human_time_diff( get_the_time( 'U' ), current_time( 'timestamp' ) ) . ' ago';
return $time_since_posted;
}
Then add the function inside the loop where you want it:
echo get_time_since_posted();
For another useful post meta display, see Display Estimated Post Reading Time.
A simple function that sets the number of words returned when you call the the_excerpt function in WordPress. Add to functions.php and change the number on line 4 as needed.
function custom_excerpt_length( $length ) {
return 40;
}
add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );
This uses the excerpt_length filter hook. Learn more in WordPress Hooks Explained.
Gravity Forms is an excellent plugin for adding forms to your WordPress site. It lets you do this easily and quickly and includes many options for functional changes to forms.
For some reason, the plugin does not allow removing the Submit button from its forms, so if you want to use it and embed your own button you will need to remove the plugin’s default button. Add the following line to your functions.php file:
add_filter( 'gform_submit_button', '__return_false' );
For more form customization tips, see Restrict Free Emails in Forms.
By default WordPress allows adding HTML tags in comments such as outbound links, various tags, etc.
Comments do contain rel=nofollow on links automatically, but if you want to completely disable the ability to add any HTML in comments, add the following line to your functions.php file:
add_filter( 'pre_comment_content', 'esc_html' );
The following code lets you change the logo on the WordPress login page as well as the link it points to:
add_filter( 'login_headerurl', 'namespace_login_headerurl' );
function namespace_login_headerurl( $url ) {
$url = home_url( '/' );
return $url;
}
function namespace_login_headertitle( $title ) {
$title = get_bloginfo( 'name' );
return $title;
}
add_filter( 'login_headertitle', 'namespace_login_headertitle' );
function namespace_login_style() {
echo '<style>.login h1 a { background-image: url( ' . get_template_directory_uri() . '/images/logo.png ) !important; }</style>';
}
add_action( 'login_head', 'namespace_login_style' );
For more login page security tips, see Hardening WordPress Security.
This snippet does something neat – it adds an option under the Settings menu with a link named “All Settings” that shows a full list of all settings in the database related to your WordPress site.
The code below shows this option only to site administrators and hides it from other users.
function all_settings_link() {
add_options_page(__('All Settings'), __('All Settings'), 'administrator', 'options.php');
}
add_action('admin_menu', 'all_settings_link');
For a broader WordPress overview, see What is WordPress?.
WordPress has a built-in function to check if you are on a specific page:
if ( is_page(5) ) {
// do some stuff
}
Or whether the page is a child of a specific page:
if ( $post->post_parent == '5' ) {
// do some stuff
}
But there is no built-in WordPress function that checks both conditions together, and this is very useful. For example – if we want to load a JS file for a videos page and all pages under it…
The following function (add to functions.php) creates a new logical function for this check:
function is_tree($the_page_id) {
global $post;
if(is_page()&&($post->post_parent==$the_page_id||is_page($the_page_id)))
return true;
else
return false;
};
Usage
if (is_tree(5)) {
// do some stuff
}
For more on WordPress page templates, see WordPress Template Hierarchy.
The following code lets you set the default post status on your WordPress site to Private.
<?php
function default_posts_to_private()
{
global $post;
if ( $post->post_status == 'publish' ) {
$visibility = 'public';
$visibility_trans = __('Public');
} elseif ( !empty( $post->post_password ) ) {
$visibility = 'password';
$visibility_trans = __('Password protected');
} elseif ( $post->post_type == 'post' && is_sticky( $post->ID ) ) {
$visibility = 'public';
$visibility_trans = __('Public, Sticky');
} else {
$post->post_password = '';
$visibility = 'private';
$visibility_trans = __('Private');
}
?>
<script type="text/javascript">
(function($){
try {
$('#post-visibility-display').text('<?php echo $visibility_trans; ?>');
$('#hidden-post-visibility').val('<?php echo $visibility; ?>');
$('#visibility-radio-<?php echo $visibility; ?>').attr('checked', true);
} catch(err){}
}) (jQuery);
</script>
<?php
add_action( 'post_submitbox_misc_actions' , 'default_posts_to_private' );
This uses a WordPress hook. Learn more in WordPress Hooks Explained.
When working on a project that requires creating multiple taxonomies, it makes sense to use this function rather than creating a separate function for each taxonomy. Put each taxonomy’s parameters in the array and the function handles the rest:
<?php
/**
* Register Multiple Taxonomies
*
*/
function register_multiple_taxonomies() {
$taxonomies = array(
array(
'slug' => 'job-department',
'single_name' => 'Department',
'plural_name' => 'Departments',
'post_type' => 'jobs',
'rewrite' => array( 'slug' => 'department' ),
),
array(
'slug' => 'job-type',
'single_name' => 'Type',
'plural_name' => 'Types',
'post_type' => 'jobs',
'hierarchical' => false,
),
array(
'slug' => 'job-experience',
'single_name' => 'Min-Experience',
'plural_name' => 'Min-Experiences',
'post_type' => 'jobs',
),
);
foreach( $taxonomies as $taxonomy ) {
$labels = array(
'name' => $taxonomy['plural_name'],
'singular_name' => $taxonomy['single_name'],
'search_items' => 'Search ' . $taxonomy['plural_name'],
'all_items' => 'All ' . $taxonomy['plural_name'],
'parent_item' => 'Parent ' . $taxonomy['single_name'],
'parent_item_colon' => 'Parent ' . $taxonomy['single_name'] . ':',
'edit_item' => 'Edit ' . $taxonomy['single_name'],
'update_item' => 'Update ' . $taxonomy['single_name'],
'add_new_item' => 'Add New ' . $taxonomy['single_name'],
'new_item_name' => 'New ' . $taxonomy['single_name'] . ' Name',
'menu_name' => $taxonomy['plural_name']
);
$rewrite = isset( $taxonomy['rewrite'] ) ? $taxonomy['rewrite'] : array( 'slug' => $taxonomy['slug'] );
$hierarchical = isset( $taxonomy['hierarchical'] ) ? $taxonomy['hierarchical'] : true;
register_taxonomy( $taxonomy['slug'], $taxonomy['post_type'], array(
'hierarchical' => $hierarchical,
'labels' => $labels,
'show_ui' => true,
'query_var' => true,
'rewrite' => $rewrite,
));
}
}
add_action( 'init', 'register_multiple_taxonomies' );
In my last project I needed to split the WordPress loop into groups of three posts – so if there are nine posts, every three would be wrapped in a div. You can do this using a counter and checking inside the loop whether it is a multiple of 3, and if so, closing the div. To change the number of posts per group, change the number 3 on line 14. Here is the code:
<?php if ( have_posts() ) :
$i = 0;
while ( have_posts() ) : the_post();
if ( $i % 3 == 0 ) { ?>
<div>
<?php } ?>
<div class="single_item">
<h2>
<a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?>
</a>
</h2>
</div>
<?php $i ++;
if ( $i % 3 == 0 ) { ?>
</div>
<?php } ?>
<?php endwhile; ?>
<?php
if ( $i % 3 != 0 ) { ?>
</div>
<?php } ?>
<?php endif; ?>
For more loop customization, see Remove a Category from the Main Loop.