I'm using the posts-type Posts to display portfolio items and it looks strange to have portfolio labeled as posts. Is there any way to rename Posts to Portfolio instead to better reflect it's usage.


I used the following script to rename the default post type:

function change_post_menu_label() {
    global $menu, $submenu;

    $menu[5][0] = 'Portfolio';
    $submenu['edit.php'][5][0] = 'Portfolio';
    $submenu['edit.php'][10][0] = 'New Portfolio';
    $submenu['edit.php'][16][0] = 'Portfolio Tags';
    echo '';
add_action( 'admin_menu', 'change_post_menu_label' );

function change_post_object_label() {
    global $wp_post_types;

    $labels = &$wp_post_types['post']->labels;
    $labels->name = 'Portfolio';
    $labels->singular_name = 'Portfolio';
    $labels->add_new = 'New Portfolio';
    $labels->add_new_item = 'New Portfolio';
    $labels->edit_item = 'Edit Portfolio';
    $labels->new_item = 'New Portfolio';
    $labels->view_item = 'View Portfolio';
    $labels->search_items = 'Search Portfolio';
    $labels->not_found = 'Not found';
    $labels->not_found_in_trash = 'Not found in trash';
add_action( 'init', 'change_post_object_label' );

If you want to simply rename the appearance of posts, rather than creating a custom post type then add this code to your themes functions.php file.

// hook the translation filters
add_filter(  'gettext',  'change_post_to_portfolio'  );
add_filter(  'ngettext',  'change_post_to_portfolio'  );

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

In the interests of transparency I got this code from this article, although I have used similar tricks in the past.

  • 2
    While this is fine as display of technical concept, replacing some word in all localized text is overly broad. – Rarst Nov 18 '12 at 15:15
  • How will this affect performance? Are the above filters only used in the backend? – mikkelbreum Oct 1 '14 at 9:16
  • I think this is not a good solution to this particular case. $translated might contain a string like 'click on the post man' or 'se om du har fået post' (danish), in which case you would NOT want to replace 'post' with 'news' – mikkelbreum Oct 1 '14 at 9:22

You need to create a Custom Post Type, "Portfolio".

Posts are Posts. Why try to use them as something they're not, and then try to change their nomenclature, instead of writing one or two simple functions in functions.php, that will result in having both the exact functionality and the exact nomenclature that you want?

  • Because I've not used custom post types until today and the website I set up uses the blog feature to run a portfolio as the client doesn't want a blog - so I thought why not use the blog set up to run a portfolio instead - save reinventing the wheel so to speak. It seems a lot easier to change the manu names than re-do the entire site as all the content has been added. – Evie Milo Apr 28 '11 at 15:12
  • It would just take a SQL query to change the post_type for all impacted Posts, once you have created your Custom Post Type... – Chip Bennett Apr 28 '11 at 15:14
  • 1
    Chip's definitely correct here. This is what I would do and what should be done in a case like this IMHO. – mfields May 13 '11 at 0:36
  • 2
    The sql you need looks a bit like this UPDATE wp_posts SET post_type = 'funny-bunny' WHERE post_type = 'post'; You will most likely need to change the table prefix (wp_) to reflect that setting in your current installation. – mfields May 13 '11 at 0:39
  • 2
    I beg to differ from the honorable Chip Bennett... Posts are there to organize elements in chronological fashion. Why to register another post_type, change the queries, if everything you need is already there? In my non-english websites I regularly change WordPress language files to match the Posts functionality, and rename it to News, Articles or Portfolio. – brasofilo Apr 1 '12 at 17:36
// hook the translation filters
add_filter(  'gettext',  'change_post_to_article'  );
add_filter(  'ngettext',  'change_post_to_article'  );

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

I got this tip from smashing magazine and tested it and it works great


I found this thread when I was looking for a solution to change the post type from one name to an other.

Instead of doing a custom query as suggested by someone in here I simply did this:

$post = get_post( $id );      // The current post id
$post->post_type = 'receipt'; // The new post type name
wp_update_post( $post );      // Updating the new information

The cpt have to ofc already have been created and formated..


Rename posts to portfolio

function litho_posts_portfolio() {
    global $menu;
    global $submenu;
    $menu[5][0] = __("Portfolio", 'litho');
    $submenu['edit.php'][5][0] = __("Portfolio", 'litho');
    $submenu['edit.php'][10][0] = __("New Item", 'litho');
    echo '';
function litho_posts_portfolio_label() {
    global $wp_post_types;
    $labels = &$wp_post_types['post']->labels;
    $labels->name = __("Portfolio", 'litho');
    $labels->singular_name = __("Item", 'litho');
    $labels->add_new = __("New Item", 'litho');
    $labels->add_new_item = __("New Item", 'litho');
    $labels->edit_item = __("Edit Item", 'litho');
    $labels->new_item = __("Item", 'litho');
    $labels->view_item = __("View Item", 'litho');
    $labels->search_items = __("Search Portfolio", 'litho');
    $labels->not_found = __("No Item Found", 'litho');
    $labels->not_found_in_trash = __("No Item found in Trash", 'litho');
add_action( 'init', 'litho_posts_portfolio_label' );
add_action( 'admin_menu', 'litho_posts_portfolio' );
  • How is that different from the other answer by @elbatron? – kaiser Jun 19 '14 at 9:30
  • @kaiser - This answer is correct, the one that is marked as the answer by the OP is incorrect (look at the actions - 'admin_menu' and 'init' are the wrong way around. Also this answer users the __() function. – David Gard Apr 16 '15 at 13:46
  • Why the echo '';? – Bill Feb 28 '16 at 14:44

The get_post_type_object will do the work.

add_action( 'init', 'ns_change_post_object' );
// Change dashboard Posts to News
function ns_change_post_object() {
   $get_post_type = get_post_type_object('post');
    $labels = $get_post_type->labels;
    $labels->name = 'News';
    $labels->singular_name = 'News';
    $labels->add_new = 'Add News';
    $labels->add_new_item = 'Add News';
    $labels->edit_item = 'Edit News';
    $labels->new_item = 'News';
    $labels->view_item = 'View News';
    $labels->search_items = 'Search News';
    $labels->not_found = 'No News found';
    $labels->not_found_in_trash = 'No News found in Trash';
    $labels->all_items = 'All News';
    $labels->menu_name = 'News';
    $labels->name_admin_bar = 'News';

If you just want to change the admin menu label from Post -> Portfolio, then look at this question:

Changing Admin Menu Labels


This plugin Admin Menu Editor looks like it will allow you to change menu labels more easily - I haven't tested it though.

  • thanks I'll see if I can figure something out from this, although it looks a bit complicated for me. – Evie Milo Apr 28 '11 at 15:13
  • 1
    I added a link to a plugin that should help you – anu Apr 28 '11 at 15:19
  • thanks for the link, but I want to get more into the functions.php file and avoid using too many plugins. I followed your first link and it eventually led me here: new2wp.com/snippet/change-wordpress-posts-post-type-news and that has helped me sort it out really quickly - thanks for your help! – Evie Milo Apr 28 '11 at 15:24
  • @Evie Milo - you should mark the answer as accepted. – kaiser Apr 28 '11 at 23:54

You will just need to create another custom post with the same capabilities as a regular post. You can then disable the Posts menu with this:

function remove_menus()
    global $menu;
    $restricted = array( __('Posts'));
    end ($menu);

    while (prev($menu))
        $value = explode(' ',$menu[key($menu)][0]);

        if(in_array($value[0] != NULL?$value[0]:"" , $restricted))
add_action('admin_menu', 'remove_menus');
  • going down this route would create too much additional work at this late stage in the project - not something the budget would allow - all content has now been added and I just wanted to see if there was a way to rename the posts to portfolio so it was less confusing for the client. – Evie Milo Apr 28 '11 at 15:15

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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