I am experimenting with creating a simple plugin to create a custom post type named project but am having some trouble with the rewrite rules not been flushed on activation.

I have the main plugin file with this function:

register_activation_hook( __FILE__, 'Project_Custom_Post_Type::activate' );

Then within my class I have this:

public function activate() {

My class has a construct of:

public function __construct() {
  add_action( 'init', array( $this, 'register_post_type' ), 0 );

I cannot see why it is not working? My deactivation flush works fine.


Your string is not read as a callback. You should pass an array:

$pcpt = new Project_Custom_Post_Type;
register_activation_hook( __FILE__, array( $pcpt, 'activate' ) );

Note that init happens before plugin activation, so not callbacks from your class will be executed.

| improve this answer | |

On activation, the "init" action has already run. So your flush is actually taking place just fine, but your post type is not being registered before the flush takes place. Add the code to register your post type to your activation function, before you flush the rewrite rules.

Also, yes, your activation hook call is incorrect, as toscho pointed out.

| improve this answer | |
  • Ok so I now have it working with this: register_activation_hook( __FILE__, array( $project, 'activate' ) ); With my activate function including this line: $this->my_register_post_type(); All works great. I still have the my_register_post_type(); function being called on 'init' also. I presume it needs to be called in both places? – Philip Benton Oct 14 '13 at 20:03
  • Yes, it needs to be in both places. – Otto Oct 15 '13 at 10:52

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.