WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I am helping my father with his WordPress website.
It has over 1,700 posts with TITLES IN UPPERCASE.

We'd like to change these to "Title Case" in the database (possibly using this PHP script).

The WordPress "To Title Case" plug-in changes the case at the template level - we'd like to change it at the database level.

What would be the best way to apply the script to all titles in the WordPress database?
I could write some code from scratch but I'm guessing there's existing code/methods out there that can apply a function/method across all titles.

share|improve this question
I would write a Loop form scratch. It should be pretty simple, but if you want to reuse the plugin's code then post the relevant parts. – s_ha_dum Apr 6 '13 at 23:27
I assume the titles where added manually in uppercase? – Brad Dalton Jul 31 '14 at 14:54
@BradDalton - that is correct, he got into a habit of typing in his article/ blog titles in UPPERCASE. – BaronGrivet Aug 3 '14 at 20:24
Have you found a solution for this yet? – Brad Dalton Aug 3 '14 at 23:28
@BradDalton - yes, the solution I selected below "Updating the posts" – BaronGrivet Aug 4 '14 at 1:41
up vote 15 down vote accepted

Updating the posts

$all_posts = get_posts(
    'posts_per_page' => -1,
    'post_type' => 'post'

foreach ( $all_posts as $single ) {
    wp_update_post( array(
        'ID' => $single->ID,
        'post_title' => to_title_case( $single->post_title ) // see function below

Converting a string to "Title Case"

And, while not pertinent to WP, for the sake of completeness:

function to_title_case( $string ) {
     /* Words that should be entirely lower-case */
     $articles_conjunctions_prepositions = array(
     /* Words that should be entirely upper-case (need to be lower-case in this list!) */
     $acronyms_and_such = array(
         'asap', 'unhcr', 'wpse', 'wtf'
     /* split title string into array of words */
     $words = explode( ' ', mb_strtolower( $string ) );
     /* iterate over words */
     foreach ( $words as $position => $word ) {
         /* re-capitalize acronyms */
         if( in_array( $word, $acronyms_and_such ) ) {
             $words[$position] = mb_strtoupper( $word );
         /* capitalize first letter of all other words, if... */
         } elseif (
             /* ...first word of the title string... */
             0 === $position ||
             /* ...or not in above lower-case list*/
             ! in_array( $word, $articles_conjunctions_prepositions ) 
         ) {
             $words[$position] = ucwords( $word );
     /* re-combine word array */
     $string = implode( ' ', $words );
     /* return title string in title case */
     return $string;

Obviously, both lists of words could be expanded - the lower-case list especially by more prepositions, the acronyms by those that are used often on the current site.

The WP-specific part is only the upper code block though, anyhow.

share|improve this answer
Thank you Johannes, fantastic answer. – BaronGrivet Apr 7 '13 at 19:06
A title with WordPress, MySQL and OpenOffice :D – toscho Apr 27 '13 at 1:04
:D Only saw this 2day. Yep, that's a gotcha... – Johannes Pille Jul 31 '14 at 15:07

You could change the post title when it is viewed:

add_action( 'the_post', 'wpse_94856_title_update' );

function wpse_94856_title_update( $post )
    if ( empty ( $post->post_title ) )

    $new_title = mb_convert_case( $post->post_title, MB_CASE_TITLE, "UTF-8" );

    if ( $post->post_title === $new_title )

        array (
            'ID'         => $post->ID,
            'post_title' => $new_title

    // $post is passed by reference, so we update this property in real time
    $post->post_title = $new_title;

This is just an idea, based on this answer. Not tested.

share|improve this answer

A quick "solution" would be via CSS using text-transform.

text-transform: capitalize;

However, it would be best if you could change the capitalization on the database since this is a matter of styles, not content :) If you want titles in uppercase, do so through CSS or you'll have this kind of problem!

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.