当发布来自所有定制帖子类型的所有帖子时,我可以使用什么钩子来处理它们?

时间:2014-02-21 作者:User

我希望在发布每个自定义帖子类型时,调用一个钩子(在这里我向管理员发送电子邮件通知)。我知道我可以使用:

add_action(\'publish_{custom_post_type_name}\', \'function_to_call\');
但我不知道custom_post_type_names(每个站点都注册了不同的自定义帖子类型)。此外,我不能想当然地认为自定义帖子类型将始终保持不变(因为其他插件或主题随时可能注册/注销自定义帖子类型)。

有什么提示吗?

2 个回复
SO网友:Nicolai Grossherr

那么使用save_postwp_insert_post 钩子,都有

@参数  ;内景             $post\\U ID  ;Post ID.参数  ;WP\\U Post   $发布       ;Post对象
@参数  ;布尔         $更新  ;这是否是正在更新的现有帖子。

作为参数。这是相当自我解释$update 可以用来确定它是否是新帖子。此外,您需要检查是否为自定义帖子类型,我使用is_custom_post_type() 由@toscho执行的功能。

现在我们开始:

function wpse135423_function_to_call( $post_id, $post, $update ) {
    if ( wp_is_post_autosave( $post_id ) ) {
        return \'do nothing, because it is an autosave\';
    }
    if ( wp_is_post_revision( $post_id ) ) {
        return \'do nothing, because it is a revision\';
    }
    // if it is an update 
    if ( $update == TRUE ) {
        return \'do nothing, because it is an update\';
    }
    // if it is a custom post type 
    if ( is_custom_post_type() == TRUE ) {
        // code to do whatever you want
    }
}
// Do NOT use both hooks!
add_action( \'save_post\', \'wpse135423_function_to_call\', 10, 3 );
add_action( \'wp_insert_post\', \'wpse135423_function_to_call\', 10, 3 );
很快,只处理新创建的自定义帖子类型的帖子,而不需要知道自定义帖子类型的名称。

SO网友:Nathan Johnson

发布所有自定义帖子类型时,没有一个钩子会触发。但是我们可以使用挂钩和条件的组合来完成同样的事情。除了另一个答案外,至少有两种方法可以做到这一点。第一个是钩住register_post_type 并有条件地向publish_$post_type 如果帖子类型不是WordPress默认值。下面是一个插件示例。

namespace = StackExchange\\WordPress;
class plugin {
  protected $defaultPostTypes = [
    \'post\', \'page\', \'attachment\', \'revision\',
    \'nav_menu_item\', \'custom_css\', \'customize_changeset\',
  ];
  public function plugins_loaded() {
    \\add_action( \'registered_post_type\', [ $this, \'registered_post_type\' ], 10, 2 );
  }
  public function registered_post_type( string $post_type, \\WP_Post_Type $post_type_object ) {
    if( in_array( $post_type, $this->defaultPostTypes ) ) return;
    \\add_action( "publish_$post_type", [ $this, \'publish_post_type\' ], 10, 3 );
  }
  public function publish_post_type( int $post_ID, \\WP_Post $post, bool $update ) {
    //* This method will execute whenever a custom post type is published.
  }
}
\\add_action( \'plugins_loaded\', [ new plugin(), \'plugins_loaded\' ] );
或者,我们可以使用transition_post_status

function wpse_135423_transition_post_status( $new_status, $old_status, $post ) {
  //* Make sure the new status is published
  if( \'publish\' !== $new_status ) return;

  //* And that the post_type isn\'t one of the WordPress defaults
  $default = array(
    \'post\', 
    \'page\', 
    \'attachment\', 
    \'revision\',
    \'nav_menu_item\', 
    \'custom_css\', 
    \'customize_changeset\',
  );
  if( in_array( $post->post_type, $default ) ) return;

  //* A custom post type just got published.
}
add_action( \'transition_post_status\', \'wpse_135423_transition_post_status\', 10, 3 );

结束

相关推荐

从unctions.php调用的Add_Actions未返回好值

我正试图通过这些功能为我的网站添加一些安全/访问防护。php。然而,每当我尝试通过函数添加时。php(而不是作为插件,我以前做过)失败(总是返回false)。例如:add_action(\"parse_query\", checkaccess()); // in functions.php 以及function checkaccess() { $allowAccess = false; if(is_admin()||is_front_page()||i