I'm using this code to have a duplicate post function in WordPress Admin. However, when I add the filter for a custom post type, like this:

add_filter( 'directory_row_actions', 'rd_duplicate_post_link', 10, 2 );

(The Custom Post Type has a registered name of directory) - it doesn't add it to the action row underneath the entry title. When I do it for the posts or pages, like this:

add_filter( 'post_row_actions', 'rd_duplicate_post_link', 10, 2 );

it works perfectly. I've been reading that post_row_actions has been deprecated but I can't find anywhere that says it's replacement. Does anyone know how to get this working for my Custom Post Type?

  • 1
    Please add all relevant code to your question. – Nicolai Sep 11 '14 at 12:53
  • it's on the link I posted on the first line (rudrastyh.com/wordpress/duplicate-post.html), but it's quite long so I thought it best to leave it there. I can add it in if you want though? – Tom Oakley Sep 11 '14 at 13:06
  • You might want to strip it down to the necessary parts, but generally outgoing link sources can vanish and than there is no information available and the question in the future more or less useless. – Nicolai Sep 11 '14 at 13:12
  • ok I'll do that, your explanation makes sense, thanks @ialocin :) – Tom Oakley Sep 11 '14 at 13:33
  • Looking at the source for "wp-admin/includes/class-wp-posts-list-table.php", it calls page_row_actions for hierarchical post types, and post_row_actions for all others (there's no post_type-specific filter), so one of them should work for you. (You'll have to check the passed in $post->post_type for varying behaviour.) Nothing in the code anyway about deprecation. – bonger Sep 11 '14 at 17:35

As @bonger commented, there is no custom post type filter despite what you've read.

To use this filter for a specific post type, the best way is to use the post_row_actions filter and then test against the passed in $post->post_type.

I've used the code below to add links to the actions row for a specific post type (in this case, myposttype).

This will need to be edited to work for your own post type, and obviously for the new link to actually do anything more code is needed, but this is the idea:

function my_duplicate_post_link($actions, $post)
    if ($post->post_type=='myposttype')
        $actions['duplicate'] = '<a href="#" title="" rel="permalink">Duplicate</a>';
    return $actions;
add_filter('post_row_actions', 'my_duplicate_post_link', 10, 2);
  • Also, your Custom Post Type must be non-hierarchical. 'hierarchical' => false when declaring your CPT withregister_post_type('MyCustomPostType'...) Check WP Code Reference – Braza Jul 29 '20 at 13:39
//Post, page or all register custom post types

function im_duplicate_post_link($actions, $post)
    // get all post type which is register
    $posttypes = get_post_types(array('public' => true), 'names', 'and');
    foreach ($posttypes as $post_type)
        $posttype[] = $post_type;
    //check current post type is in "$posttype"  array, if it's in array then display duplicate link.
    if (in_array($post->post_type, $posttype))
        $actions['duplicate'] = '<a href="admin.php?action=im_duplicate_post_as_draft&amp;post=' . $post->ID . '" title="Duplicate this item" rel="permalink">Duplicate</a>';
    return $actions;
// this hook for post and custom post type
add_filter('post_row_actions', 'im_duplicate_post_link', 10, 2);
// this hook for page
add_filter('page_row_actions', 'im_duplicate_post_link', 10, 2);
  • 2
    Please, explain how your code works and why it answers the question. Only code is not a good answer. – cybmeta Jan 2 '15 at 11:02
  • In above code used for duplicate post,page or any custom post type. – Irfan Modan Jan 2 '15 at 11:05

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.