我有一个自定义的帖子类型“Product”,希望在创建新产品时自动创建一个帖子类别“Product Name”,这样帖子类别(非自定义帖子类别)将与新产品具有相同的名称,并且所有相关帖子都可以链接到自定义帖子类型。
我曾试图链接到wp\\u publish\\u帖子,但显然它已重命名为{$new_status}_{$post->post_type}
所以我想标签应该是publish\\u product?
// adds category with name of product automatically
add_filter( \'publish_product\', \'my_publish_product\' );
function my_publish_product( $post ) {
global $wpdb;
$post_type = \'product\';
if ( ! $post = get_post( $post ) )
return;
if ( \'publish\' == $post->post_status )
return;
$wpdb->update( $wpdb->posts, array( \'post_status\' => \'publish\' ), array( \'ID\' => $post->ID ) );
clean_post_cache( $post->ID );
$old_status = $post->post_status;
$post->post_status = \'publish\';
wp_transition_post_status( \'publish\', $old_status, $post );
/** This action is documented in wp-includes/post.php */
do_action( \'edit_post\', $post->ID, $post );
/** This action is documented in wp-includes/post.php */
do_action( "save_post_{$post->post_type}", $post->ID, $post, true );
/** This action is documented in wp-includes/post.php */
do_action( \'save_post\', $post->ID, $post, true );
/** This action is documented in wp-includes/post.php */
do_action( \'wp_insert_post\', $post->ID, $post, true );
if ( \'post\' != $post_type ) {
return;
} else {
add_action( \'wp_insert_post\', \'my_wp_insert_post($post->post_name)\' );
return;
}
}
function my_wp_insert_post( $post_name )
{
$my_cat = array(
\'cat_ID\' => 0,
\'cat_name\' => $post_name,
\'category_parent\' => \'products\',
\'taxonomy\' => \'category\'
);
wp_insert_category($my_cat);
}
我不太擅长使用钩子和过滤器,所以如果这一切都错了或没有意义,我深表歉意。
最合适的回答,由SO网友:Nicolai Grossherr 整理而成
如果你这么说的话,那就太离谱了wp_publish_post()
已重命名为{$new_status}_{$post->post_type}
. 后者实际上是一个钩子,而前者是一个函数。后者是前者的一部分,因为它是wp_insert_post
.
钩子{$new_status}_{$post->post_type}
是的一部分wp_transition_post_status()
- 另外,请参见source. 您可能想看一下关于Plugin API 了解有关挂钩的更多信息。有关发布、保存等帖子或帖子类型时适用的挂钩的其他特定信息,请参见以下条目Post Status Transitions, 除以上链接外wp_transition_post_status()
; 和往常一样,还有源头。
关于你发布的代码,应该没有必要这样做my_publish_product()
- 或者至少从代码中看不到任何内容。我可以想象,您的帖子类型产品中的帖子正在被创建、保存、更新等等<你可以直接上钩my_wp_insert_post()
直接转到最适合您需要的挂钩,遵循您的代码wp_insert_post
滤器这是wp_insert_post()
- source - 以及wp_publish_post()
- source - 作用最后但并非最不重要的一点,请查看add_action()
.
下面的代码示例性地概述了如何执行此操作:
add_action( \'wp_insert_post\', \'my_wp_insert_post\', 1, 3 );
function my_wp_insert_post( $post_id, $post, true ) {
//your code
}