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.


9 Answers 9


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, 2012 at 15:15
  • How will this affect performance? Are the above filters only used in the backend? Oct 1, 2014 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' Oct 1, 2014 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, 2011 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... Apr 28, 2011 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, 2011 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, 2011 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, 2012 at 17:36

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';
// 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, 2014 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, 2015 at 13:46
  • Why the echo '';?
    – Bill
    Feb 28, 2016 at 14:44

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, 2011 at 15:13
  • 1
    I added a link to a plugin that should help you
    – anu
    Apr 28, 2011 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, 2011 at 15:24
  • @Evie Milo - you should mark the answer as accepted.
    – kaiser
    Apr 28, 2011 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, 2011 at 15:15

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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