WordPress DevelopmentBest Collection of Code for your functions.php file
[+312] [108]
[2010-09-09 08:29:00]
[ plugins functions customization admin pluggable ]
[ ]

Please vote on the question and any answers you find useful by clicking on the UP arrow on the left hand side of the question or answer.

As with many others who are now viewing this post, I have been reading various blogs, forums, and discussion groups to learn and improve my wordpress skills. Over the past 12 months I have been on a mission to substitute my use of plugins by adding code to my functions.php file instead. While I completely agree that plugins are very useful in many situations my experience proved that in 90% of usage cases although a plugin might exist, actually utilizing it could create unnecessary complications and compatibility issues. Additionally in a great deal of cases such plugins added menus and other admin elements which I don't want or need.

More often than not I have found that by analyzing the code of plugins I was able to strip out the piece of code I wanted and hard code it into my functions.php. This provided me with the exact functionality I needed without having to include unnecessary elements.

So, the purpose of this post is my attempt to engage you, the reader/admin/developer, to share with me and other here any code bits which you find useful and have added to your theme's function.php file to extend or enhance WordPress without utilizing a plugin.

When you submit a response here please kindly give each code bit a title, let us know if with what version of wordpress you know its compatible with, include whatever description you feel best describes its function and (if applicable) include a link to the original plugin or source where you found the information.

I am looking forward to all your responses and will of course continually add my own new finds whenever I find them.

Pleae add your old, existing findings as well. - hakre
(1) Hi @NetConstructor: I'm concerned about this question because it's a "List of X" question the StackExchange people have told us to look out for:… My big concern is when I think of your question I can envision an almost infinite number of answers and as such I'm concerned that this question will result in a collection of random answers but nothing definitive. I want to get other's opinions on this before I (vote to) close it though as I don't want to be heavy handed, I just have concerns. - MikeSchinkel
My vote is either close or make community wiki - Chris_O
(13) Considering the first 5 answers were by the OP and the question seems more geared at collecting an array of responses rather than a single, definitive answer, this should be a community wiki. - EAMann
seems that one can not just modify a question into a wiki. Is this correct? -
(1) Nonetheless this is useful (I have found 2 snippets I will be making heavy use of)if it's to be a community wiki and has to be started fresh to do that maybe we can just move the stuff here there? - Ash G ... I converted the question into a wiki when I wrote my last comment. Sorry if that caused any confusion. Normally, you (as the OP) can turn a question into a wiki at any time. - EAMann
@EAMann thanks... I was looking for that option but was not sure where it was located. Maybe after you converted it I just did not see the option anymore? - - Bingo. Once it's converted, it's converted ... the option is set and disappears from the page. - EAMann
I would consider this bad style and prefer plugins. a) They are built by dedicated deveoplers b) they are maintained and easily upgraded. For little custom snippets I recommend the plugin Shortcode Exec PHP which yields a very clean -- and portable -- way to customize your Wordpress. - Raphael
while interesting I believe most people would agree that when your developing themes you want things localized within a functions.php file -
@NetConstructor - If you're going to edit others entries, can you please take care when doing so, you spoiled the indentation in my posting, i always make an effort to maintain indentation for readability. I'd also appreciate it if you could take the time to explain edits you make(i couldn't see any reason for your to edit my entry - and there was no edit summary). - t31os
@t31os -- I edited it to keep it consistent with all of the entries -
(17) All answers not related to a theme should be removed. This thread is a good example for bad coding practices. - fuxia
(1) I would have to disagree. Question was not related to the theme. All applicable functions.PHP mods are welcome and users should up/down vote accordingly. -
(1) It's interesting that it's not mentioned anywhere that the functions.php file is the one in your theme directory, leading to confusion, such as this:… - scribu
(17) I think it'd be better to encourage people to create a custom functionality plugin instead of using their theme's functions.php - Ian Dunn
@rarst - Regarding to your comment on closing this thread, isn't this the reason why it's listed in the community wiki? - user5424
@Cor van Noorloos the use of community wiki status had been greatly reduced and discouraged by network. Simply put "it's not really good fit for QA, but it's community wiki!" excuse doesn't fly anymore. Answers here became disorderly and poorly maintained glob, only visited for wow/fun factor. There had been a lot of movement all over network to squash questions like this. - Rarst
@rarst - Understandable. Point taken. - user5424
(1) In regards to the closing of this specific "wiki" I vote that this be reopend. Obviously this wiki post is highly popular demonstrated by the fact that it has 30,000 views which is three times the amount of ANY other question or wiki on this site and the topic itself has been up-voted 119 times which is double that of any other question or topic. If you agree in its value please vote to have it reopen by clicking the "reopen" link. -
(3) The pure number of page views is not an indicator for quality. We should encourage specific questions with specific answers and good coding practices. This thread is the opposite. - fuxia
@toscho - that is specifically why this was setup as a wiki and therefore this post is perfectly valid. The point I made in respect to page views was mentioned because this topic obviously is 3X as popular as any other topic on this site. This website is popular specifically due to questions like these and therefore it makes no sense to close it. I don't think one can debate this unless community interest in topics like these has no value towards admins. -
I will add one more comment on here based off some math I just did. There are less than 790 registered users on this website with a rating of "1" or more. Assuming this pool of individuals represents those who actually vote and/or contribute to this site (and 790 being incredibly fair) then 117 people who voted this question up represents 14%+ of all active users who found this topic useful. Vote to reopen the topic please. -
(6) Discuss it on Meta where people can see your arguments better. :) - fuxia
stop client from messing with wordpress plugin & theme customization that can cause complete shutdown of website, find how you can do it here :… - DHL17
[+101] [2010-09-10 09:28:54]

Enable Hidden Admin Feature displaying ALL Site Settings

Tested on: Wordpress 3.1 RC3

This little piece of code does something pretty cool. It will add an additional option to your settings menu with a link to "all settings" which will show you a complete list of all the settings you have within your database related to your wordpress site. The code below will only made this link visible to an admin user and hide it for all other users.

   function all_settings_link() {
    add_options_page(__('All Settings'), __('All Settings'), 'administrator', 'options.php');
   add_action('admin_menu', 'all_settings_link');

Fantastic for development! I use the options table frequently to store DB versions for my plug-ins ... using phpMyAdmin to reset to an old DB version to test an upgrade script is a pain ... this will make it so much easier!!! - EAMann
(3) You can also get to the same options page (when logged in) by going to yoursite/wp-admin/options.php - j08691
[+85] [2010-09-10 09:01:29]

Modify the Login Logo & Image URL Link

Tested on: WordPress 3.0.1

This code will allow you to easily modify the WordPress Login page Logo as well as the href link and title text of this logo.

add_filter( 'login_headerurl', 'namespace_login_headerurl' );
 * Replaces the login header logo URL
 * @param $url
function namespace_login_headerurl( $url ) {
    $url = home_url( '/' );
    return $url;

add_filter( 'login_headertitle', 'namespace_login_headertitle' );
 * Replaces the login header logo title
 * @param $title
function namespace_login_headertitle( $title ) {
    $title = get_bloginfo( 'name' );
    return $title;

add_action( 'login_head', 'namespace_login_style' );
 * Replaces the login header logo
function namespace_login_style() {
    echo '<style>.login h1 a { background-image: url( ' . get_template_directory_uri() . '/images/logo.png ) !important; }</style>';

EDIT: If you want to use the site logo to replace the login logo, you can use the following to dynamically pull that information (tested on WP3.5):

function namespace_login_style() {
    if( function_exists('get_custom_header') ){
        $width = get_custom_header()->width;
        $height = get_custom_header()->height;
    } else {
        $width = HEADER_IMAGE_WIDTH;
        $height = HEADER_IMAGE_HEIGHT;
    echo '<style>'.PHP_EOL;
    echo '.login h1 a {'.PHP_EOL; 
    echo '  background-image: url( '; header_image(); echo ' ) !important; '.PHP_EOL;
    echo '  width: '.$width.'px !important;'.PHP_EOL;
    echo '  height: '.$height.'px !important;'.PHP_EOL;
    echo '  background-size: '.$width.'px '.$height.'px !important;'.PHP_EOL;
    echo '}'.PHP_EOL;
    echo '</style>'.PHP_EOL;

[+74] [2010-11-09 03:27:05] jaredwilli

Include custom post types in the search results.

function searchAll( $query ) {
 if ( $query->is_search ) { $query->set( 'post_type', array( 'site', 'plugin', 'theme', 'person' )); } 
 return $query;
add_filter( 'the_search_query', 'searchAll' );

Add your custom post types to your sites main RSS feed by default.

function custom_feed_request( $vars ) {
 if (isset($vars['feed']) && !isset($vars['post_type']))
  $vars['post_type'] = array( 'post', 'site', 'plugin', 'theme', 'person' );
 return $vars;
add_filter( 'request', 'custom_feed_request' );

Include custom post types in "Right Now" admin dashboard widget

This will include your custom post types and the post counts for each type in the "Right Now" dashboard widget.

function wph_right_now_content_table_end() {
 $args = array(
  'public' => true ,
  '_builtin' => false
 $output = 'object';
 $operator = 'and';
 $post_types = get_post_types( $args , $output , $operator );
 foreach( $post_types as $post_type ) {
  $num_posts = wp_count_posts( $post_type->name );
  $num = number_format_i18n( $num_posts->publish );
  $text = _n( $post_type->labels->singular_name, $post_type->labels->name , intval( $num_posts->publish ) );
  if ( current_user_can( 'edit_posts' ) ) {
   $num = "<a href='edit.php?post_type=$post_type->name'>$num</a>";
   $text = "<a href='edit.php?post_type=$post_type->name'>$text</a>";
  echo '<tr><td class="first num b b-' . $post_type->name . '">' . $num . '</td>';
  echo '<td class="text t ' . $post_type->name . '">' . $text . '</td></tr>';
 $taxonomies = get_taxonomies( $args , $output , $operator ); 
 foreach( $taxonomies as $taxonomy ) {
  $num_terms  = wp_count_terms( $taxonomy->name );
  $num = number_format_i18n( $num_terms );
  $text = _n( $taxonomy->labels->singular_name, $taxonomy->labels->name , intval( $num_terms ));
  if ( current_user_can( 'manage_categories' ) ) {
   $num = "<a href='edit-tags.php?taxonomy=$taxonomy->name'>$num</a>";
   $text = "<a href='edit-tags.php?taxonomy=$taxonomy->name'>$text</a>";
  echo '<tr><td class="first b b-' . $taxonomy->name . '">' . $num . '</td>';
  echo '<td class="t ' . $taxonomy->name . '">' . $text . '</td></tr>';
add_action( 'right_now_content_table_end' , 'wph_right_now_content_table_end' );

Regarding the last snippet to this answer. This is a great addition as I was adding these manually for each post type. The only issue I have with this is that it adds the data after the default "category" and "tag" entry. Could you update your answer to move the default "category" or "tag" ones down or remove them so that they can be added manually? - I don't think I understand your request. If I do, then I think it would be a bit more of a difficult thing to do, and don't really have time right now to figure out how to do it. - jaredwilli
Include custom post types in the search results - I guess, now you can do this with exclude_from_search param of register_post_type... - Krzysiek Dróżdż
[+73] [2010-09-09 14:19:40]

Remove Update Notification for all users except ADMIN User

Tested on: Wordpress 3.0.1

This code will ensures that no users other than "admin" are notified by wordpress when updates are available..

   global $user_login;
   if ($user_login !== "admin") { // change admin to the username that gets the updates
    add_action( 'init', create_function( '$a', "remove_action( 'init', 'wp_version_check' );" ), 2 );
    add_filter( 'pre_option_update_core', create_function( '$a', "return null;" ) );

Changed version to only show update notification for admin users (as opposed to just the user 'admin'):

       global $user_login;
       if (!current_user_can('update_plugins')) { // checks to see if current user can update plugins 
        add_action( 'init', create_function( '$a', "remove_action( 'init', 'wp_version_check' );" ), 2 );
        add_filter( 'pre_option_update_core', create_function( '$a', "return null;" ) );

(8) This is far less than ideal. It will only work if the admin's login is still the default 'admin', which it shoudln't be for security reasons. Instead you should check for a specific capability that you want people to have to see messages. - jerclarke
(1) I.e. if (!current_user_can('manage_options')) {...add_filter...} -- Sorry about double comment, I forgot that hitting enter submits comments) - jerclarke
Thats why I added the comment to the code where you can change the admin username. How would you improve/rewrite it? -
The best way is to remove the global $user_login and get_currentuserinfo() and instead use current_user_can in your if clause. It's only 1 line instead of 3 and its the standard way. You can check for the specific capability that would be needed to ACT on the messages, in this case there's 'update_core' and 'update_plugins'. - jerclarke
(2) so: if (!current_user_can('update_plugins')) {/*REMOVE MESSAGES*/} - jerclarke
so the full code would look like what? -
@Jeremy Clarke so would this code then be the correct way of doing things? But, if you just wanted to allow a specific username to get the notices would the code above be the best way? if (!current_user_can('update_plugins')) { add_action( 'init', create_function( '$a', "remove_action( 'init', 'wp_version_check' );" ), 2 ); add_filter( 'pre_option_update_core', create_function( '$a', "return null;" )); } -
If you wanted to check for a specific user name I suppose your code in the original answer is acceptable, though there may be a slightly more effective way. The full code using my solution would look like what you have in your last comment. It's the same as your answer but with the current_user_can() check instead of the $user_login !== 'admin'. - jerclarke
I edited the answer and added the version that uses current_user_can('update_plugins') - Travis Northcutt
This logic must go inside the core - Atif Mohammed Ameenuddin
I just tried the codes. But I am getting some error page if I use the codes. Same problem with both the codes - user391
I think this snippet lost it's relevance over the years. In actual WordPress the administrator is the only one who is seeing update notifications. - netblognet
[+68] [2010-09-16 16:06:46] Derek Perkins

Loading jQuery from the Google CDN

Tested on: Wordpress 3.0.1

// even more smart jquery inclusion :)
add_action( 'init', 'jquery_register' );

// register from google and for footer
function jquery_register() {

if ( !is_admin() ) {

    wp_deregister_script( 'jquery' );
    wp_register_script( 'jquery', ( '' ), false, null, true );
    wp_enqueue_script( 'jquery' );

Remove the WordPress Version Info for Security

Tested on: Wordpress 3.0.1

// remove version info from head and feeds
function complete_version_removal() {
    return '';
add_filter('the_generator', 'complete_version_removal');

Add Spam & Delete Links to Comments on Front End

Tested on: Wordpress 3.0.1

This makes it way easier to manage comments from the front end by adding spam and delete links.**

// spam & delete links for all versions of wordpress
function delete_comment_link($id) {
    if (current_user_can('edit_post')) {
        echo '| <a href="'.get_bloginfo('wpurl').'/wp-admin/comment.php?action=cdc&c='.$id.'">del</a> ';
        echo '| <a href="'.get_bloginfo('wpurl').'/wp-admin/comment.php?action=cdc&dt=spam&c='.$id.'">spam</a>';

Delay the public posting to RSS Feed

Tested on: Wordpress 3.0.1

Finally, I like to delay posting to my RSS feeds for 10-15 minutes because I always find at least a couple errors in my text. Other uses are in case you want content to be exclusive to your site for a day or a week before pushing it out to your RSS readers.

// delay feed update
function publish_later_on_feed($where) {
    global $wpdb;

    if (is_feed()) {
        // timestamp in WP-format
        $now = gmdate('Y-m-d H:i:s');

        // value for wait; + device
        $wait = '10'; // integer

        $device = 'MINUTE'; // MINUTE, HOUR, DAY, WEEK, MONTH, YEAR

        // add SQL-sytax to default $where
        $where .= " AND TIMESTAMPDIFF($device, $wpdb->posts.post_date_gmt, '$now') > $wait ";
    return $where;
add_filter('posts_where', 'publish_later_on_feed');

source on my post: with more informations - bueltge
(1) You can also just remove the generator filter: remove_action('wp_head', 'wp_generator'); - Gipetto
Why dont we use google cdn for admin too? I didnt get it - Ünsal Korkmaz
@Derek Perkins - Can you make each of these code snippets a different answer so they can each be voted on separately? - MikeSchinkel
(25) expires after just one hour. Always use the full version information like – that expires after one year. - fuxia
Can you please split each of these wiki entries up into separate entries within the next few weeks. I wanted to do it for you but I did not want to make it seem like I am trying to take points for information you shared. -
(5) The "Remove the WordPress Version Info for Security" code doesn't actually do anything to increase the security of your site. It doesn't even stop exposure of the WP version being used on your site. - Joseph Scott
(1) Not true Joseph, if your WordPress version is exposed then people can see if you are running an older version, thus exposing your vulnerabilities. It is always a good decision to remove that from all WordPress installs. Personally, I don't even know why they put it there in the first place as it IS a security issue. - Jeremy
[+54] [2010-11-28 11:59:08] Denis de Bernardy

Wordpress Profiling tools

I like to add profiling tools in a separate file, which I then include from functions.php when needed:

if ( !defined('SAVEQUERIES') && isset($_GET['debug']) && $_GET['debug'] == 'sql' )
    define('SAVEQUERIES', true);
if ( !function_exists('dump') ) :
 * dump()
 * @param mixed $in
 * @return mixed $in

function dump($in = null) {
    echo '<pre style="margin-left: 0px; margin-right: 0px; padding: 10px; border: solid 1px black; background-color: ghostwhite; color: black; text-align: left;">';
    foreach ( func_get_args() as $var ) {
        echo "\n";
        if ( is_string($var) ) {
            echo "$var\n";
        } else {
    echo '</pre>' . "\n";
    return $in;
} # dump()

 * add_stop()
 * @param mixed $in
 * @param string $where
 * @return mixed $in

function add_stop($in = null, $where = null) {
    global $sem_stops;
    global $wp_object_cache;
    $queries = get_num_queries();
    $milliseconds = timer_stop() * 1000;
    $out =  "$queries queries - {$milliseconds}ms";
    if ( function_exists('memory_get_usage') ) {
        $memory = number_format(memory_get_usage() / ( 1024 * 1024 ), 1);
        $out .= " - {$memory}MB";
    $out .= " - $wp_object_cache->cache_hits cache hits / " . ( $wp_object_cache->cache_hits + $wp_object_cache->cache_misses );
    if ( $where ) {
        $sem_stops[$where] = $out;
    } else {
    return $in;
} # add_stop()

 * dump_stops()
 * @param mixed $in
 * @return mixed $in

function dump_stops($in = null) {
    if ( $_POST )
        return $in;
    global $sem_stops;
    global $wp_object_cache;
    $stops = '';
    foreach ( $sem_stops as $where => $stop )
        $stops .= "$where: $stop\n";
    dump("\n" . trim($stops) . "\n");
    if ( defined('SAVEQUERIES') && $_GET['debug'] == 'sql' ) {
        global $wpdb;
        foreach ( $wpdb->queries as $key => $data ) {
            $query = rtrim($data[0]);
            $duration = number_format($data[1] * 1000, 1) . 'ms';
            $loc = trim($data[2]);
            $loc = preg_replace("/(require|include)(_once)?,\s*/ix", '', $loc);
            $loc = "\n" . preg_replace("/,\s*/", ",\n", $loc) . "\n";
            dump($query, $duration, $loc);
    if ( $_GET['debug'] == 'cache' )
    if ( $_GET['debug'] == 'cron' ) {
        $crons = get_option('cron');
        foreach ( $crons as $time => $_crons ) {
            if ( !is_array($_crons) )
            foreach ( $_crons as $event => $_cron ) {
                foreach ( $_cron as $details ) {
                    $date = date('Y-m-d H:m:i', $time);
                    $schedule = isset($details['schedule']) ? "({$details['schedule']})" : '';
                    if ( $details['args'] )
                        dump("$date: $event $schedule", $details['args']);
                        dump("$date: $event $schedule");
    return $in;
} # dump_stops()
add_action('init', create_function('$in', '
    return add_stop($in, "Load");
    '), 10000000);
add_action('template_redirect', create_function('$in', '
    return add_stop($in, "Query");
    '), -10000000);
add_action('wp_footer', create_function('$in', '
    return add_stop($in, "Display");
    '), 10000000);
add_action('admin_footer', create_function('$in', '
    return add_stop($in, "Display");
    '), 10000000);

 * init_dump()
 * @return void

function init_dump() {
    global $hook_suffix;
    if ( !is_admin() || empty($hook_suffix) ) {
        add_action('wp_footer', 'dump_stops', 10000000);
        add_action('admin_footer', 'dump_stops', 10000000);
    } else {
        add_action('wp_footer', 'dump_stops', 10000000);
        add_action("admin_footer-$hook_suffix", 'dump_stops', 10000000);
} # init_dump()
add_action('wp_print_scripts', 'init_dump');

 * dump_phpinfo()
 * @return void

function dump_phpinfo() {
    if ( isset($_GET['debug']) && $_GET['debug'] == 'phpinfo' ) {
} # dump_phpinfo()
add_action('init', 'dump_phpinfo');

 * dump_http()
 * @param array $args
 * @param string $url
 * @return array $args

function dump_http($args, $url) {
    dump(preg_replace("|/[0-9a-f]{32}/?$|", '', $url));
    return $args;
} # dump_http()

 * dump_trace()
 * @return void

function dump_trace() {
    $backtrace = debug_backtrace();
    foreach ( $backtrace as $trace )
            'File/Line: ' . $trace['file'] . ', ' . $trace['line'],
            'Function / Class: ' . $trace['function'] . ', ' . $trace['class']
} # dump_trace()
if ( $_GET['debug'] == 'http' )
    add_filter('http_request_args', 'dump_http', 0, 2);

is there a quick way to modify this so that script only gets called when your an administrator AND append something to the URL to show the debug info? -
(1) That's how it's done in my theme: -- the /inc/debug.php is included by /functions.php or /inc/init.php (can't recall off the top of my head). - Denis de Bernardy
[+52] [2010-09-11 20:35:56] jerclarke

Set a maximum number of post revisions to avoid DB bloat.

Tested on: Wordpress 3.0.1

Default is infinite, this will set it to only remember last 5 edits:

 * Set the post revisions unless the constant was set in wp-config.php
if (!defined('WP_POST_REVISIONS')) define('WP_POST_REVISIONS', 5);

FWIW there are a ton of great ideas for CONSTANTS that can be set on the Codex page Editing wp-config.php [1].


Can this be set on a per post type basis? -
Looking at its usage in wp_save_post_revision() there doesn't seem to be a way to distinguish based on post types. There's no filter or anything on the value, though there probably should be. - jerclarke
thanks Jeremy - To anyone else, if you know how to do this please post it here. -
(1) personally I prefer 10. I know it's double but always when I need a revision it's always older then 5 - janw
[+48] [2011-12-04 21:33:43] Ünsal Korkmaz

Sharpen Resized Images (only jpg)

This function sharpening resized jpg images. An example of difference:

function ajx_sharpen_resized_files( $resized_file ) {

    $image = wp_load_image( $resized_file );
    if ( !is_resource( $image ) )
        return new WP_Error( 'error_loading_image', $image, $file );

    $size = @getimagesize( $resized_file );
    if ( !$size )
        return new WP_Error('invalid_image', __('Could not read image size'), $file);
    list($orig_w, $orig_h, $orig_type) = $size;

    switch ( $orig_type ) {
        case IMAGETYPE_JPEG:
            $matrix = array(
                array(-1, -1, -1),
                array(-1, 16, -1),
                array(-1, -1, -1),

            $divisor = array_sum(array_map('array_sum', $matrix));
            $offset = 0; 
            imageconvolution($image, $matrix, $divisor, $offset);
            imagejpeg($image, $resized_file,apply_filters( 'jpeg_quality', 90, 'edit_image' ));
        case IMAGETYPE_PNG:
            return $resized_file;
        case IMAGETYPE_GIF:
            return $resized_file;

    return $resized_file;

add_filter('image_make_intermediate_size', 'ajx_sharpen_resized_files',900);

(1) Works great for me :) and its so cool! - Sagive SEO
much much better jpegs, thanks a bunch! tested in 3.4-alpha - brasofilo
(2) if u guys want this as plugin: - Ünsal Korkmaz
[+47] [2010-09-09 08:45:50]

Remove Default Wordpress Meta Boxes

Tested on: Wordpress 3.0.1

This code will allow you to remove specific Meta Boxes which wordpress adds by default to the default Add/Edit Post and Add/Edit Page screens.

   function remove_default_post_screen_metaboxes() {
 remove_meta_box( 'postcustom','post','normal' ); // Custom Fields Metabox
 remove_meta_box( 'postexcerpt','post','normal' ); // Excerpt Metabox
 remove_meta_box( 'commentstatusdiv','post','normal' ); // Comments Metabox
 remove_meta_box( 'trackbacksdiv','post','normal' ); // Talkback Metabox
 remove_meta_box( 'slugdiv','post','normal' ); // Slug Metabox
 remove_meta_box( 'authordiv','post','normal' ); // Author Metabox

   function remove_default_page_screen_metaboxes() {
 remove_meta_box( 'postcustom','page','normal' ); // Custom Fields Metabox
 remove_meta_box( 'postexcerpt','page','normal' ); // Excerpt Metabox
 remove_meta_box( 'commentstatusdiv','page','normal' ); // Comments Metabox
 remove_meta_box( 'trackbacksdiv','page','normal' ); // Talkback Metabox
 remove_meta_box( 'slugdiv','page','normal' ); // Slug Metabox
 remove_meta_box( 'authordiv','page','normal' ); // Author Metabox

(4) According to this… I wouldn't hide the slugdiv this way, but use this instead - user5424
@CorvanNoorloos Your github link is broken. - user6003859
[+44] [2010-09-15 15:51:15] EAMann

Remove "Wordpress" to "WordPress" filter

Tested on: Wordpress 3.0.1

There was a filter added with WordPress version 3.0 that automatically converts all instances of "Wordpress" (no capital P) to "WordPress" (with a capital P) in post content, post titles, and comment text. Some people see this as intrusive, I just have a need to mis-case WordPress from time to time and found the filter somewhat annoying.

// Remove annoying P filter
if(function_exists('capital_P_dangit')) {
    foreach ( array( 'the_content', 'the_title' ) as $filter ) 
        remove_filter( $filter, 'capital_P_dangit', 11 ); 

    remove_filter('comment_text', 'capital_P_dangit', 31 );

great little find. One of those things which just removes another piece of code that is not needed -
(5) In WordPress 3.0.1, this filter is added with priority 11, so you need to add 11 as the third parameter to remove it. - Jan Fabry
[+41] [2010-10-21 14:52:25] George Wiscombe

Customize the Dashboard

add_action('wp_dashboard_setup', 'my_custom_dashboard_widgets');

function my_custom_dashboard_widgets() {
   global $wp_meta_boxes;

Remove these dashboard widgets...


Add a custom widget called 'Help and Support'

   wp_add_dashboard_widget('custom_help_widget', 'Help and Support', 'custom_dashboard_help');

This is the content for your custom widget

 function custom_dashboard_help() {
    echo '<p>Lorum ipsum delor sit amet et nunc</p>';

[+41] [2010-11-16 04:51:32]

Add Custom User Profile Fields

Place the code below into your functions.php file to add custom user profile fields. Edit or add lines as you see fit.

Remember not to remove the line: return $contactmethods; otherwise this won't work.

   function my_custom_userfields( $contactmethods ) {

    $contactmethods['contact_phone_office']     = 'Office Phone';
    $contactmethods['contact_phone_mobile']     = 'Mobile Phone';
    $contactmethods['contact_office_fax']       = 'Office Fax';

    $contactmethods['address_line_1']       = 'Address Line 1';
    $contactmethods['address_line_2']       = 'Address Line 2 (optional)';
    $contactmethods['address_city']         = 'City';
    $contactmethods['address_state']        = 'State';
    $contactmethods['address_zipcode']      = 'Zipcode';
    return $contactmethods;

To display custom fields you can use one of the two methods listed below.

Option 1:

the_author_meta('facebook', $current_author->ID)

Option 2:

<?php $current_author = get_userdata(get_query_var('author')); ?>
<p><a href="<?php echo esc_url($current_author->contact_phone_office);?>" title="office_phone"> Office Phone</a></p>

[+38] [2010-09-09 08:37:11]

Customize the order of the admin menu

tested on: Wordpress 3.0.1

This code will allow you to reorganize the order of elements in the admin menu. All that you need to do is click on an existing link in the admin menu and copy everything before the /wp-admin/ URL. The order below represents the order the new admin menu will have.

   function custom_menu_order($menu_ord) {
       if (!$menu_ord) return true;
       return array(
        'index.php', // this represents the dashboard link
        'edit.php?post_type=events', // this is a custom post type menu
        'edit.php?post_type=page', // this is the default page menu
        'edit.php', // this is the default POST admin menu 
   add_filter('custom_menu_order', 'custom_menu_order');
   add_filter('menu_order', 'custom_menu_order');

Is there really a core filter named custom_menu_order? I couldn't find one... - kaiser
(4) @kaiser documented here… - Manny Fleurmond
[+37] [2010-09-12 07:32:19] Name-AK

Function to change the length of Exerpt

Tested on: Wordpress 3.0.1

By default all excerpts are capped at 55 words. Utilizing the code below you can override this default settings:

function new_excerpt_length($length) { 
    return 100;

add_filter('excerpt_length', 'new_excerpt_length');

This example changes the excerpt length to 100 words, but you can use the same method to change it to any value.

@user402... does this cap by words or characters? Could you post how to do both? -
(3) This function (and the excerpt_length hook) cap by words. - EAMann
Heh. I got that filter added to core. :) - Dougal Campbell
[+37] [2010-09-15 14:36:31] Dan Gayle

Remove pings to your own blog

Tested on: Wordpress 3.0.1

//remove pings to self
function no_self_ping( &$links ) {
    $home = get_option( 'home' );
    foreach ( $links as $l => $link )
        if ( 0 === strpos( $link, $home ) )
add_action( 'pre_ping', 'no_self_ping' );

how often and when does wordpress ping itself? -
I actually have that issue quite often. If I reference an internal link to another post on my WP blog, I get a trackback or pingback (don't remember which) from myself. It's annoying. - Sahas Katta
Same here. I have a news / magazine blog and link to other articles quite often. - Steven
[+37] [2010-12-28 06:39:19] Philip

Add Thumbnails in Manage Posts/Pages List

You can add this to your functions to display to the Manage/Edit Post and Pages List a new column with the thumbnail preview.

/****** Add Thumbnails in Manage Posts/Pages List ******/
if ( !function_exists('AddThumbColumn') && function_exists('add_theme_support') ) {

    // for post and page
    add_theme_support('post-thumbnails', array( 'post', 'page' ) );

    function AddThumbColumn($cols) {

        $cols['thumbnail'] = __('Thumbnail');

        return $cols;

    function AddThumbValue($column_name, $post_id) {

            $width = (int) 35;
            $height = (int) 35;

            if ( 'thumbnail' == $column_name ) {
                // thumbnail of WP 2.9
                $thumbnail_id = get_post_meta( $post_id, '_thumbnail_id', true );
                // image from gallery
                $attachments = get_children( array('post_parent' => $post_id, 'post_type' => 'attachment', 'post_mime_type' => 'image') );
                if ($thumbnail_id)
                    $thumb = wp_get_attachment_image( $thumbnail_id, array($width, $height), true );
                elseif ($attachments) {
                    foreach ( $attachments as $attachment_id => $attachment ) {
                        $thumb = wp_get_attachment_image( $attachment_id, array($width, $height), true );
                    if ( isset($thumb) && $thumb ) {
                        echo $thumb;
                    } else {
                        echo __('None');

    // for posts
    add_filter( 'manage_posts_columns', 'AddThumbColumn' );
    add_action( 'manage_posts_custom_column', 'AddThumbValue', 10, 2 );

    // for pages
    add_filter( 'manage_pages_columns', 'AddThumbColumn' );
    add_action( 'manage_pages_custom_column', 'AddThumbValue', 10, 2 );

How to move the column to the far left? - Rich
[+33] [2010-12-23 12:13:26] onetrickpony

Enable GZIP output compression

Normally the server should be set up to do this automatically, but a lot of shared hosts don t do this (probably to increase client bandwidth usage)

 if(extension_loaded("zlib") && (ini_get("output_handler") != "ob_gzhandler"))
   add_action('wp', create_function('', '@ob_end_clean();@ini_set("zlib.output_compression", 1);'));

[+31] [2010-09-15 17:43:57] Rarst

Display DB Queries, Time Spent and Memory Consumption

Tested on: Wordpress 3.0.1

function performance( $visible = false ) {

    $stat = sprintf(  '%d queries in %.3f seconds, using %.2fMB memory',
        timer_stop( 0, 3 ),
        memory_get_peak_usage() / 1024 / 1024

    echo $visible ? $stat : "<!-- {$stat} -->" ;

Then this code below the code above which will automatically insert the code above into the footer of your public website (make sure your theme is calling wp_footer):

add_action( 'wp_footer', 'performance', 20 );

Can be called multiple times.

for php < 5.2 use memory_get_usage() - onetrickpony
[+31] [2010-11-14 23:05:16] bueltge

Unregister WP Default Widgets

Tested on: WordPress 3.0.1

// unregister all default WP Widgets
function unregister_default_wp_widgets() {
add_action('widgets_init', 'unregister_default_wp_widgets', 1);

I have used it on Version 3.1.4 . But the widgets are still there. Does any one have idea? - user391
Still works on WP 4.5 :) - Tim Malone
[+30] [2010-09-10 06:26:37]

Auto Extract the First Image from the Post Content

Tested on: Wordpress 3.0.1

This code will automatically extract the first image associated with a post and allow you to display/use it by calling the getImage function.

function getImage($num) {
    global $more;
    $more = 1;
    $link = get_permalink();
    $content = get_the_content();
    $count = substr_count($content, '<img');
    $start = 0;
    for($i=1;$i<=$count;$i++) {
        $imgBeg = strpos($content, '<img', $start);
        $post = substr($content, $imgBeg);
        $imgEnd = strpos($post, '>');
        $postOutput = substr($post, 0, $imgEnd+1);
        $postOutput = preg_replace('/width="([0-9]*)" height="([0-9]*)"/', '',$postOutput);;
        $image[$i] = $postOutput;
    if(stristr($image[$num],'<img')) { echo '<a href="'.$link.'">'.$image[$num]."</a>"; }
    $more = 0;

(6) Nice, but get_the_image does a very good job with this as well. - artlung
correct but this one works differently and fixes various issues which get_the_image does not take into account -
(3) What does it do differently than the get_the_image script? - matt
(1) @matt -- In wordpress there are different ways that images can be added to posts and i think the get_the_image script just looks at one of those. This checks to see if there is a featured image and uses that one first if available, next I think it checks for the first image added to the post content and if that is not found it checks the media gallery for the image with the highest sort order (at least thats how I remember the order going). -
i suggest Automatically generate the Post Thumbnail (Featured Thumbnail) from the first image in post or any custom post type only if Post Thumbnail is not set - Ünsal Korkmaz
i dont any check for thumbnail - are you sure? - Sagive SEO
[+26] [2010-11-09 22:18:07] Wyck

Output which theme template file a post/page is using in the header

add_action('wp_head', 'show_template');
function show_template() {
    global $template;

Shorten the default DIV output if your theme is using post_class.

if your theme is using something like

<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

You can have crazy long divs in your source that might look like this or even longer:

<div id="post-4" class="post-4 post type-post hentry category-uncategorized category-test category-test-1-billion category-test2 category-test3 category-testing"> 

This can really start to clutter your source and seem rather unnecessary in most cases, going 3-4 deep is good enough.

For the top example we can slice the output like so:

// slice crazy long div outputs
    function category_id_class($classes) {
        global $post;
        foreach((get_the_category($post->ID)) as $category)
            $classes[] = $category->category_nicename;
            return array_slice($classes, 0,5);
    add_filter('post_class', 'category_id_class');

this slices the output to only include the first 5 values, so the above example becomes:

<div id="post-4" class="post-4 post type-post hentry category-uncategorized"> 

Make category archives display all posts, regardless of post type: good for custom post types

function any_ptype_on_cat($request) {
 if ( isset($request['category_name']) )
  $request['post_type'] = 'any';

 return $request;
add_filter('request', 'any_ptype_on_cat');

Remove unwanted dashboard items

This was already posted but it did not have the full list of items. Especially those annoying "incoming links!"

add_action('wp_dashboard_setup', 'my_custom_dashboard_widgets');

function my_custom_dashboard_widgets() {
global $wp_meta_boxes;
 //Right Now - Comments, Posts, Pages at a glance
//Recent Comments
//Incoming Links
//Plugins - Popular, New and Recently updated Wordpress Plugins

//Wordpress Development Blog Feed
//Other Wordpress News Feed
//Quick Press Form
//Recent Drafts List

Remove "Read More" page jumps**

instead return to the top of the page. You know how when you click "read more" it will jump to the spot in the page which can be annoying, this makes it just load the page normally, no jumping!

function remove_more_jump_link($link) { 
$offset = strpos($link, '#more-');
if ($offset) {
$end = strpos($link, '"',$offset);
if ($end) {
$link = substr_replace($link, '', $offset, $end-$offset);
return $link;
add_filter('the_content_more_link', 'remove_more_jump_link');

Restrict ADMIN menu items based on username, replace username with an actual user's name.

function remove_menus()
    global $menu;
    global $current_user;

    if($current_user->user_login == 'username')
        $restricted = array(__('Posts'),
        end ($menu);
        while (prev($menu)){
            $value = explode(' ',$menu[key($menu)][0]);
            if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){unset($menu[key($menu)]);}
        }// end while

    }// end if
add_action('admin_menu', 'remove_menus');

//alternatively you can use if($current_user->user_login != 'admin') instead, probably more useful

Style the tag cloud

//tag cloud custom
function style_tags($args) {
$args = array(
     'largest'    => '10',
     'smallest'   => '10',
     'format'     => 'list',
return $args;

Full reference of options here ( there are a lot!)

Change Default RSS Widget update timer

( default is 6 or 12 hours I forget (1800 =30min).

add_filter( 'wp_feed_cache_transient_lifetime', create_function('$fixrss', 'return 1800;') );

could you please split up each of these into seperate answers within the next few weeks. I was going to do it for you but did not want to make it seem like I am taking credit for your answers. In any case - I am trying to keep this organized so users can easily find the information they are looking for. Thanks in advance -
I was just using the code "Restrict ADMIN menu items based on username, replace username with an actual user's name" which is great but could you update the code to also show how this can be done for a specific "user role". I think this would be very useful! -
Sorry NetConstructor I just saw your comment now. For user role I would use "current_user_can". I don't have time to test it but when I do, I will add it. - Wyck
default value for wp_feed_cache_transient_lifetime is 43200 (12 hours) - brasofilo
[+25] [2010-11-09 09:48:50] Andrew Ryno

Remove superfluous info and HTML within the <head> tag

// remove unnecessary header info
add_action( 'init', 'remove_header_info' );
function remove_header_info() {
    remove_action( 'wp_head', 'rsd_link' );
    remove_action( 'wp_head', 'wlwmanifest_link' );
    remove_action( 'wp_head', 'wp_generator' );
    remove_action( 'wp_head', 'start_post_rel_link' );
    remove_action( 'wp_head', 'index_rel_link' );
    remove_action( 'wp_head', 'adjacent_posts_rel_link' );         // for WordPress < 3.0
    remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head' ); // for WordPress >= 3.0

// remove extra CSS that 'Recent Comments' widget injects
add_action( 'widgets_init', 'remove_recent_comments_style' );
function remove_recent_comments_style() {
    global $wp_widget_factory;
    remove_action( 'wp_head', array(
    ) );

[+25] [2010-11-14 17:11:58]

Remove Plugin Update Notice ONLY for INACTIVE plugins

function update_active_plugins($value = '') {
    The $value array passed in contains the list of plugins with time
    marks when the last time the groups was checked for version match
    The $value->reponse node contains an array of the items that are
    out of date. This response node is use by the 'Plugins' menu
    for example to indicate there are updates. Also on the actual
    plugins listing to provide the yellow box below a given plugin
    to indicate action is needed by the user.
    if ((isset($value->response)) && (count($value->response))) {

        // Get the list cut current active plugins
        $active_plugins = get_option('active_plugins');    
        if ($active_plugins) {

            //  Here we start to compare the $value->response
            //  items checking each against the active plugins list.
            foreach($value->response as $plugin_idx => $plugin_item) {

                // If the response item is not an active plugin then remove it.
                // This will prevent WordPress from indicating the plugin needs update actions.
                if (!in_array($plugin_idx, $active_plugins))
        else {
             // If no active plugins then ignore the inactive out of date ones.
            foreach($value->response as $plugin_idx => $plugin_item) {
    return $value;
add_filter('transient_update_plugins', 'update_active_plugins');    // Hook for 2.8.+
//add_filter( 'option_update_plugins', 'update_active_plugins');    // Hook for 2.7.x

(1) This is not necessarily a good idea - an inactive plugin is still present in the filesystem, and an insecure one can still be utilised to hack the site. Plugins should always be kept up-to-date. - Tim Malone
[+22] [2010-11-13 10:26:27] jaredwilli

Enable Error Debugging And Logging To Use On Live Sites

This is a piece of code I wrote to make use of the WP_DEBUG constants that are normally disabled by default. Well I created a way to not only enable WP_DEBUG so you can use it on a live site with no negative side-effects, but I also made use of the other debugging constants for forcing errors to be displayed, and for creating a log file of the errors and Notices in the /wp-content directory.

Drop this code in your wp-config.php file ( AFTER YOU SAVE A BACKUP JUST IN CASE ) and then you can pass the ?debug=1, 2, or 3 parameters at the end of any url on your site.

?debug=1 = shows all errors/notices ?debug=2 = forces them to be displayed ?debug=3 = creates a debug.log file of all errors in /wp-content dir.

* Written by Jared Williams -
* @wp-config.php replace WP_DEBUG constant with this code
* Enable WP debugging for usage on a live site
* Pass the '?debug=#' parameter at the end of any url on site
*, /?debug=2, /?debug=3
if ( isset($_GET['debug']) && $_GET['debug'] == '1' ) {
    // enable the reporting of notices during development - E_ALL
    define('WP_DEBUG', true);
} elseif ( isset($_GET['debug']) && $_GET['debug'] == '2' ) {
    // must be true for WP_DEBUG_DISPLAY to work
    define('WP_DEBUG', true);
    // force the display of errors
    define('WP_DEBUG_DISPLAY', true);
} elseif ( isset($_GET['debug']) && $_GET['debug'] == '3' ) {
    // must be true for WP_DEBUG_LOG to work
    define('WP_DEBUG', true);
    // log errors to debug.log in the wp-content directory
    define('WP_DEBUG_LOG', true);

I go into more detail on the guest post I wrote for Comluv if you're interested, here:

I'm still working on a way to make this either password protected, or preferrably somehow make it work on if (current_user_can('manage_themes') and is_logged_in().

But that's where it gets alot more tricky.

We use something similar to setup live, staging and dev database connection details. - Tom
[+20] [2010-11-09 07:39:14] tomcat23

New Roles and Capabilities - Only run once!

I keep these handy, this is the right way to do them without a plugin. They set a single field (prefix_user_roles) in the options database, and you don't need a plugin to set them. Refer to the Codex page for a list of what capabilities are available and descriptions for what they do. [1] You only need to uncomment one of these blocks, load any page and then comment them again! Here I'm creating a role that's got the capabilities I need:

/* Capabilities */

// To add the new role, using 'international' as the short name and
// 'International Blogger' as the displayed name in the User list and edit page:
add_role('international', 'International Blogger', array(
    'read' => true, // True allows that capability, False specifically removes it.
    'edit_posts' => true,
    'delete_posts' => true,
    'edit_published_posts' => true,
    'publish_posts' => true,
    'edit_files' => true,
    'import' => true,
    'upload_files' => true //last in array needs no comma!

// To remove one outright or remove one of the defaults:

It's sometimes handy to add/remove from an existing role rather than removing and re-adding one. Again, you only need to uncomment it, reload a page and then comment it again. This will store the role/capability properly in the options table. (This allows you, the developer to control them and removes the overhead of the bulky plugins that do the same thing.) Here I'm changing the author role to delete their published posts (the default), but allowing them the capability to edit their published posts (which isn't possible for this role by default)-- using *add_cap* or *remove_cap*.

$edit_role = get_role('author');

I keep a spreadsheet with the grid from the Codex page for sites that modify this way, so I can remember how things are set, though leaving the commented out code in your functions.php file will work to. Don't leave these examples uncommented, or it will write to the database with each page load!


The functions I mention above write to a field in the options database. Commenting and uncommenting them is the way to go. There are plugins for user roles, but if you use the functions mention above, you cannot leave these functions running, and you DO NOT need to set them more than once, or set them based on if a specific user is accessing something. If you want that, set that user up with a specific, unique role. And refer to the codex, everything I write above is 100% correct if you do it without a plugin. For nearly every case, you only need to set the user roles once. - tomcat23
@tomcat23: To illustrate, i wrapped it up in a function to only add the role, when it doesn't already exists. Another note: I guess it would be easier to place the role somewhere in the role hierarchy, with retrieving the caps from some built in role and then add/remove the capabilities from the built in role. Would make it more clear and easier to remember if it's caps are placed somewhere between ex. admin and editor. - I hope you don't mind that i edited your answer. If you do, pls role it back. :) - kaiser
I stand by my answer as I left it. Your function misses the point and doesn't provide the same answer as my text. I also it's quite rude of you do change my code and answer. - tomcat23
Not only that, but your function doesn't do the same thing as my code. Your function leaves just one more check in place, get_role('international', that isn't needed! I used this code for moving a client who had a server that was using php4 and therefore couldn't use the role scoper plugin they had been using, which was php5 only. (And was the only plugin that needed php5 for their install.) As a developer, I saw that the only reason they needed it was to set up a couple of roles and change some capabilities. And this code, my original answer here, is how to do that! - tomcat23
You do not need to, nor should you, wrap this in a function. You just need it to properly set the roles and capabilities. If you want to play around with them, there's some great (though bloated) plugins for that. If you understand the roles and capabilities in wordpress and aren't just poking around with it, and aren't writing your own plugin, then this is how to do it right. Please don't edit my code. I have rolled it back. Your function wrapping is in the history for anyone to see, though I disagree with what you have done. - tomcat23
To clarify further, you do not need to wrap this in a function or do admin checks. add_role(), remove_role(), add_cap() and remove_cap(), as I show in my original answer do not need to be executed over and over -- they just set a field in the options table that does not need to be written to over and over again -- which is why your function wrapper is wrong. I know, you are adding an action to after_setup_theme, but setting a role with that hook is not what my answer was about. (And generally roles don't need to come packaged with themes.) - tomcat23
Puh... As i wrote: "I hope you don't mind that i edited your answer. If you do, pls role it back. :)". You roled it back, explained your reason and guess what: It's ok. So calm down. But to offer you the same amount of explanation: I always wrap stuff in functions and add it to my test files folder of my theme. This way i can easily test stuff for ex. WA answers and add them quickly if i need anything, so wrapping it in a function is ok. Further more it's easier to disable (only the add_action call) and allow doc-comments with /**/ instead of multiline // comments. That much about my "why". - kaiser
@tomcat23 - Note that we are a community that is supportive of each other, not one that challenges each other except to do so academically. As you see from @kaiser's response, he was just trying to help. - MikeSchinkel
@MikeSchinkel I recall there being two comments by @kaiser on Feb 1, which is why I responded then how I did. (You are moderator, can you see if he did? Because I don't think I'm wrong in thinking he had 2 comments about my usage just not sitting well with him.) I did not feel that my code or explanation needed help and told him so on Feb 1st. I come back some time later and find that he's changed my code -- my first exposure to this site's "wiki" aspect -- and I was, in my opinion, justifiably annoyed that while my text and comments discuss one thing, the code itself was different. - tomcat23
My answer is in the spirit of the original question. This is my useful code, this is what works well for me and I don't use it wrapped in a function. If @kaiser had wanted to answer this question with the code wrapped in a function and attached to a hook, he's still free to do so. Again, @kaiser what you did in changing my code but not my text was detrimental to other people who would come here, see it and find that my discussion of the code made no sense. That is why I feel it is rude of you to do what you did and why I responded yesterday as harshly as I did. - tomcat23
(1) @tomcat23 - Water under the bridge at this point. All I'm saying is, I'm not interested in placing blame, just in having peace for everyone moving forward. :) - MikeSchinkel
(2) @MikeSchinkel Yes, you are right. @kaiser My apologies if I've caused you insult. - tomcat23
(1) @MikeSchinkel: thanks for bringing peace back in. @tomcat23: No, you didn't. I can deal with that sort of criticism. My apologies too. - kaiser
[+19] [2010-09-10 00:49:55] Chris_O

Automatically Add Dynamic Titles to Public Pages

Tested on: Wordpress 3.0.1

Utilizing the code below will automatically create dynamic page titles based upon the pages/posts being viewed publicly.

/* Dynamic Titles **/
// This sets your <title> depending on what page you're on, for better formatting and for SEO
// You need to set the variable $longd to some custom text at the beginning of the function
function dynamictitles() {
$longd = __('Enter your longdescription here.', 'texdomainstring');
    if ( is_single() ) {
      echo ' | '.get_bloginfo('name');

} else if ( is_page() || is_paged() ) {

} else if ( is_author() ) {
      wp_title(' | '.__('Author', 'texdomainstring'));

} else if ( is_category() ) {
      wp_title(' | '.__('Archive for', 'texdomainstring'));

} else if ( is_tag() ) {
      echo get_bloginfo('name').' | '.__('Tag archive for', 'texdomainstring');

} else if ( is_archive() ) {
      echo get_bloginfo('name').' | '.__('Archive for', 'texdomainstring');

} else if ( is_search() ) {
      echo get_bloginfo('name').' | '.__('Search Results', 'texdomainstring');
} else if ( is_404() ) {
      echo get_bloginfo('name').' | '.__('404 Error (Page Not Found)', 'texdomainstring');

} else if ( is_home() ) {
      echo get_bloginfo('name').' | '.get_bloginfo('description');

} else {
      echo get_bloginfo('name').' | '.($blog_longd);

[+18] [2010-11-14 13:59:37] CommentLuv

Enable shortcodes in widgets

// shortcode in widgets
if ( !is_admin() ){
    add_filter('widget_text', 'do_shortcode', 11);

[+18] [2010-12-28 00:45:15] chuck reynolds

Wordpress Custom Admin Footer

// customize admin footer text
function custom_admin_footer() {
        echo 'add your custom footer text and html here';
add_filter('admin_footer_text', 'custom_admin_footer');

I use this for client sites as a simple point of reference to contact me as the dev.

[+17] [2010-09-12 07:24:32] Name-AK

Function to Disable RSS Feeds

Tested on: Wordpress 3.0.1

You can disable RSS feeds If you want to maintain your Wordpress based website as static.

You can Use this function :

function fb_disable_feed() {
wp_die( __('No feed available,please visit our <a href="'. get_bloginfo('url') .'">homepage</a>!') );

add_action('do_feed', 'fb_disable_feed', 1);
add_action('do_feed_rdf', 'fb_disable_feed', 1);
add_action('do_feed_rss', 'fb_disable_feed', 1);
add_action('do_feed_rss2', 'fb_disable_feed', 1);
add_action('do_feed_atom', 'fb_disable_feed', 1);

Source: (Frank Bueltge) - fuxia
Thanks Toscho! the source is also available in english - bueltge
[+14] [2010-11-09 03:22:03] jaredwilli

Add a codex search form to the dashboard header

This is a simple way to add a codex search form to the dashboard header, on the top-right next to the quicklinks drop-down.

function wp_codex_search_form() {
    echo '<form target="_blank" method="get" action="" class="alignright" style="margin: 11px 5px 0;">
        <input type="text" onblur="this.value=(this.value==\'\') ? \'Search the Codex\' : this.value;" onfocus="this.value=(this.value==\'Search the Codex\') ? \'\' : this.value;" maxlength="150" value="Search the Codex" name="search" class="text"> <input type="submit" value="Go" class="button" />

if( current_user_can( 'manage_plugins' )) {
// The number 11 needs to be a 10 for this to work!
    add_filter( 'in_admin_header', 'wp_codex_search_form', 11 );

can you update this code to show how this only gets displayed to users with a specific role (specifically administrators)? -
(1) I edited it to show if current_user_can manage plugins, then add the filter. It's that simple. - jaredwilli
(1) Does this still work in the current WP version... I couldn't get it to work - Zach Lysobey
I encapsulated the add_filter in this action call: add_action('plugins_loaded', 'pluginInit');, and then function pluginInit(){if...add_filter(...)} - - i'm running this in WP 3.4-alpha, and had to use in_admin_footer - brasofilo
[+14] [2010-12-28 06:46:48] Philip

Change the "Howdy" message to "Welcome"

With this function you can customize the "Howdy" message in top right of your admin area.
This function make use of JQuery to change the "Howdy" message to "Welcome".

/****** Customize admin message "Howdy" to "Welcome" ******/
$nohowdy = "Welcome";

if (is_admin()) {
    add_action('init', 'artdev_nohowdy_h');
    add_action('admin_footer', 'artdev_nohowdy_f');
// Load jQuery
function artdev_nohowdy_h() {
// Modify
function artdev_nohowdy_f() {
global $nohowdy;
echo <<<JS
<script type="text/javascript">
var nohowdy = "$nohowdy";
jQuery('#user_info p')
    jQuery('#user_info p')

PHP version, using gettext filter:

add_filter('gettext', 'change_howdy', 10, 3);

function change_howdy($translated, $text, $domain) {

    if (!is_admin() || 'default' != $domain)
        return $translated;

    if (false !== strpos($translated, 'Howdy'))
        return str_replace('Howdy', 'Welcome', $translated);

    return $translated;

(2) Can't this already be edited on the PHP side so it doesn't get output at all? - hakre
It's working fine here in 3.0+ versions for sure, but why not in older versions? Check if any other plugin you use is responsible for this. The text here replaced with JQuery, maybe a JQuery plugin? - Philip
[+14] [2011-01-26 14:19:21]

Include custom post types in "Right Now" admin dashboard

This will include your custom post types and the post counts for each type in the "Right Now" dashboard widget.

function wph_right_now_content_table_end() {
 $args = array(
  'public' => true ,
  'show_ui' => true ,
  '_builtin' => false
 $output = 'object';
 $operator = 'and';

 $post_types = get_post_types( $args , $output , $operator );
 foreach( $post_types as $post_type ) {
  $num_posts = wp_count_posts( $post_type->name );
  $num = number_format_i18n( $num_posts->publish );
  $text = _n( $post_type->labels->singular_name, $post_type->labels->name , intval( $num_posts->publish ) );
  if ( current_user_can( 'edit_posts' ) ) {
   $num = "<a href='edit.php?post_type=$post_type->name'>$num</a>";
   $text = "<a href='edit.php?post_type=$post_type->name'>$text</a>";
  echo '<tr><td class="first b b-' . $post_type->name . '">' . $num . '</td>';
  echo '<td class="t ' . $post_type->name . '">' . $text . '</td></tr>';
 $taxonomies = get_taxonomies( $args , $output , $operator ); 
 foreach( $taxonomies as $taxonomy ) {
  $num_terms  = wp_count_terms( $taxonomy->name );
  $num = number_format_i18n( $num_terms );
  $text = _n( $taxonomy->labels->singular_name, $taxonomy->labels->name , intval( $num_terms ));
  if ( current_user_can( 'manage_categories' ) ) {
   $num = "<a href='edit-tags.php?taxonomy=$taxonomy->name'>$num</a>";
   $text = "<a href='edit-tags.php?taxonomy=$taxonomy->name'>$text</a>";
  echo '<tr><td class="first b b-' . $taxonomy->name . '">' . $num . '</td>';
  echo '<td class="t ' . $taxonomy->name . '">' . $text . '</td></tr>';
add_action( 'right_now_content_table_end' , 'wph_right_now_content_table_end' );

Suddenly, there was a post type "WooFramework Internal Container" appearing in the RightNow widget! . . . one extra argument is needed 'show_ui' => true and it's all K now - brasofilo
This is the same exact thing I had posted above. - jaredwilli
[+13] [2010-11-14 15:57:56]

New Media Library Column to Re-Attach Images

This code adds a new column to the Media Library Page allowing you to re-attach images

add_filter("manage_upload_columns", 'upload_columns');
add_action("manage_media_custom_column", 'media_custom_columns', 0, 2);

function upload_columns($columns) {
    $columns['better_parent'] = "Parent";
    return $columns;
function media_custom_columns($column_name, $id) {
    $post = get_post($id);
    if($column_name != 'better_parent')
        if ( $post->post_parent > 0 ) {
            if ( get_post($post->post_parent) ) {
                $title =_draft_or_post_title($post->post_parent);
            <strong><a href="<?php echo get_edit_post_link( $post->post_parent ); ?>"><?php echo $title ?></a></strong>, <?php echo get_the_time(__('Y/m/d')); ?>
            <br />
            <a class="hide-if-no-js" onclick="'media[]','<?php echo $post->ID ?>');return false;" href="#the-list"><?php _e('Re-Attach'); ?></a>
        } else {
            <?php _e('(Unattached)'); ?><br />
            <a class="hide-if-no-js" onclick="'media[]','<?php echo $post->ID ?>');return false;" href="#the-list"><?php _e('Attach'); ?></a>

[+12] [2010-12-21 20:03:19] onetrickpony

Themed custom loop using shortcodes

Arguments are the same as the ones from query_posts [1]. The content wrapped between the query tag is the template.

add_shortcode('query', 'shortcode_query');

function shortcode_query($atts, $content){
  extract(shortcode_atts(array( // a few default values
   'posts_per_page' => '10',
   'caller_get_posts' => 1,
   'post__not_in' => get_option('sticky_posts'),
  ), $atts));

  global $post;

  $posts = new WP_Query($atts);
  $output = '';
  if ($posts->have_posts())
    while ($posts->have_posts()):

      // these arguments will be available from inside $content
      $parameters = array(
        'PERMALINK' => get_permalink(),
        'TITLE' => get_the_title(),
        'CONTENT' => get_the_content(),
        'COMMENT_COUNT' => $post->comment_count,
        'CATEGORIES' => get_the_category_list(', '),
        // add here more...

      $finds = $replaces = array();
      foreach($parameters as $find => $replace):
        $finds[] = '{'.$find.'}';
        $replaces[] = $replace;
      $output .= str_replace($finds, $replaces, $content);

    return; // no posts found

  return html_entity_decode($output);


[query post_type=page posts_per_page=5]
Listing some pages:    
<p><a href="{PERMALINK}">{COMMENT_COUNT} comments</a></p>

(will make a query for 5 pages)

Inserting pre-configured widgets anywhere using shortcodes

(some ideas from

add_action('widgets_init', 'create_arbitrary_sidebar');
function create_arbitrary_sidebar(){
    'name' => __('Arbitrary Widgets'),
    'id' => 'arbitrary',
    'description' => sprintf(__('Widgets from this area can added into posts/pages using the %1$s or %2$s shortcodes.'), '[widget ID]', '[widget Name]'),
    'before_widget' => '<div class="block"><div class="block-content block-%2$s clear-block" id="instance-%1$s">',
    'after_widget' => '</div></div>',
    'before_title' => '<h3 class="title">',
    'after_title' => '</h3>'

add_action('in_widget_form', 'widget_shortcodes_info', 10, 3);
function widget_shortcodes_info($widget, $return, $instance){
  if(!is_numeric($widget->number)) return; // wp-save bug :( widget needs to be saved first...

  global $wp_registered_widgets;

  // get the active widgets from all sidebars
  $sidebars_widgets = wp_get_sidebars_widgets();

  // prepare matches
  $matches = array();
  foreach($wp_registered_widgets as $i => $w)
    if($w['name'] == $widget->name) $matches[] = $w['id'];

  // find out the widget position (number)
  $number = 0;
  $is_arbitrary = false;
    foreach($sidebars_widgets['arbitrary'] as $i => $value):
      if(in_array($value, $matches) && !$is_arbitrary) $number = $number +1;
      if($value == $widget->id) $is_arbitrary = true;

  echo '<div style="background:#eee; padding: 5px;">To include this widget into your posts or pages use one of the following shortcodes: <br />';
  echo '<code>[widget '.substr(md5($widget->id), 0, 8).']</code> <br /> <code>[widget "'.$widget->name.'"'.(($number > 1) ? ' number='.$number : null).']</code></div>';

add_shortcode('widget', 'shortcode_widget');
function shortcode_widget($atts){
  global $wp_registered_widgets, $wp_registered_sidebars;
    'number' => false,        // only taken in consideration if the 1st argument is the "Widget Name" (not the hashed ID)
    'title' => true,          // show titles?
    'area' => 'arbitrary'     // sidebar to search
  ), $atts));

  // get 1st parameter (assuming this is the target widget id or name)
  if (!empty($atts[0])) $widget = esc_attr($atts[0]); else return;

  $sidebar = esc_attr($area);
  $number = intval($number);

  $callback = false;
  $possible_matches = array();
  $sidebars_widgets = wp_get_sidebars_widgets();
  if((empty($sidebars_widgets[$sidebar]) || empty($wp_registered_widgets)) && (current_user_can('edit_themes')))
    return "no valid active widgets in {$sidebar}";

  // assuming we get the md5 hashed ID
  foreach ($wp_registered_widgets as $i => $w)
    if ($widget == substr(md5($w['id']), 0, 8)):
      $callback = ($w['callback']);
      $widget = $w['id']; // real widget ID

    // compare widget names as well, and build a array with the possible widget matches array
    // (which is used later if ID match fails)
    elseif($widget == $w['name']):
      $possible_matches[] = $w['id'];


  // nothing found, assume it's the "Widget Name".
    $valid_matches = array();
    foreach($sidebars_widgets[$sidebar] as $i => $w)
      foreach($possible_matches as $id) if($id == $w) $valid_matches[] = $w;

    if(!empty($valid_matches)) $widget = $number ? $valid_matches[$number-1] : $widget = $valid_matches[0];
    if($widget && isset($wp_registered_widgets[$widget]['callback'])) $callback = $wp_registered_widgets[$widget]['callback'];

  // yey. we found it

    $params = array_merge(array(array_merge($wp_registered_sidebars[$sidebar], array('widget_id' => $widget, 'widget_name' => $wp_registered_widgets[$widget]['name']))), (array)$wp_registered_widgets[$widget]['params']);

    $classname_ = '';
    foreach ((array)$wp_registered_widgets[$widget]['classname'] as $cn)
      if (is_string($cn)) $classname_ .= '_'.$cn; elseif (is_object($cn)) $classname_ .= '_'.get_class($cn);
    $classname_ = ltrim($classname_, '_');
    $params[0]['before_widget'] = sprintf($params[0]['before_widget'], $widget, $classname_);
    $params = apply_filters('dynamic_sidebar_params', $params);

    if (is_callable($callback)) call_user_func_array($callback, $params);
    $output = ob_get_clean();

    // remove h3 if title = false
    if(!$title) $output = preg_replace('#<h3 class="title">(.*?)</h3>#', '', $output);
    return $output;
   return "widget instance not found: ".esc_attr($atts[0]);


Drop a widget in the "arbitrary widgets" sidebar, save it and you'll get the shortcodes :)

Get a custom field value through shortcodes

add_shortcode('field', 'shortcode_field');

function shortcode_field($atts){
   'post_id' => NULL,
  ), $atts));

  if(!isset($atts[0])) return;
  $field = esc_attr($atts[0]);

  global $post;
  $post_id = (NULL === $post_id) ? $post->ID : $post_id;

  return get_post_meta($post_id, $field, true);


  • [field "my_key"]
  • [field "my_key" post_id=1]

Get the TinyURL of a link through shortcodes

add_shortcode('tinyurl', 'shortcode_tinyurl'); 

function shortcode_tinyurl($atts){
   'url' => get_permalink(),
   'title' => '',
   'rel' => 'nofollow'
  ), $atts));
  if(!$title) $title = $url;

  if (FALSE === ($cache = get_transient('tinyurl_'+md5($url)))):
    $cache = wp_remote_retrieve_body(wp_remote_get(''.$url));

    set_transient('tinyurl_'+md5($url), $cache, 60*60*24); // 1 day cache, could be incresed

  return '<a href="'.esc_url($cache).'" rel="'.esc_attr($rel).'">'.esc_attr($title).'</a>';


  • [tinyurl]
  • [tinyurl url="" title="google"]

You'd better to use Javascript: <a href="'‌​php?url='+location.h‌​ref"> Get ShorLink </a> (to avoid unnecessary HUNDREDS OF page open QUERIES(by bots or etc) to TinyUrl ... - T.Todua
[+11] [2010-09-30 03:06:41]

Remove Author Metabox/Options & Move to Publish MetaBox

Tested on: Wordpress 3.0.1

One of the things that drive me crazy is a cluttered Wordpress Admin area. One of the elements which I now always setup from the start in my functions.php file is removing the Author MetaBox and Screen Options and then adding the option into the publish metabox. In my opinion this just makes sense and keep things clean. This also respects applicable permissions.

To achieve this goal, just copy and past the following code into your functions.php file.

If you feel there is a better way of doing this please suggest.


add_action( 'admin_menu', 'remove_author_metabox' );
add_action( 'post_submitbox_misc_actions', 'move_author_to_publish_metabox' );
function remove_author_metabox() {
    remove_meta_box( 'authordiv', 'post', 'normal' );
function move_author_to_publish_metabox() {
    global $post_ID;
    $post = get_post( $post_ID );
    echo '<div id="author" class="misc-pub-section" style="border-top-style:solid; border-top-width:1px; border-top-color:#EEEEEE; border-bottom-width:0px;">Author: ';
    post_author_meta_box( $post );
    echo '</div>';

It doesn't add the Author Metabox to my Publish Box. I figured it was because there was no add_action for the move_author_to_publish_box function so I added add_action('admin_menu', 'move_author_to_publish_box'); but that gave me a "Fatal error: Call to undefined function post_author_meta_box()" - matt
what version of wordpress are you using? -
And how would you add the author to publish? On admin_init or on admin_menu wouldn't work. - kaiser
@kaiser -- I am not sure I understand your question. This code just removes the "author" metabox and places the option to select the author into the "publish" metabox. -
(1) @NetConstructor: I just gave it a test yesterday (3.0.4) and yes, the author box is gone, but not moved to the publish box. When looking at the code i can't see any way, because the function is no where triggered... you just added the remove_author_box() fn to admin_menu action hook, but not the move_author_to_publish_box() fn. - kaiser
(1) @kaiser -- your right, after reviewing this I did noticed the issue. I updated the code in my answer so just delete everything you included from this before hand and just past in the full code above. Let me know if this fixes things. Vote up the question and answer if it fixes the problem - CH :) -
@CH/NC: Sure it works, don't even have to test it. Voting up: n/p. Could/Should be extended to hold some of the other crap/cluter too... (discussions, post thumbnail). I'm not going to mod your answer, but if you got some time, it would even be worth a blog-post. :) - kaiser
@kaiser -- not exactly sure where you see value in this? My objective was just to remove some of the metaboxes which were extra and unneeded such as slugs and authors. -
@you: No, i absolutely see the benefit. You didn't only missunderstand me, you got me wrong by 180 degree. I said that it's that good that it should a) be extended to discussions & thumbnails and b) have a blog post about it "decluttering content edit pages" or so. Edit: With no need for testing means, that i know that it works. - kaiser
@kaiser -- appreciate the compliment however what I still don't understand is how you see it would be of benefit to users to have discussions or thumbnails integrated into the publish metabox. I only saw the benefit of removing the slug and author metaboxes as those logically should be within the publish metabox. Am I still misunderstanding your point? -
@NC: No, you got me right. For me it's not "the publish box", but just a box on the upper right side for small stuff. I don't see a need to have a separate box for each the single "add thumbnail" text line or the two checkboxes from discussions. Nothing else. - kaiser
[+11] [2010-11-05 20:03:12] Joshua Scott

Quickly Determine Server & Environment Details

If you have multiple servers and multiple environments such as development, QA, and production environments, this can be very useful.

For my systems, environment is determined by the first 3 letters of the hostname, but this could easily be changed to whatever suits your needs.

add_action( 'admin_notices', 'report_environment_status', 3 );

// Report on which server and environment details
function report_environment_status() {
    $server = php_uname('n');
    switch (strtolower(substr($server,0,3))) {
        case 'pXX':
            $msg = "PRODUCTION";
        case 'qXX':
            $msg = "QA";
        case 'dXX':
            $msg = "DEVELOPMENT";
        default :
            $msg = 'UNKNOWN';
    echo "<div id='update-nag'>";
    echo "<b>You are in the $msg environment. (Server: $server)</b>";
    echo "</div>";

This has saved me many times from making updates to the wrong environment.

You can also turn this into a plugin and network activate it so all sites get the notification.

thanks for this piece. Could you please elaborate a bit more on this and different usage cases? I think it would also be VERY helpful to me and others if you could possibly include any other code which you utilize when your running different development versions of code. Also, if you utilize a slick way of moving a site from development to production or migrate from one domain to a different one. All these things are very helpful. Finally, do you use any type of subversion client when updating your files? If so, is there anything specific you do for this? -
Please don't mark this as the answer. Otherwise this listing won't work. - hakre
(1) I think it'd be better to use different CSS classes on the message, so that the messages could have different background colors in environments in addition to just having slightly different text. Otherwise I think you'd stop noticing the text differences pretty quickly. - Ian Dunn
[+11] [2010-11-16 04:56:16]

Set Editor Defaults to WYSIWYG or HTML

function my_default_editor() {
    $r = 'tinymce'; // html or tinymce
    return $r;
add_filter( 'wp_default_editor', 'my_default_editor' );

Here is how to remove the HTML Editor

jQuery(document).ready(function($) {

UPDATED here is another way to set the default editor to HTML

add_filter('wp_default_editor', create_function('', 'return "html";'));

see more informations on the origin: - bueltge
[+10] [2010-11-11 12:57:07]

Extending Auto Logout Period

Tested on: Wordpress 3.0.1

Using the code below you can increase the time cookies are kept and therefor users who are logged in remain logged in longer:

function keep_me_logged_in_for_1_year( $expirein ) {
   return 31556926; // 1 year in seconds
add_filter( 'auth_cookie_expiration', 'keep_me_logged_in_for_1_year' );

(1) there is another trick which can be used which I found here: -
(3) It should be noted that the session timeout is there as a security precaution, so extending/removing it makes your site more vulnerable. - Ian Dunn
[+10] [2010-12-28 00:14:24] chuck reynolds

Remove Auto Linking of URLs in WordPress Comments

remove_filter('comment_text', 'make_clickable', 9);

Nice! I was looking for that make_clickable() function to apply it to the_content! Why didn't they do it in the first place? It's as simple as adding add_filter( 'the_content', 'make_clickable'); Alternatively it could be done when the post is saved by using a different hook -
[+10] [2011-03-19 15:52:55] t31os

Add page template filter to page listing

Tested on: WP 3.1

Adds a page template filter to the page listing, so you can view a list of pages that have a given template attached.

class Page_Template_Filter {
    private $templates = array();
    public function __construct() {
        // If it's not the admin area or the current user can't edit pages let's just bail here
        if( !is_admin() || !current_user_can('edit_pages') )
        add_action( 'parse_query',           array( $this, 'pt_parse_query' ) );
        add_action( 'restrict_manage_posts', array( $this, 'pt_restrict_manage_posts' ) );
    public function pt_parse_query( $query ) {
        global $pagenow, $post_type;
        if( 'edit.php' != $pagenow )

        switch( $post_type ) {
            case 'post':

            case 'page':
                $this->templates = get_page_templates();

                if( empty( $this->templates ) )

                if( !$this->is_set_template() )

                $meta_group = array( 'key' => '_wp_page_template', 'value' => $this->get_template() );
                set_query_var( 'meta_query', array( $meta_group ) );
    public function pt_restrict_manage_posts() {
        if( empty( $this->templates ) )
    private function get_template() {
        if( $this->is_set_template() )
            foreach( $this->templates as $template ) {
                if( $template != $_GET['page_template'] )
                return $template;
        return '';
    private function is_set_template() {
        return (bool) ( isset( $_GET['page_template'] ) && ( in_array( $_GET['page_template'], $this->templates ) ) );
    private function template_dropdown() {
        <select name="page_template" id="page_template">
            <option value=""> - no template - </option>
            <?php foreach( $this->templates as $name => $file ): ?>
            <option value="<?php echo $file; ?>"<?php selected( $this->get_template() == $file ); ?>><?php _e( $name ); ?></option>
            <?php endforeach;?>

add_action('admin_init', 'load_ptf');
function load_ptf() {
    $Page_Template_Filter = new Page_Template_Filter;

Requires at least 3.1 to work, though the meta_query could be replaced with the older meta_key and meta_value for 3.0.

works flawlessly, tested in 3.4-alpha - brasofilo
[+9] [2010-09-13 19:24:19] gabrielk

Remove XML-RPC when not in use for performance boost

Tested on: Wordpress 3.0.1

WordPress uses a CURL operation to test for SSL capability for XML-RPC. If you're using XML-RPC but not using, then you can remove the filter. This is a small performance boost (since basically WP does a cURL GET on the https url and either 1) gets a denied message, or 2) times out, and it can take upwards of 5 seconds), but in our case it actually prevented a gateway timeout where a proxy was timing out before the cURL GET was timing out rendering XML-RPC unusable.

// Prevents WordPress from testing ssl capability on

Thanks for the code suggestion. One question, if you are using XML-RPC but not using the SSL capabilities would the including of this code speed things up at all? If not, in what situations would the inclusion of this code serve a benefit? -
It has a minuscule effect on performance for XML-RPC calls, since they no longer have to check for SSL capability via an HTTP request. - gabrielk
[+9] [2010-11-06 21:08:39] Sahas Katta

Collection of quick function.php edits

I have a few awesome tweaks in functions.php as well. Found most of these by searching for them over the years.

Excerpt Ending

function new_excerpt_more($more) {
    return '...';
add_filter('excerpt_more', 'new_excerpt_more');

Replace WP Admin Logo

function new_admin_logo() {
  echo '<style type="text/css">#header-logo { background-image: url('.get_bloginfo('template_directory').'/images/admin_logo.png) !important; }</style>';
add_action('admin_head', 'new_admin_logo');

Custom Favicon WP-Admin

function admin_favicon() {
 echo '<link rel="shortcut icon" type="image/x-icon" href="' . get_bloginfo('template_directory') . '/images/favicon.ico" />';
add_action( 'admin_head', 'admin_favicon' );

Custom Admin Footer

function custom_admin_footer() {
echo 'Welcome to my blog! No More Documentation Links!';
add_filter('admin_footer_text', 'custom_admin_footer');

thanks but these have already been added. -
could you please go through these and ensure there are no duplicate entires and split each one up into its own answer within the next few weeks? -
[+9] [2010-11-08 22:45:36] Dean Oakley

Fixed: Remove Default Wordpress Meta Boxes

This was very handy but had some errors

function remove_default_post_screen_metaboxes() {
 remove_meta_box( 'postcustom','post','normal' ); // Custom Fields Metabox
 remove_meta_box( 'postexcerpt','post','normal' ); // Excerpt Metabox
 remove_meta_box( 'commentstatusdiv','post','normal' ); // Comments Metabox
 remove_meta_box( 'trackbacksdiv','post','normal' ); // Talkback Metabox
 remove_meta_box( 'slugdiv','post','normal' ); // Slug Metabox
 remove_meta_box( 'authordiv','post','normal' ); // Author Metabox

function remove_default_page_screen_metaboxes() {
 global $post_type;
 remove_meta_box( 'postcustom','page','normal' ); // Custom Fields Metabox
 remove_meta_box( 'postexcerpt','page','normal' ); // Excerpt Metabox
 remove_meta_box( 'commentstatusdiv','page','normal' ); // Comments Metabox
 remove_meta_box('commentsdiv','page','normal'); // Comments
 remove_meta_box( 'trackbacksdiv','page','normal' ); // Talkback Metabox
 remove_meta_box( 'slugdiv','page','normal' ); // Slug Metabox
 remove_meta_box( 'authordiv','page','normal' ); // Author Metabox

[+9] [2010-11-14 23:07:46] bueltge

Add a "Settings" link for plugins on the plugin list page

Set "Settings" link for plugins on plugin-page in WordPress backend, easy to use jump to settings for users (the code is also with an solution for WordPress version smaller 2.9)

// plugin definitions
define( 'FB_BASENAME', plugin_basename( __FILE__ ) );
define( 'FB_BASEFOLDER', plugin_basename( dirname( __FILE__ ) ) );
define( 'FB_FILENAME', str_replace( FB_BASEFOLDER.'/', '', plugin_basename(__FILE__) ) );
function filter_plugin_meta($links, $file) {
  /* create link */
  if ( $file == FB_BASENAME ) {
      sprintf( '<a href="options-general.php?page=%s">%s</a>', FB_FILENAME, __('Settings') )
  return $links;

global $wp_version;
if ( version_compare( $wp_version, '2.7alpha', '>' ) ) {
    add_filter( 'plugin_action_links_' . FB_WM_BASENAME, 'filter_plugin_meta', 10, 2);
} else {
    add_filter( 'plugin_action_links', 'filter_plugin_meta', 10, 2 );

I have attempted to use this code but it seem that it does not work on wordpress 3.1. Can you confirm and update - I have update a little bid from one of my free plugins, on all my plugins works fine this - bueltge
I wish all plugin authors would do this (for the plugins that have settings pages, of course) so this kind of code wouldn't be necessary. - JimmyPena
[+9] [2010-11-15 05:45:04] Norcross

Grab all custom fields globally

function get_custom_field($key, $echo = FALSE) {
    global $post;
    $custom_field = get_post_meta( $post->ID, $key, true );
    if ( $echo == false ) 
        return $custom_field;
    echo $custom_field;

Then call the field with a single line

<?php get_custom_field('custom-field-name', TRUE); ?>

Why would someone use this? What's the benefit? - matt
(2) for sites / themes that use a lot of custom fields (which I use often for client work) it allows for less code in the theme, and also for adding conditionals on whether or not to display the field at all. - Norcross
[+9] [2010-11-17 02:52:13] superUntitled

Return the number of comments

This is like count_user_posts(), but returns the number of comments instead:

function count_user_comments($id) {
global $wpdb;
$users = $wpdb->get_var("
        SELECT COUNT( * ) AS total
        FROM $wpdb->comments
        WHERE comment_approved = 1 
        AND user_id = $id");
return $users;

More: Count User's posts (including custom post types) or comments:

function atom_count($user_id, $what_to_count = 'post') {
  global $wpdb;    
  $where = $what_to_count == 'comment' ? "WHERE comment_approved = 1 AND user_id = {$user_id}" : get_posts_by_author_sql($what_to_count, TRUE, $user_id);
  $from = "FROM ".(($what_to_count == 'comment') ? $wpdb->comments : $wpdb->posts);    
  $count = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) {$from} {$where}"));
  return $count;

Usage examples:

<?php echo atom_count(1, 'movie'); // displays 'movie' post type count ?>

<?php echo atom_count(1, 'comment'); // displays comment count ?>

[+9] [2010-12-28 00:07:12] chuck reynolds

Enable oEmbed in Text/HTML Widgets

add_filter( 'widget_text', array( $wp_embed, 'run_shortcode' ), 8 );
add_filter( 'widget_text', array( $wp_embed, 'autoembed'), 8 );

I use this for youtube video widgets and flickr stuff.

[+9] [2011-11-26 13:11:36] Paul

Only show posts and media of the logged-in Author & fix the post/media counts on the filter bars.

Tested on: Wordpress 3.4.1

By default, WordPress allows Authors to see the titles of other users posts, unpublished drafts, and all media, even though they cannot be edited.

Use this code to only allow posts and media of the currently logged in Author to be displayed.

Unlike other solutions, this also fixes the post/media count on the filter bars (All|Published|Draft|Pending|Trash; All|Images|Videos|Unattached).

// Show only posts and media related to logged in author
add_action('pre_get_posts', 'query_set_only_author' );
function query_set_only_author( $wp_query ) {
    global $current_user;
    if( is_admin() && !current_user_can('edit_others_posts') ) {
        $wp_query->set( 'author', $current_user->ID );
        add_filter('views_edit-post', 'fix_post_counts');
        add_filter('views_upload', 'fix_media_counts');

// Fix post counts
function fix_post_counts($views) {
    global $current_user, $wp_query;
    $types = array(
        array( 'status' =>  NULL ),
        array( 'status' => 'publish' ),
        array( 'status' => 'draft' ),
        array( 'status' => 'pending' ),
        array( 'status' => 'trash' )
    foreach( $types as $type ) {
        $query = array(
            'author'      => $current_user->ID,
            'post_type'   => 'post',
            'post_status' => $type['status']
        $result = new WP_Query($query);
        if( $type['status'] == NULL ):
            $class = ($wp_query->query_vars['post_status'] == NULL) ? ' class="current"' : '';
            $views['all'] = sprintf(__('<a href="%s"'. $class .'>All <span class="count">(%d)</span></a>', 'all'),
        elseif( $type['status'] == 'publish' ):
            $class = ($wp_query->query_vars['post_status'] == 'publish') ? ' class="current"' : '';
            $views['publish'] = sprintf(__('<a href="%s"'. $class .'>Published <span class="count">(%d)</span></a>', 'publish'),
        elseif( $type['status'] == 'draft' ):
            $class = ($wp_query->query_vars['post_status'] == 'draft') ? ' class="current"' : '';
            $views['draft'] = sprintf(__('<a href="%s"'. $class .'>Draft'. ((sizeof($result->posts) > 1) ? "s" : "") .' <span class="count">(%d)</span></a>', 'draft'),
        elseif( $type['status'] == 'pending' ):
            $class = ($wp_query->query_vars['post_status'] == 'pending') ? ' class="current"' : '';
            $views['pending'] = sprintf(__('<a href="%s"'. $class .'>Pending <span class="count">(%d)</span></a>', 'pending'),
        elseif( $type['status'] == 'trash' ):
            $class = ($wp_query->query_vars['post_status'] == 'trash') ? ' class="current"' : '';
            $views['trash'] = sprintf(__('<a href="%s"'. $class .'>Trash <span class="count">(%d)</span></a>', 'trash'),
    return $views;

// Fix media counts
function fix_media_counts($views) {
    global $wpdb, $current_user, $post_mime_types, $avail_post_mime_types;
    $views = array();
    $_num_posts = array();
    $count = $wpdb->get_results( "
        SELECT post_mime_type, COUNT( * ) AS num_posts 
        FROM $wpdb->posts 
        WHERE post_type = 'attachment' 
        AND post_author = $current_user->ID 
        AND post_status != 'trash' 
        GROUP BY post_mime_type
    ", ARRAY_A );
    foreach( $count as $row )
        $_num_posts[$row['post_mime_type']] = $row['num_posts'];
    $_total_posts = array_sum($_num_posts);
    $detached = isset( $_REQUEST['detached'] ) || isset( $_REQUEST['find_detached'] );
    if ( !isset( $total_orphans ) )
        $total_orphans = $wpdb->get_var("
            SELECT COUNT( * ) 
            FROM $wpdb->posts 
            WHERE post_type = 'attachment' 
            AND post_author = $current_user->ID 
            AND post_status != 'trash' 
            AND post_parent < 1
    $matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts));
    foreach ( $matches as $type => $reals )
        foreach ( $reals as $real )
            $num_posts[$type] = ( isset( $num_posts[$type] ) ) ? $num_posts[$type] + $_num_posts[$real] : $_num_posts[$real];
    $class = ( empty($_GET['post_mime_type']) && !$detached && !isset($_GET['status']) ) ? ' class="current"' : '';
    $views['all'] = "<a href='upload.php'$class>" . sprintf( __('All <span class="count">(%s)</span>', 'uploaded files' ), number_format_i18n( $_total_posts )) . '</a>';
    foreach ( $post_mime_types as $mime_type => $label ) {
        $class = '';
        if ( !wp_match_mime_types($mime_type, $avail_post_mime_types) )
        if ( !empty($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']) )
            $class = ' class="current"';
        if ( !empty( $num_posts[$mime_type] ) )
            $views[$mime_type] = "<a href='upload.php?post_mime_type=$mime_type'$class>" . sprintf( translate_nooped_plural( $label[2], $num_posts[$mime_type] ), $num_posts[$mime_type] ) . '</a>';
    $views['detached'] = '<a href="upload.php?detached=1"' . ( $detached ? ' class="current"' : '' ) . '>' . sprintf( __( 'Unattached <span class="count">(%s)</span>', 'detached files' ), $total_orphans ) . '</a>';
    return $views;

good snippet, only one drawback, if no media items are in the library it spits out errors cause the result isnt an array. - chrismccoy
I defined $_num_posts as an array. This should fix the errors you get when no media items are in the library. - Paul
[+8] [2010-09-15 15:58:01] EAMann

Post Word Count

Tested on: Wordpress 3.0.1

(Originally extracted from the Post Word Count plug-in [1] by Nick Momrick [2])

Adds a count of total published words to the bottom of the "Right Now" box on the admin dashboard. Useful if you're using your blog as an outlet for something like NaNoWriMo [3] or if you just want to keep track of how prolific your blogging skills have become.

function post_word_count() {
    $count = 0;
    $posts = get_posts( array(
        'numberposts' => -1,
        'post_type' => array( 'post', 'page' )
    foreach( $posts as $post ) {
        $count += str_word_count( strip_tags( get_post_field( 'post_content', $post->ID )));
    $num =  number_format_i18n( $count );
    // This block will add your word count to the stats portion of the Right Now box
    $text = _n( 'Word', 'Words', $num );
    echo "<tr><td class='first b'>{$num}</td><td class='t'>{$text}</td></tr>";
    // This line will add your word count to the bottom of the Right Now box.
    echo '<p>This blog contains a total of <strong>' . $num . '</strong> published words!</p>';

// add to Content Stats table
add_action( 'right_now_content_table_end', 'post_word_count');
// add to bottom of Activity Box
add_action('activity_box_end', 'post_word_count');

Kudos to Rarst [4] for the query-free cleanup of the code!


Thanks for the assist, Rarst. I typically don't like to include direct database queries in plug-in function.php code, but like I said it was originally taken from someone else's plug-in. - EAMann
np, I tried this long time ago and it was a mess. :) Now with upgraded skills it was time to do it right. Why left old output part? I think it makes sense to display it with rest of stats. btw this version gives different total (comparing to explode), this is probably because of filters along the way and such when fetching via API. - Rarst
The difference in post count is a result of filters ... but using get_posts() will likely be a more accurate word count anyway. I left the old output line simply because that's how I've been using it ... more a difference of opinion than anything else ... I'll re-add your example to add it to the stats so people can pick. - EAMann
[+8] [2010-09-17 08:34:49] bueltge

Display Specific Content only for logged in users

Tested on: Wordpress 3.0.1

function content_only4logged_in($content) {

    if ( is_user_logged_in() &&
            !is_null($content) &&
         ) {
        return $content;
    } else {
        $content  = wp_html_excerpt( $content, 80 );
        $content .= ' …';
        $content .= __( 'Sorry, more of this content is only available for logged users.', FB_TEXTDOMAIN );
        return $content;
add_action( 'the_content', 'content_only4logged_in' );

more possibilities and informations on the post

I can't get this to display altered content for non-logged in users... the first part works fine, but it the user is not logged in and the page is marked private, I just get served the regular 404? - Amanda
[+8] [2010-09-30 11:57:18]

Loading scripts conditionally

Here is a way to load scripts only if a particular shortcode or widget is present. source: Loading scripts only if a particular shortcode or widget is present [1]

function has_my_shortcode($posts) {
    if ( empty($posts) )
        return $posts;
    $found = false;
    foreach ($posts as $post) {
        if ( stripos($post->post_content, '[my_shortcode') )
            $found = true;
    if ($found){
        $urljs = get_bloginfo( 'template_directory' ).IMP_JS;
    wp_register_script('my_script', $urljs.'myscript.js' );
    return $posts;
add_action('the_posts', 'has_my_shortcode');

And here is how to load scripts only if a certain widget is present

To load the script in the page where the widget is loaded only, you will have to add the is_active_widget() code, in you widget class. E.g., see the default recent comments widget (wp-includes/default-widgets.php, line 602):

class WP_Widget_Recent_Comments extends WP_Widget {
    function WP_Widget_Recent_Comments() {
        $widget_ops = array('classname' => 'widget_recent_comments', 'description' => __( 'The most recent comments' ) );
        $this->WP_Widget('recent-comments', __('Recent Comments'), $widget_ops);
        $this->alt_option_name = 'widget_recent_comments';
        if ( is_active_widget(false, false, $this->id_base) )
        add_action( 'wp_head', array(&$this, 'recent_comments_style') );
        add_action( 'comment_post', array(&$this, 'flush_widget_cache') );
        add_action( 'transition_comment_status', array(&$this, 'flush_widget_cache') );

[+8] [2010-11-10 18:42:26] Justin

Custom Dashboard CSS

/* Change WordPress dashboard CSS */
function custom_admin_styles() {
    echo '<style type="text/css">#wphead{background:#069}</style>';
add_action('admin_head', 'custom_admin_styles');

You can add any changes to the css between the tags.

[+8] [2010-12-03 18:13:33] PNMG

Remove Private and Protected Prefix

This function removes the "Privite:" prefix from posts and pages marked private. Useful for content only visible to logged in users or groups.

function the_title_trim($title) {
$title = attribute_escape($title);
$findthese = array(
$replacewith = array(
    '', // What to replace "Protected:" with
    '' // What to replace "Private:" with
$title = preg_replace($findthese, $replacewith, $title);
return $title;
add_filter('the_title', 'the_title_trim');

EDIT: Updated to include the removal of Protected: as well.

[+8] [2011-01-02 20:00:51] Martin-Al

Custom excerpt length

function excerpt($num) {
    $limit = $num+1;
    $excerpt = explode(' ', get_the_excerpt(), $limit);
    $excerpt = implode(" ",$excerpt)."... (<a href='" .get_permalink($post->ID) ." '>Read more</a>)";
    echo $excerpt;

Limit the length of the displayed excerpt by writing in the theme: excerpt('20');

Example: <?php excerpt('22'); ?> This will limit the excerpt to 22 characters.

The excerpt will be interupted with ... (Read More)

[+7] [2010-09-28 00:53:46] Dan Gayle

Make your Shortlinks Shorter by Removing WWW

Tested on: Wordpress 3.0.1

Make your shortlinks shorter if you include www. in your domain. Via [1]:

function sjc_alter_shortlink($shortlink) {
    $shortlink = preg_replace('/^(https?:\/\/)?(www\.)/','$1',$shortlink);
    return $shortlink;

(3) A check should be added to make sure the string "www." is only removed if it is found at the very beginning of the domain part of the original URL. Naively replacing it anywhere in the URL will lead to bugs if it had been used on a domain like (which actually appears to be running WordPress) :) - Ingve
@Ingve I fixed it, now it will remove only the initial www -
[+7] [2010-12-22 08:46:37] Pieter

Remove default fields contact info user profile and replace them with something more usable

The second part of this function has already been mentioned above, but removing the default fields - AIM, Yahoo IM and Jabber/Google Talk - not yet:

function update_contact_methods( $contactmethods ) {

// Remove annoying and unwanted default fields  

// Add new fields  
$contactmethods['phone'] = 'Phone';  
$contactmethods['mobile'] = 'Mobile';  
$contactmethods['address'] = 'Address';  

return $contactmethods;
add_filter('user_contactmethods', 'update_contact_methods');

Of course you can add as many fields as you want (see previous examples earlier in this thread) under "Add new fields"

[+7] [2011-02-21 19:03:12] Scott

Add parent page slug to body_class

* Function body_class_section
* Add the top level page to the body class for coloured sections


function body_class_section($classes) {
    global $wpdb, $post;
    if (is_page()) {
        if ($post->post_parent) {
            $parent  = end(get_post_ancestors($current_page_id));
        } else {
            $parent = $post->ID;
        $post_data = get_post($parent, ARRAY_A);
        $classes[] = 'section-' . $post_data['post_name'];
    return $classes;

This filter adds a unique body class based on the highest level parent of the current page. I use this for sites that have specific colours or layouts for each section of the site. It works best with sites based around pages. CSS examples:

.section-about { background: red; }
.section-portfolio { background: blue; }

Your theme must also make use of the body_class function [1].

Fix oEmbed flash objects

* Function my_oembed_wmode
* Fix oEmbed window mode for flash objects

add_filter('embed_oembed_html', 'my_oembed_wmode', 1);

function my_oembed_wmode( $embed ) {
    if ( strpos( $embed, '<param' ) !== false ) {
        $embed = str_replace( '<embed', '<embed wmode="transparent" ', $embed );
        $embed = preg_replace( '/param>/', 'param><param name="wmode" value="transparent" />', $embed, 1);
    return $embed;

I have had problems in the past where oEmbed Flash objects collide with drop down navigation menus. This filter fixes that problem by adding a transparent window mode to the embeds.

Remove the "comments" column from Admin page list

* Function custom_pages_columns
* Remove "comments" from pages overview (rarely use comments on pages)

add_filter('manage_pages_columns', 'custom_pages_columns');

function custom_pages_columns($defaults) {
    return $defaults;

I hardly ever make use of commenting on pages and this helps keep things tidy in the WordPress dashboard.


[+7] [2011-11-10 22:36:58] Nicole

Pre-populating post types

Here is one for this collection.

// This auto populates post types and posts.

add_filter( 'default_content', 'my_editor_content' );

function my_editor_content( $content ) {

    global $post_type;

    switch( $post_type ) {
        case 'your_post_type_here': //auto populate
            $content = 'The content you want to pre-populate the post type with.';

    return $content;

This can come in handy for when you need to post the same info over and over again with slight differences.

Nice one! I like this simple option. Can you expand this by possible showing ways of automatically populating custom fields or other criteria/options or possibly even the means of auto-inserting media? -
I can definitely see about expanding it. I have not really tried taking it further yet. - Nicole
Would love to see ways to expand this - JasonDavis
[+6] [2010-09-10 00:04:37] Chris_O

Enable Numeric Pagination

Tested on: Wordpress 3.0.1

/* Numeric Pagination ********************************************/

function numeric_pagination ($pageCount = 9, $query = null) {

 if ($query == null) {
  global $wp_query;
  $query = $wp_query;

 if ($query->max_num_pages <= 1) {

 $pageStart = 1;
 $paged = $query->query_vars['paged'];

 // set current page if on the first page
 if ($paged == null) {
  $paged = 1;

 // work out if page start is halfway through the current visible pages and if so move it accordingly
 if ($paged > floor($pageCount / 2)) {
  $pageStart = $paged - floor($pageCount / 2);

 if ($pageStart < 1) {
  $pageStart = 1;

 // make sure page start is
 if ($pageStart + $pageCount > $query->max_num_pages) {
  $pageCount = $query->max_num_pages - $pageStart;

 <div id="archive_pagination">
 if ($paged != 1) {
 <a href="<?php echo get_pagenum_link(1); ?>" class="numbered page-number-first"><span>&lsaquo; <?php _e('<< First', 'global'); ?></span></a>
 // first page is not visible...
 if ($pageStart > 1) {
  //echo 'previous';
 for ($p = $pageStart; $p <= $pageStart + $pageCount; $p ++) {
  if ($p == $paged) {
  <span class="numbered page-number-<?php echo $p; ?> current-numeric-page"><?php echo $p; ?></span>
<?php } else { ?>
  <a href="<?php echo get_pagenum_link($p); ?>" class="numbered page-number-<?php echo $p; ?>"><span><?php echo $p; ?></span></a>

 // last page is not visible
 if ($pageStart + $pageCount < $query->max_num_pages) {
  //echo "last";
 if ($paged != $query->max_num_pages) {
  <a href="<?php echo get_pagenum_link($query->max_num_pages); ?>" class="numbered page-number-last"><span><?php _e('>> Last', 'global'); ?> &rsaquo;</span></a>
<?php } ?>


(11) There's a function in WordPress for doing numeric pagination already, see - t31os
[+6] [2010-09-15 15:48:47] EAMann

Auto Include Google Analytics Code

Tested on: Wordpress 3.1 RC3

I've been using this script on all of my sites since WordPress 2.3.0 ... it just adds the standard Google tracking scripts to the footer.

// Add Google Analytics Tracking Code
function add_google_analytics() {
<script type="text/javascript">
    var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
    document.write(unescape("%3Cscript src='" + gaJsHost + "' type='text/javascript'%3E%3C/script%3E"));
<script type="text/javascript">
    try {
        var pageTracker = _gat._getTracker("UA-XXXXXXX-X");
    } catch(err) {}</script>

add_action('wp_footer', 'add_google_analytics');

Just be sure to replace UA-XXXXXXX-X with your own Google tracking code...

thanks for the share. I have been using this one as well but I would be curious to know if you are aware how this can be modified so that specific tags, post type pages or even posts themself can be passed additional values automatically making use of the campaign tracking var capabilities google provides. Additionally, what would need to be added if we wanted to add this to the footer of all admin pages to track admin activity? -
(1) Not sure about adding campaign tracking variables only because I haven't had a need for that yet. But to add the same scripts to admin pages, you'd just use add_action('admin_footer', 'add_google_analytics'); to hook on to the footer of admin pages. - EAMann
[+6] [2010-09-17 08:32:12] bueltge

List all constants for information and debugging

Tested on: Wordpress 3.0.1

Will only display the information if you are a logged in user

if ( is_user_logged_in() ) {
    print_r( @get_defined_constants() );

Here is version with optional filter that will partially match constant names and values:

function constants($filter = false) {

        $constants = get_defined_constants();

        if( $filter ) {

            $temp = array();

            foreach ( $constants as $key => $constant )
                if( false !== stripos( $key, $filter ) || false !== stripos( $constant, $filter ) )
                    $temp[$key] = $constant;

            $constants = $temp;

        ksort( $constants );
        var_dump( $constants );

[+6] [2010-11-04 17:11:02] t31os

Check if a post has embedded content.

Check if a post has embedded content, works inside the loop using the current post's ID, or alternatively can be passed an ID to determine the post to check for embedded content.

function has_embed( $post_id = false ) {
    if( !$post_id ) $post_id = get_the_ID();
    else $post_id = absint( $post_id );
    if( !$post_id ) return false;

    $post_meta = get_post_custom_keys( $post_id );
    $post_meta = array_map( 'trim' , $post_meta );

    foreach( $post_meta as $meta ) {
        if( '_oembed' != substr( $meta , 0 , 7 ) )
        return true;
    return false;

You'd use the function in the same way you check if a post has a tag..

if( has_embed() ) {
   // do whatever

Function returns true if an embed is found, false on fail.

Interesting, but I'm wondering, why would you use it? What kind of applications does it have? - matt
Checking if a post has an embed on a page that displays excerpts would be one use(and it's the original use case i wrote it for). Other possible use cases would be with users who write their own theme templates and want to provide functionality dependant on whether a post(or type) has embedded content, without the need for a filter on the_content or numerous get_post_custom_keys calls. - t31os
[+6] [2010-11-14 19:53:13]

Display Posts from Different Custom Post Types on homepage

By dropping the following code on the bottom of this post into your functions.php file you can get wordpress to automatically display posts from different custom post types you have created. Currently by default wordpress only display posts which belong to the default "posts" post type.

In the example provided below you will need to change the section which calls:

$query->set( 'post_type', array('post', 'page', 'services', 'attachment'));

With your own custom post types which you would like to include in the homepage post list results. In this case we are asking wordpress to return to us all posts belonging to the default "post" and "page" post_type then asking wordpress to also include the custom post type we created for "services" and finally the default wordpress post type of "attachment" which just means that anytime something is added to the media library it will automatically get displayed on the homepage as a separate entry.

// make sure to edit the post types you wanted included in the list below
add_filter( 'pre_get_posts', 'my_homepage_post_list' );
function my_homepage_post_list ( $query ) {
    if ( is_home() && false == $query->query_vars['suppress_filters'] )
        $query->set( 'post_type', array('post', 'page', 'services', 'attachment'));
    return $query;

You can also utilize this custom query in different locations, such as in a custom feed through something like this

if (( is_home() && false == $query->query_vars['suppress_filters'] ) || is_feed())

[+6] [2010-12-21 20:19:20] Philip

Change default Author Slug

Put this in your functions to change the default Author Slug to whatever you want,
just change the "sellers" to the slug you want.

// Change URL Slug from Author to Sellers
function new_author_base() {
    global $wp_rewrite;
    $author_slug = 'sellers';
    $wp_rewrite->author_base = $author_slug;
add_action('init', 'new_author_base');

(4) You'd not want to run that code on every page load however. - t31os
Yeah, flushing roles on every load saves you a lot of sellers. :) Better use the plugin Edit Author Slug. - fuxia
I have update the function!!! Thanks for your input:) - Philip
[+6] [2011-01-02 20:13:51] Martin-Al

Add "Next-page"-button in WYSIYG-editor

function wysiwyg_editor($mce_buttons) {
    $pos = array_search('wp_more',$mce_buttons,true);
    if ($pos !== false) {
        $tmp_buttons = array_slice($mce_buttons, 0, $pos+1);
        $tmp_buttons[] = 'wp_page';
        $mce_buttons = array_merge($tmp_buttons, array_slice($mce_buttons, $pos+1));
    return $mce_buttons;

[+6] [2011-01-04 17:02:27] Michal Mau

Add custom styles to TinyMCE editor

Sometimes users and clients get confused about how their content is displayed in the editor versus how it is displayed on the front-end. Copying just a few relevant lines from your main stylesheet into your new tinymce.css can help a lot:

function custom_mce_css($wp) {
    return $wp .= ',' . get_bloginfo('stylesheet_directory') . '/css/tinymce.css';
add_filter( 'mce_css', 'custom_mce_css' );

Nice. Ive just discoverd there is a solution by Seamus Leahy that extends all this one step further by adding a body class to tinymce. - Michal Mau
Isn't this already covered by core & editor styles? - kaiser
I prefer to create a stylesheet for both front-end and TinyMCE in one go. Then I use core functionality of the add_editor_style() function to include the stylesheet and ensure it's loaded when TinyMCE loads. Codex article at - Philip Downer
[+6] [2011-06-08 08:22:16] Per Sandström

Use figure and figcaption for captions

Tested on: WordPress 3.1.3

(Credits to WP Engineer:

function mytheme_caption( $attr, $content = null ) {
    $output = apply_filters( 'img_caption_shortcode', '', $attr, $content );
    if ( $output != '' )
        return $output;

    extract( shortcode_atts ( array(
    'id' => '',
    'align' => 'alignnone',
    'width'=> '',
    'caption' => ''
    ), $attr ) );

    if ( 1 > (int) $width || empty( $caption ) )
        return $content;

    if ( $id ) $id = 'id="' . $id . '" ';

    return '<figure ' . $id . 'class="wp-caption ' . $align . '" style="width: ' . $width . 'px">'
. do_shortcode( $content ) . '<figcaption class="wp-caption-text">' . $caption . '</figcaption></figure>';

add_shortcode( 'wp_caption', 'mytheme_caption' );
add_shortcode( 'caption', 'mytheme_caption' );

[+6] [2012-01-08 23:50:17] Sagive SEO

Here are some nice shortcodes for you to use:

1. Easy to add twitter & facebook share button Shortcode

function shreplz() {
   return '
    <div class="sharebox">
    <div class="twittme"><a href="" class="twitter-share-button" data-count="horizontal">Tweet</a><script type="text/javascript" src="//"></script></div>
    <div class="shareface"><a name="fb_share"></a> <script src="" type="text/javascript"></script></div>
    <br style="clear: left;" />
add_shortcode('sharethis', 'shreplz');
// how to use: [sharethis]

2. Easy Remote site snapshot using Wordpress API shortcode

function wpr_snap($atts, $content = null) {
            "snap" => '',
            "url" => '',
            "alt" => 'My image',
            "w" => '400', // width
            "h" => '300' // height
        ), $atts));

    $img = '<img src="' . $snap . '' . urlencode($url) . '?w=' . $w . '&h=' . $h . '" alt="' . $alt . '"/>';
        return $img;

add_shortcode("snap", "wpr_snap");
//how to use: [snap url="" alt="Cool Site!" w="300px" h="200px"]

3. Easy to use & embed iFrame Shortcode

function GenerateIframe( $atts ) {
    extract( shortcode_atts( array(
        'href' => 'http://the-url',
        'height' => '550px',
        'width' => '600px',     
    ), $atts ) );

    return '<iframe src="'.$href.'" width="'.$width.'" height="'.$height.'"> <p>Your Browser does not support Iframes.</p></iframe>';
add_shortcode('iframe', 'GenerateIframe');
// how to use: [iframe href="" height="480" width="640"]

4. Easy to include remote file / doc with Shortcode

function getfile_content( $atts ) {
  extract( shortcode_atts( array(
    'fileurl' => ''
  ), $atts ) );

  if ($fileurl!='')
    return @file_get_contents($fileurl);

add_shortcode( 'getfile', 'getfile_content' );
// how to use: [getfile fileurl=""]

Here are some Comments Related Snippets:

1. close the ability to comment globaly

function closeCommentsGlobaly($data) { return false; }
add_filter('comments_number', 'closeCommentsGlobaly');
add_filter('comments_open', 'closeCommentsGlobaly');

2. Give admin a different Css Class for he's comments

if (1 == $comment->user_id)
echo 'siteadmin'; // pick your class here

3. a really cool rich with data list of comments - gr8 for custom locked page

$comments = get_comments( array(
    'number'    => 10, // how many comments
    'status'    => 'approve' // type of comments
) );

foreach($comments as $eachComment){

// collect the data and assign it
$commentID = comment_ID;
$commentAuthorEmail = $eachComment->comment_author_email;
$commentPostId = $eachComment->comment_post_ID;
$commentPostTitle = get_the_title( $commentPostId );
$commentPostUrl = get_permalink( $commentPostId );
$comment_sidebarnumber = get_comments_number( $commentPostId );

global $wpdb;
$userCommentCount = $wpdb->get_var('SELECT COUNT('.$commentID.') FROM ' . $wpdb->comments. ' WHERE comment_author_email = "' . $commentAuthorEmail . '"');

    echo    '<div style="border: 1px solid #ccc; padding: 10px;">';
    echo    '<ul style="margin: 0px;">';
    echo    '<li>Name: '. $eachComment->comment_author .'</li>';
    echo    '<li>Commented about: <a href="'.$commentPostUrl.'">'. $commentPostTitle .'</a></li>';
    echo    '<li>Commented On: '. $eachComment->comment_date .'</li>';
    echo    '<li>Commneter Site: '. $eachComment->comment_author_email .'</</li>';
    echo    '<li>Commenter Email: '. $eachComment->comment_author_email .'</</li>';
    echo    '<li>This Commenter'. $eachComment->comment_author .' Commented '. $userCommentCount .' on your site</</li>';
    echo    '</ul>';
    echo    '<p style="padding: 10px;"><strong>'. $eachComment->comment_author .' wrote</strong>: '. $eachComment->comment_content .'</p>';
    echo    '</div>';


[+5] [2010-11-05 15:19:07] Horttcore

Add auto-update/plugin-installer on you localhost

define ('FS_METHOD', 'direct');

Put this in your wp-config.php.

so this automatically updates any/all of your plugins whenever something new is available? -
Nope, you just don't need a ftp login to update your core or plugins locally - Horttcore
[+5] [2010-12-02 23:07:15] PNMG

Conditional to check for hierarchy descendant

A conditional function to check if the current page is a descendant of the ID given to it. Useful for determining if a page is a grandchild, great-grandchild or father down the hierarchy tree.

function is_tree($pid) {      // $pid = The ID of the page we're looking for pages underneath
    global $post;         // load details about this page

    $anc = get_post_ancestors( $post->ID );
    foreach($anc as $ancestor) {
        if(is_page() && $ancestor == $pid) {
            return true;
               return true;   // we're at the page or at a sub page
               return false;  // we're elsewhere

I've been looking for this for awhile. Thanks for putting it together! Can I ask for a bit of clarification on use case. Ideally, I would like to use this in my menu listings so that if i have a top level parent menu across the top of the site that only shows Gen 1 elements. When I'm on a Gen 2-3 element, the Gen1 element can be highlighted via a "current-parent" css attribute. Is this possible? - Scott B
[+5] [2010-12-18 21:46:16] Norcross

Create a conditional tag for custom taxonomies

In this example, 'student' was a custom post type, and 'stud_cat' was the custom taxonomy. Use has_student(null) for the conditional

    function has_student( $student, $_post = null ) {
    if ( !empty( $student ) )
        return false;
    if ( $_post )
        $_post = get_post( $_post );
        $_post =& $GLOBALS['post'];
    if ( !$_post )
        return false;
    $r = is_object_in_term( $_post->ID, 'studcat', $student );
    if ( is_wp_error( $r ) )
        return false;
    return $r;

(1) I think this gets replaced with has_term() now that 3.1 is released? - Rarst
[+5] [2010-12-28 00:32:05] chuck reynolds

Make WordPress Editor Allow iFrames

// make TinyMCE allow iframes
add_filter('tiny_mce_before_init', create_function( '$a',
'$a["extended_valid_elements"] = "iframe[id|class|title|style|align|frameborder|height|longdesc|marginheight|marginwidth|name|scrolling|src|width]"; return $a;') );

[+5] [2011-02-10 22:10:00] user3082

Resize large image on upload

Image will be resize according to the large size in your media settings.

/**resize on upload to the largest size in media setting */

function replace_uploaded_image($image_data) {
// if there is no large image : return
if (!isset($image_data['sizes']['large'])) return $image_data;

// path to the uploaded image and the large image
$upload_dir = wp_upload_dir();
$uploaded_image_location = $upload_dir['basedir'] . '/' .$image_data['file'];
$large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file'];

// delete the uploaded image

// rename the large image

// update image metadata and return them
$image_data['width'] = $image_data['sizes']['large']['width'];
$image_data['height'] = $image_data['sizes']['large']['height'];

return $image_data;

Does this mean that the original large file uploaded is actually replaced? My php is not great, but the answer seems to be yes? - davemac
@davemac I realise this is very old now, but from what I understand of the code, the original image file is resized to the same dimensions as the 'large' image size set in the WordPress settings screen. Which is great but then you just end up with 2 images of the same size. I'd suggest manually setting the values to make the original image only as big as the largest file you will ever realistically use on your site. Then you have an almost original image to work with in future. - Phill Healey
That makes more sense, thanks Phill - davemac
[+5] [2011-09-14 17:19:38] Philip Downer

Easy WordPress Security Fixes

Security through obscurity is the name of the game here. These functions do three different things.

  1. Remove the version string from the code. No point in telling folks what version we're running.
  2. Removes any error messages (Wrong Password, No Such User, etc.) from admin login screens
  3. When the admin posts a comment, a CSS class is added. This removes the admin name in comments.

    remove_action('wp_head', 'wp_generator');
    //HIDE LOGIN ERROR MESSAGES (Wrong Password, No Such User etc.)
    add_filter('login_errors',create_function('$a', "return null;"));
    // Remove admin name in comments class
    // Source:
    function remove_comment_author_class( $classes ) {
        foreach( $classes as $key => $class ) {
            if(strstr($class, "comment-author-")) {
                unset( $classes[$key] );
        return $classes;
    add_filter( 'comment_class' , 'remove_comment_author_class' );

Removing the Wordpress version number is bad practice. It is much safer to keep your Wordpress updated with the latest security fixes AT ALL TIMES. Added bonus: wanna-be script kiddies will move along to older versions. - knutole
(2) @knotole, it is not bad practice. It is your opinion... albeit this is pretty standard. - Jeremy
[+5] [2011-09-14 17:21:41] Philip Downer

Replace Default Gravatar with Custom Image

All you'll need to customize is the path to your default image.

function custom_gravatar($avatar_defaults) {
    $logo = get_bloginfo('template_directory') . '/images/icons/gravatar_logo.jpg'; //Change to whatever path you like.
    $avatar_defaults[$logo] = get_bloginfo('name');
    return $avatar_defaults;
add_filter( 'avatar_defaults', 'custom_gravatar' );

[+5] [2011-10-13 15:39:45] dalethedeveloper

Show template files being included

Display inline comment with Template File and get_template_part files being included when rendering pages. Handy for troubleshooting multipart templates.

function template_snoop(){
    $args = func_get_args();
    if( !is_admin() and $args[0] ){
        if( $args[0] == 'template_include' ) {
            echo "<!-- Base Template: {$args[1]} -->\n";
        } elseif( strpos($args[0],'get_template_part_') === 0 ) {
            global $last_template_snoop;
            if( $last_template_snoop )
                echo "\n\n<!-- End Template Part: {$last_template_snoop} -->";
            $tpl = rtrim(join('-',  array_slice($args,1)),'-').'.php';
            echo "\n<!-- Template Part: {$tpl} -->\n\n";
            $last_template_snoop = $tpl;

[+4] [2010-09-30 01:02:51]

Auto Clean SEO Slugs without removing functionality

Tested on: Wordpress 3.0.1

By adding this code to your functions.php file wordpress will automatically clean up the slug URL title by removing all unnecessary words. I have also extended the capabilities with additional customizations which hide the screen option for slug as well as the metabox. By including the code below any new post you create will automatically get shortened and you will still have the ability to manually edit the slug by clicking on the url under the post title and saving the post.

   add_filter('name_save_pre', 'seo_slugs', 0);
   function seo_slugs($slug) {
    // We don't want to change an existing slug
 if ($slug) return $slug;
 global $wpdb;
 $seo_slug = strtolower(stripslashes($_POST['post_title']));
 $seo_slug = preg_replace('/&.+?;/', '', $seo_slug); // kill HTML entities
    // kill anything that is not a letter, digit, space or apostrophe
 $seo_slug = preg_replace ("/[^a-zA-Z0-9 \']/", "", $seo_slug);
    // Turn it to an array and strip common words by comparing against c.w. array
 $seo_slug_array = array_diff (split(" ", $seo_slug), seo_slugs_stop_words());
    // Turn the sanitized array into a string
 $seo_slug = join("-", $seo_slug_array);
 return $seo_slug;
   function seo_slugs_stop_words () {
   return array ("a", "able", "about", "above", "abroad", "according", "accordingly", "across", "actually", "adj", "after", "afterwards", "again", "against", "ago", "ahead", "ain't", "all", "allow", "allows", "almost", "alone", "along", "alongside", "already", "also", "although", "always", "am", "amid", "amidst", "among", "amongst", "an", "and", "another", "any", "anybody", "anyhow", "anyone", "anything", "anyway", "anyways", "anywhere", "apart", "appear", "appreciate", "appropriate", "are", "aren't", "around", "as", "a's", "aside", "ask", "asking", "associated", "at", "available", "away", "awfully", "b", "back", "backward", "backwards", "be", "became", "because", "become", "becomes", "becoming", "been", "before", "beforehand", "begin", "behind", "being", "believe", "below", "beside", "besides", "best", "better", "between", "beyond", "both", "brief", "but", "by", "c", "came", "can", "cannot", "cant", "can't", "caption", "cause", "causes", "certain", "certainly", "changes", "clearly", "c'mon", "co", "co.", "com", "come", "comes", "concerning", "consequently", "consider", "considering", "contain", "containing", "contains", "corresponding", "could", "couldn't", "course", "c's", "currently", "d", "dare", "daren't", "definitely", "described", "despite", "did", "didn't", "different", "directly", "do", "does", "doesn't", "doing", "done", "don't", "down", "downwards", "during", "e", "each", "edu", "eg", "eight", "eighty", "either", "else", "elsewhere", "end", "ending", "enough", "entirely", "especially", "et", "etc", "even", "ever", "evermore", "every", "everybody", "everyone", "everything", "everywhere", "ex", "exactly", "example", "except", "f", "fairly", "far", "farther", "few", "fewer", "fifth", "first", "five", "followed", "following", "follows", "for", "forever", "former", "formerly", "forth", "forward", "found", "four", "from", "further", "furthermore", "g", "get", "gets", "getting", "given", "gives", "go", "goes", "going", "gone", "got", "gotten", "greetings", "h", "had", "hadn't", "half", "happens", "hardly", "has", "hasn't", "have", "haven't", "having", "he", "he'd", "he'll", "hello", "help", "hence", "her", "here", "hereafter", "hereby", "herein", "here's", "hereupon", "hers", "herself", "he's", "hi", "him", "himself", "his", "hither", "hopefully", "how", "howbeit", "however", "hundred", "i", "i'd", "ie", "if", "ignored", "i'll", "i'm", "immediate", "in", "inasmuch", "inc", "inc.", "indeed", "indicate", "indicated", "indicates", "inner", "inside", "insofar", "instead", "into", "inward", "is", "isn't", "it", "it'd", "it'll", "its", "it's", "itself", "i've", "j", "just", "k", "keep", "keeps", "kept", "know", "known", "knows", "l", "last", "lately", "later", "latter", "latterly", "least", "less", "lest", "let", "let's", "like", "liked", "likely", "likewise", "little", "look", "looking", "looks", "low", "lower", "ltd", "m", "made", "mainly", "make", "makes", "many", "may", "maybe", "mayn't", "me", "mean", "meantime", "meanwhile", "merely", "might", "mightn't", "mine", "minus", "miss", "more", "moreover", "most", "mostly", "mr", "mrs", "much", "must", "mustn't", "my", "myself", "n", "name", "namely", "nd", "near", "nearly", "necessary", "need", "needn't", "needs", "neither", "never", "neverf", "neverless", "nevertheless", "new", "next", "nine", "ninety", "no", "nobody", "non", "none", "nonetheless", "noone", "no-one", "nor", "normally", "not", "nothing", "notwithstanding", "novel", "now", "nowhere", "o", "obviously", "of", "off", "often", "oh", "ok", "okay", "old", "on", "once", "one", "ones", "one's", "only", "onto", "opposite", "or", "other", "others", "otherwise", "ought", "oughtn't", "our", "ours", "ourselves", "out", "outside", "over", "overall", "own", "p", "particular", "particularly", "past", "per", "perhaps", "placed", "please", "plus", "possible", "presumably", "probably", "provided", "provides", "q", "que", "quite", "qv", "r", "rather", "rd", "re", "really", "reasonably", "recent", "recently", "regarding", "regardless", "regards", "relatively", "respectively", "right", "round", "s", "said", "same", "saw", "say", "saying", "says", "second", "secondly", "see", "seeing", "seem", "seemed", "seeming", "seems", "seen", "self", "selves", "sensible", "sent", "serious", "seriously", "seven", "several", "shall", "shan't", "she", "she'd", "she'll", "she's", "should", "shouldn't", "since", "six", "so", "some", "somebody", "someday", "somehow", "someone", "something", "sometime", "sometimes", "somewhat", "somewhere", "soon", "sorry", "specified", "specify", "specifying", "still", "sub", "such", "sup", "sure", "t", "take", "taken", "taking", "tell", "tends", "th", "than", "thank", "thanks", "thanx", "that", "that'll", "thats", "that's", "that've", "the", "their", "theirs", "them", "themselves", "then", "thence", "there", "thereafter", "thereby", "there'd", "therefore", "therein", "there'll", "there're", "theres", "there's", "thereupon", "there've", "these", "they", "they'd", "they'll", "they're", "they've", "thing", "things", "think", "third", "thirty", "this", "thorough", "thoroughly", "those", "though", "three", "through", "throughout", "thru", "thus", "till", "to", "together", "too", "took", "toward", "towards", "tried", "tries", "truly", "try", "trying", "t's", "twice", "two", "u", "un", "under", "underneath", "undoing", "unfortunately", "unless", "unlike", "unlikely", "until", "unto", "up", "upon", "upwards", "us", "use", "used", "useful", "uses", "using", "usually", "v", "value", "various", "versus", "very", "via", "viz", "vs", "w", "want", "wants", "was", "wasn't", "way", "we", "we'd", "welcome", "well", "we'll", "went", "were", "we're", "weren't", "we've", "what", "whatever", "what'll", "what's", "what've", "when", "whence", "whenever", "where", "whereafter", "whereas", "whereby", "wherein", "where's", "whereupon", "wherever", "whether", "which", "whichever", "while", "whilst", "whither", "who", "who'd", "whoever", "whole", "who'll", "whom", "whomever", "who's", "whose", "why", "will", "willing", "wish", "with", "within", "without", "wonder", "won't", "would", "wouldn't", "x", "y", "yes", "yet", "you", "you'd", "you'll", "your", "you're", "yours", "yourself", "yourselves", "you've", "z", "zero");

When adding the additional code below to your functions.php file it will remove/hide the slug option for the screen options dropdown as well as the metabox.

   function hide_slug_options() {
 global $post;
 global $pagenow;
 $hide_slugs = "<style type=\"text/css\">#slugdiv, #edit-slug-box, [for=\"slugdiv-hide\"] { display: none; }</style>\n";
 if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php') print($hide_slugs);
   add_action( 'admin_head', 'hide_slug_options'  );

[+4] [2010-11-09 08:17:27] tomcat23

Exclude child categories of a specific category.

Pretty straight forward, but I couldn't find anyone doing exactly what I needed. Also it will display the post if the parent category is selected, except if that post has a child category of that parent selected.

   /* this code excludes all of the children of (category id = 20) posts
       on the HOME page, but allows parent (category id = 20) to be shown. */

    function exclude_category_children($query) {
        $child_cats = (array) get_term_children('20', 'category');
        if ( $query->is_home ) {
        $query->set('category__not_in', $child_cats);
        return $query;
    add_filter('pre_get_posts', 'exclude_category_children');

[+4] [2011-10-14 16:40:42] byronyasgur

is_tree() conditional Function

/* Adapted from csstricks with addition of
ancestors .... use = if(is_tree($id)) { // do stuff } ... Returns true if the
page is  = $id OR any of it's children OR descendants */

function is_tree($pid) {      // $pid = The ID of the page we're looking for pages underneath
  global $post;         // load details about this page
  $ancestors = get_post_ancestors($post);
    return true;   // we're at the page or at a sub page
    return false;  // we're elsewhere 

[+4] [2011-12-04 11:47:31]

Automatically create a new page upon activating a theme

if (isset($_GET['activated']) && is_admin()){
    $new_page_title = 'This is the page title';
    $new_page_content = 'This is the page content';
    $new_page_template = ''; //ex. template-custom.php. Leave blank if you don't want a custom page template.

//don't edit under this line
$page_check = get_page_by_title($new_page_title);
$new_page = array(
    'post_type' => 'page',
    'post_title' => $new_page_title,
    'post_content' => $new_page_content,
    'post_status' => 'publish',
    'post_author' => 1,
    $new_page_id = wp_insert_post($new_page);
        update_post_meta($new_page_id,'_wp_page_template', $new_page_template);

[+4] [2011-12-04 11:56:21]

Display the users that have submitted the most comments without a plugin

function top_comment_authors($amount = 5) {
global $wpdb;
$results = $wpdb->get_results('
    COUNT(comment_author_email) AS comments_count, comment_author_email, comment_author, comment_author_url
    FROM '.$wpdb->comments.'
    WHERE comment_author_email != "" AND comment_type = "" AND comment_approved = 1
    GROUP BY comment_author_email
    ORDER BY comments_count DESC, comment_author ASC
    LIMIT '.$amount
$output = "<ul>";
foreach($results as $result) {
    $output .= "<li>".$result->comment_author."</li>";
$output .= "</ul>";
echo $output;

Other options you can call: $result->comment_author_email $result->comments_count $result->comment_author_url

[+3] [2010-09-13 21:23:32] gabrielk

Get the Users Real IP Address whenever possible

Tested on: Wordpress 3.0.1

If you're using a proxy or load balancer, adding this to your wp-config.php file or functions.php

// Gets the user's real IP address

$_SERVER['REMOTE_ADDR'] = getRealIpAddress();
function getRealIpAddress( $validate = true ) {
    if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ) {
        $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        $ip = trim($ips[count($ips) - 1]);
    } elseif ( isset($_SERVER['HTTP_X_REAL_IP']) && !empty($_SERVER['HTTP_X_REAL_IP']) ) {
        $ip = $_SERVER['HTTP_X_REAL_IP'];
    } elseif ( isset($_SERVER['HTTP_CLIENT_IP']) && !empty($_SERVER['HTTP_CLIENT_IP']) ) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];

    if ( $validate && function_exists('filter_var') &&  filter_var($ip, FILTER_VALIDATE_IP, array('flags' => FILTER_FLAG_IPV4, FILTER_FLAG_NO_PRIV_RANGE, FILTER_FLAG_NO_RES_RANGE)) )
        return $ip;
    elseif ( $validate )
        return long2ip(ip2long($ip));

    return $ip;

(1) what does this do exactly? -
When a user is behind a proxy or load balancer, then anything that grabs that user's IP address using the superglobal $_SERVER['REMOTE_ADDR'] will see the proxy or load balancer's IP address. The proxy/lb in return puts the user's original IP address in the X-Forwarded-For X-Real-Ip, or Client-Ip headers (depending on the proxy/lb configuration). Thus, when commenting (or posting, but that's less relevant) WP will see a lot of users coming from the same IP address. This fixes that by replacing $_SERVER['REMOTE_ADDR'] with the original IP. - gabrielk
Those are easy to trick by adding the HTTP_X_FORWARDED_FOR header manually into each browser request. My favorite is to set it which will then set $_SERVER['REMOVE_ADDR'] to an empty value with that example. - hakre
[+3] [2010-09-17 08:35:59] bueltge

List all SubCategories

Tested on: Wordpress 3.0.1

$echo = '<ul>' . "\n";
$childcats = get_categories('child_of=' . $cat . '&hide_empty=1');
foreach ($childcats as $childcat) {
    if (1 == $childcat->category_parent) {
        $echo .= "\t" . '<li><a href="' . get_category_link($childcat->cat_ID).'" title="' . $childcat->category_description . '">';
        $echo .= $childcat->cat_name . '</a>';
        $echo .= '</li>' . "\n";
$echo .= '</ul>' . "\n";
echo $echo;

also here, more informations and functins in the post

(1) Why would you do this when there's a function available specifically for displaying a list of categories..See:… - t31os
[+3] [2010-11-17 11:14:14]

Automatically adding header images from directory location

Within the default them which comes with wordpress you will notice an additional theme menu which gets activated that lets you select a header image to be utilized. Within the default theme code these images are hardcoded into the functions.php file. The code below allows wordpress to automatically pick up new images based upon a specific header image directly you can create on your server (or within your themes folder).

It will automatically include any .jpg or .jpeg files. Every image must have a associating thumbnail file but this can just be a copy of the original with a different name with a file name that has to end in "-thumbnail". The associating name is used as the description in the headers appearance settings and underscores are automatically replaced with spaces. (e.g. My_Header_Image_A.jpg, My_Header_Image_A=thumbnail.jpg will have a description automatically presented a “My Header Image A”)

if ($handle = opendir( TEMPLATEPATH . '/images/headers/') ) {
    $headers = array();
    while (false !== ($file = readdir($handle))) {
        $pos = strrpos( $file, '.' );
        if( $pos !== false && $pos > 0 ) {
            $file_name = substr( $file, 0, $pos );
            if( strpos( $file_name, "-thumbnail" ) === false ) {
                $file_ext = substr( $file, $pos+1 );
                $file_ext_low = strtolower( $file_ext );
                if( $file_ext_low == "jpg" || $file_ext_low == "jpeg" ) {
                    $headers[$file_name] = array (
                    'url' => '%s/images/headers/' . $file,
                    'thumbnail_url' => '%s/images/headers/' . $file_name ."-thumbnail." . $file_ext,
                    'description' => __( str_replace( "_", " ", $file_name ), 'twentyten' )
register_default_headers( $headers );

[+3] [2011-06-13 11:14:20] Daniel Sachs

Remove Admin Backend Menus for all users, except User #1 (usually the first Admin)

/*  Restrict access
function remove_menus () {
global $menu;
$user = wp_get_current_user();
    if ($user->ID!=1) { // Is not administrator,

        $restricted = array(__('Dashboard'), __('Posts'), __('Media'), __('Links'), __('Pages'), __('Appearance'), __('Tools'), __('Users'), __('Settings'), __('Comments'), __('Plugins'));
        end ($menu);
        while (prev($menu)){
            $value = explode(' ',$menu[key($menu)][0]);
            if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){unset($menu[key($menu)]);}
add_action('admin_menu', 'remove_menus');

User 1 may be the first admin. But after adding new administrators the first one may be just a regular user. Ask for capabilities, not for numbers. Plus, this code belongs into a plugin, not in the functions.php. There is zero relation to the theme. - fuxia
This way you can allow all admins to act as normal but at the same time hide the first admin and reserve it to system administrator / support team. I disagree that this code belongs to a plugin. Functions.php is a plugin. This file basically acts like a plugin Theme_Development#Functions_File - Daniel Sachs
But the functions.php contains logic which is tied to the theme, because if you switch themes the whole code is gone. So, unless the code depends on the theme and vice versa – do not use the functions.php as a mu-plugin. - fuxia
Yes. But let's consider this: You are developing a website for a client. This website will always use only one theme, the one designed by the designer. The theme is the website. You add custom post types, metaboxes, load additional functions, etc. Now you do want to give some users the admin capabilities, but you want to hide some sections of the site that your client will never use or confuse them (Links, Tools, Comments, are the best examples) and to give the support team a sort of "SuperAdmin" so they can see the whole admin area. - Daniel Sachs
I see that you disagree with the usage, but the function works and is useful, so I do not understand why -1 it. - Daniel Sachs
It doesn’t belong into a functions.php – like many answers here, unfortunately – and it will break sooner or later. Besides that, it violates the WordPress coding standards. Please, don’t take it personally. My vote is a recommendation for the reader. - fuxia
Of course, nothing personal, tosco. We all try to help and learn. We disagree, it happens :) - Daniel Sachs
@Daniel Sachs Take a look at this gist and exchange user_login with role(?). - kaiser
@kaiser This is great, if I wanted to use it as a plugin or unset menus for all admins. As i said, this allows to unset for just one specific user with ID1 - Daniel Sachs
(1) If you look at the linked plugin, then it allows you to set access groups per "whatever a user offers (login name, role, ID)". Relying on IDs generally is a "not best practice" concept. That's all i wanted to point out. - kaiser
[+3] [2011-08-19 16:37:55] Giri

Disable browser upgrade warning in wordpress 3.2

enter image description here

//Disable browser upgrade warning in wordpress 3.2
function disable_browser_upgrade_warning() {
    remove_meta_box( 'dashboard_browser_nag', 'dashboard', 'normal' );
add_action( 'wp_dashboard_setup', 'disable_browser_upgrade_warning' );

Pure plugin material. - fuxia
@toscho So what? Still its working. Isn't it? - Giri
(4) Not after switching themes. Themes are for frontends. - fuxia
[+3] [2011-11-30 11:40:53]

Adds a custom dropdown option to WP_NAV_MENUS where the user can select a predefined css class for each menu item

<?php function menu_item_class_select(){
    global $pagenow;
    if ($pagenow == "nav-menus.php"){

    function create_dd(v){
        //create dropdown
        var dd = jQuery('<select class="my_class"></select>');
        //create dropdown options
        //array with the options you want
        var classes = ["","class1","class2","class3"];
        jQuery.each(classes, function(i,val) {
            if (v == val){
                dd.append('<option value="'+val+'" selected="selected">'+val+'</option>');
                dd.append('<option value="'+val+'">'+val+'</option>');
        return dd;
    jQuery(".edit-menu-item-classes").each(function() {
        //add dropdown
        var t = create_dd(jQuery(this).val());
        //hide all inputs
    //update input on selection
    jQuery(".my_class").bind("change", function() {
        var v = jQuery(this).val();
        var inp = jQuery(this).next();

<?php } }


[+2] [2010-11-04 17:06:45] t31os

Exclude default category from public pages

Excludes the default category from the front-facing side of the website.
Code excludes the admin area, else you'll have no way to manage posts assigned with the default category.

add_filter( 'list_terms_exclusions', 'exclude_default_cat' );

function exclude_default_cat( $exclusions ) {
    if( !is_admin() )
        $exclusions .=  "AND t.term_id != " . get_option( 'default_category' ) . " ";
    return $exclusions;

[+2] [2010-12-03 06:44:36] Ünsal Korkmaz

Displaying information for logged in users

if ( is_user_logged_in() ) {


is not working in functions.php file. You can use this code:

if ( !function_exists('is_user_logged_in') ) :

 function is_user_logged_in() {
$user = wp_get_current_user();

if ( $user->id == 0 ){
// This section if user is not logged in
} else {
// This section if user is logged in

if( !current_user_can('read') ) should catch guests (ie. non-logged in users) .. - t31os
(2) I just tested it and is_user_logged_in() seems to work just fine in functions.php?.. Any background info on why it's not supposed to? - Rarst
[+2] [2011-03-21 17:51:58] kaiser

Remove "Comments" link from admin bar if comment status is closed

You can set the default comment status to 'closed', but the comments link will stay. Simply drop the following into your functions.php file to get rid of it based on the condition. Offers 2 different approaches.

 * Disable 'Comments' link if default status is _closed_
function remove_comments() 
    $default_comment_status = get_option( 'default_comment_status' );

    if ( $default_comment_status == 'closed' ) 
        remove_action( 'admin_bar_menu', 'wp_admin_bar_comments_menu', 50 );

        // optional solution using the WP_Admin_Bar class from /wp-includes/class-wp-admin-bar.php
        # global $wp_admin_bar;
        # $wp_admin_bar->remove_menu( 'comments' );

[+2] [2011-06-13 11:11:33] Daniel Sachs

Remove Admin (User #1) from User list

function your_pre_user_query($user_search) {
  $user = wp_get_current_user();
  if ($user->ID!=1) {
    global $wpdb;
    $user_search->query_where = str_replace('WHERE 1=1',
      "WHERE 1=1 AND {$wpdb->users}.ID<>1",$user_search->query_where);

Again: user 1 may be a non-admin. See Roles and Capabilities. - fuxia
It's an example. Plus in default installations the user 1 is Admin - the first user created. This is why I emphasized (User #1) - Daniel Sachs
It is an example showing how not to check for administrative capabilities. You should not use this code in a real website. - fuxia
Exactly. This code doesn't check for capabilities, toscho, but for specific user. This code has nothing to do with capabilities and I haven't mentioned capabilities anywhere. I don't see why this can not be used on production sites. - Daniel Sachs
@Daniel Sachs If you're searching for the first ever added administrator, please check the roles of all users first, then sort them by their ID and take the first one. As @toscho said: Currently it's "how you should not do it example". Reasons: a) the actual Admin might not be the one with the lowest ID b) If someone else would work on this, she/he wouldn't search for this functionality in a theme. - kaiser
[+2] [2011-09-14 18:03:24] Philip Downer

Get Attributes of Given Thumbnail

Use this function with the loop to determine width, height and URL of a thumbnailed image. Very handy for assigning a thumbnailed image as a background element via inline CSS.

* Fetches width, heigth and URI of a thumbnail.
* @author Philip Downer <>
* @license GNU Public License
* @version v1.0
* @param string $return Accepts 'path', 'width', or 'height'.
* @param string $size The thumbnail size corresponding to {@link add_image_size() WP core function}.
* @return mixed Returns the requested info, or if no 'Featured Image' assigned, returns 'false'.
function get_thumb_attr($return,$size='thumbnail') {
    global $post;

    if (has_post_thumbnail($post->ID)) {
      $thumb = wp_get_attachment_image_src(get_post_thumbnail_id(), 'intro');
      if ( $return == 'path' ) { return $thumb[0]; }
      if ( $return == 'width' ) { return $thumb[1]; }
      if ( $return == 'height' ) { return $thumb[2]; }
    } else {
        return false;
}//end function

[+2] [2011-11-17 17:14:37] dalethedeveloper

Output the contents of a widget outside the context of a sidebar using it's ID. The wrapping before/after HTML is not included. You need to know the specific ID of the widget you're angling for (ie 'text-5').

function widget_contents($id) {
    list($type,$number) = explode('-',$id);
    global $wp_registered_widgets;

You can peek at the output of wp_get_sidebars_widgets() if you aren't sure of the precise ID you need.

A more complete example lifted from /wp-includes/widgets.php under the dynamic_sidebar() function:

function render_widget($id) {
    global $wp_registered_widgets;
    $params = array_merge(
            array( array('widget_id' => $id, 'widget_name' => $wp_registered_widgets[$id]['name']) ),
            (array) $wp_registered_widgets[$id]['params']
    $classname_ = '';
    foreach ( (array) $wp_registered_widgets[$id]['classname'] as $cn ) {
            if ( is_string($cn) )
                    $classname_ .= '_' . $cn;
            elseif ( is_object($cn) )
                    $classname_ .= '_' . get_class($cn);
    $classname_ = ltrim($classname_, '_');
    $params[0]['before_widget'] = sprintf($params[0]['before_widget'], $id, $classname_);

    if ( is_callable($wp_registered_widgets[$id]['callback']) )
            call_user_func_array($wp_registered_widgets[$id]['callback'], $params);

Doh. The much simpler method would be to use the_widget() - dalethedeveloper
[+2] [2011-12-04 20:45:35] user5424

Custom smilies (plugin)

 * Smilies.
function filter_smilies_src($img_src, $img, $siteurl) {
    return plugins_url('', __FILE__) . '/img/smilies/' . $img;
add_filter('smilies_src', 'filter_smilies_src', 1, 10);

Custom smilies (theme)

 * Smilies.
function filter_smilies_src($img_src, $img, $siteurl) {
    return get_bloginfo('stylesheet_directory') . '/images/smilies/' . $img;
add_filter('smilies_src', 'filter_smilies_src', 1, 10);

[+2] [2011-12-19 20:23:22] Zach

Remove WordPress 3.3 Admin Bar Menu Items

function dashboard_tweaks() {
    global $wp_admin_bar;
add_action( 'wp_before_admin_bar_render', 'dashboard_tweaks' );


[+2] [2012-02-03 20:23:46] dalethedeveloper

Cross Taxonomy Tags Query

A cached query that outputs a get_tags() like HTML string of all tags for a given Taxonomy parameter defaulting to a Category. You can use $where_slug and $where_tax to get post tags filtered by any other taxonomy. SQL tested for WP 3.1 to WP 3.3.1.

function tags_by_other_taxonomy($where_slug,$where_tax = 'category',$bust_cache = false) {
    $cache_key = "{$where_slug}:{$where_tax}";
    $cache = get_transient('tags_by_other_taxonomy');
    $html = '';
    if( true !== $bust_cache and false !== $cache and isset($cache[$cache_key]) and !empty($cache[$cache_key]) ) {
            $html = $cache[$cache_key];
    } else {
        global $wpdb;
        $cat_id = $wpdb->get_var("SELECT tt.term_taxonomy_id FROM $wpdb->terms t INNER JOIN $wpdb->term_taxonomy tt ON t.term_id = tt.term_id WHERE t.slug = '{$where_slug}' AND tt.taxonomy = '{$where_tax}' LIMIT 1");
        if( !empty($cat_id) ) {
            $cat_posts = $wpdb->get_col("SELECT tr.object_id FROM $wpdb->term_relationships tr inner join $wpdb->posts p ON p.ID = tr.object_id WHERE term_taxonomy_id = {$cat_id} AND p.post_status = 'publish' AND p.post_type = 'post'");
            if( count($cat_posts) ) {
                $tags = $wpdb->get_results("SELECT DISTINCT,t.slug FROM $wpdb->term_taxonomy tt
                                INNER JOIN $wpdb->term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
                                INNER JOIN $wpdb->terms t ON t.term_id = tt.term_id
                                WHERE tt.taxonomy = 'post_tag' and tr.object_id IN (".implode(',',$cat_posts) .')');
                $html = '<ul class="post-tags-'.$where_slug.'">';
                if( count($tags) ) {
                    foreach($tags as $tag)
                        $html .= '<li><a href="/tag/'.$tag->slug.'/" title="Posts tagged with '.$tag->name.'">'.$tag->name.'</a></li>';
                $html .= '</ul>';
                if( !is_array($cache) )
                    $cache = array();
                $cache[$cache_key] = $html;
                set_transient('sc_cross_tax', $cache, 86400);
    echo $html;

For example, get all tags for Published Posts in the news Category slug:

<?php echo tags_by_other_taxonomy('news'); ?>

[+1] [2010-09-09 08:52:16]

Reposition the WYSIWYG Editor through JQUERY

Tested on: Wordpress 3.0.1

This code will allow you to remove specific meta boxes which wordpress adds by default to the POST and PAGES screens.

   function admin_head_hook() {
 ?><style type="text/css">
  #postdiv.postarea, #postdivrich.postarea { margin:0; }
  #post-status-info { line-height:1.4em; font-size:13px; }
  .custom-wysiwyg-editor-container { margin:2px 6px 6px 6px; }
  #ed_toolbar { display:none; }
  #postdiv #ed_toolbar, #postdivrich #ed_toolbar { display:block; }

   function admin_footer_hook() {
 ?><script type="text/javascript">
  jQuery('#postdiv, #postdivrich').prependTo('.custom-wysiwyg-editor-container');

[+1] [2010-09-09 10:51:01]

Automatically close missing tags from the WYSIWYG editor

Tested on: Wordpress 3.0.1

This code will automatically close any missing tags when using the WYSIWYG editor.

   function clean_bad_content($bPrint = false) {
 global $post;
 $szPostContent  = $post->post_content;
 $szRemoveFilter = array("~<p[^>]*>\s?</p>~", "~<a[^>]*>\s?</a>~", "~<font[^>]*>~", "~<\/font>~", "~style\=\"[^\"]*\"~", "~<span[^>]*>\s?</span>~");
 $szPostContent  = preg_replace($szRemoveFilter, '', $szPostContent);
 $szPostContent  = apply_filters('the_content', $szPostContent);
 if ($bPrint == false) return $szPostContent; 
 else echo $szPostContent;

Just to let you know there is an option of doing that in WordPress itself. IT can be useful if one needs to force it for multiple users irrespective of their setting. But I would force saving that setting instead. - Ashfame
[+1] [2011-01-28 17:52:16] haha

Remove role="search" attributes for get_search_form()

function remove_role_search($role)
    $result = array();
    preg_match_all('|role="[^"]*"|U', $role, $result);
    foreach ($result[0] as $role_tag) {
        $role = str_replace($role_tag, '', $role);
    return $role;
add_filter('get_search_form', 'remove_role_search');

[+1] [2011-02-23 15:32:36] Rev. Voodoo

Add a Login Link to wp_nav_menu

add_filter('wp_nav_menu_items', 'add_login_logout_link', 10, 2);

function add_login_logout_link($items, $args) { 

        $loginoutlink = wp_loginout('index.php', false); 

        $items .= '<li>'. $loginoutlink .'</li>'; 

    return $items; 

(3) Do not use output buffering. wp_loginout() has a second parameter $echo to make your life easier. - fuxia
Works great, thanks for the code update! - Rev. Voodoo
[+1] [2011-05-12 13:40:29] dani

Changing "Posts" menu name in admin to whatever you wish (e.g. "Articles")

// hook the translation filters

function change_post_to_article( $translated ) {
$translated = str_ireplace('Post','Article',$translated );// ireplace is PHP5 only
return $translated;

Credits to [1]


[+1] [2011-06-13 11:05:39] Daniel Sachs

Custom Logos for Login page and Admin

/*  Custom logos
function custom_admin_logo() {
    echo '
        <style type="text/css">
            #header-logo { background-image: url('.get_bloginfo('template_directory').'/path/to/images/admin-logo.png) !important; }
add_action('admin_head', 'custom_admin_logo');

function custom_login_logo() {
    echo '<style type="text/css">
        h1 a { background-image:url('.get_bloginfo('template_directory').'/path/to/images/login-logo.png) !important; }

add_action('login_head', 'custom_login_logo');

(2) Please take a look at this gist. There are even better options than shown in the gist. You could also try to participate on the trac ticket (link in gist plugin header). - kaiser
[+1] [2011-09-14 17:06:05] Philip Downer

Remove Links Menu Item

Many of my WordPress installs don't require that users have access to the 'Links' menu item. This function removes it from view.

add_action( 'admin_menu', 'custom_admin_menu' );
function custom_admin_menu() 
    global $menu;
    // var_dump($menu); // use this to identify the key for the menu item you want to remove
    unset( $menu[15] ); //key 15 is links
    if ( !current_user_can('manage_options') ) { unset( $menu[75] ); } //key 75 is tools ... but only for non super admins

As of WP 3.1, you could also use remove_submenu_page - user5424
[+1] [2011-09-14 17:09:03] Philip Downer

Disable Upgrade Now Message for Non-Administrators

I'm actually a big fan of NOT using this code. Instead, I prefer to allow customers to update their own WordPress installs. This helps keep the site up-to-date and forces me to write better code.

if ( !current_user_can( 'manage_options' ) ) {
  add_action( 'init', create_function( '$a', "remove_action( 'init', 'wp_version_check' );" ), 2 );
  add_filter( 'pre_option_update_core', create_function( '$a', "return null;" ) );

[+1] [2011-12-04 12:02:24]

Add a custom class to the next and previous links

add_filter('next_posts_link_attributes', 'posts_link_attributes');
add_filter('previous_posts_link_attributes', 'posts_link_attributes');
function posts_link_attributes(){
    return 'class="styled-button"';

[+1] [2011-12-04 12:04:44]

Automatically add a hidden custom field and associating value to a post when the post is published

add_action('publish_page', 'add_custom_field_automatically');
add_action('publish_post', 'add_custom_field_automatically');
function add_custom_field_automatically($post_ID) {
global $wpdb;
if(!wp_is_post_revision($post_ID)) {
    add_post_meta($post_ID, 'field-name', 'custom value', true);

[+1] [2011-12-17 21:19:27]

Add custom post types to archives page

function namespace_add_custom_types( $query ) {
if( is_category() || is_tag() && empty( $query->query_vars['suppress_filters'] ) ) {
$query->set( 'post_type', array(
 'post', 'your-custom-post-type-here'
      return $query;
add_filter( 'pre_get_posts', 'namespace_add_custom_types' );

[0] [2010-12-28 08:36:30] jackreichert

Call bloginfo using shortcode...

function digwp_bloginfo_shortcode($atts) {

            'key' => '',
            ), $atts));

    return get_bloginfo($key);

add_shortcode('bloginfo', 'digwp_bloginfo_shortcode');


[bloginfo key='name']