创建新的自定义帖子和同名的帖子类别

时间:2014-05-20 作者:mantis

我有一个自定义的帖子类型“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);
}
我不太擅长使用钩子和过滤器,所以如果这一切都错了或没有意义,我深表歉意。

2 个回复
最合适的回答,由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
}

SO网友:mantis

根据@ialocin的回答:

add_action( \'wp_insert_post\', \'my_wp_insert_post\', 1, 2 );

    function my_wp_insert_post( $post_id, $post ) {

        $title = $post->post_title;
        $post_type = $post->post_type;
        $post_status = $post->post_status;

        // Only do this for published products 
        if ( \'product\' != $post_type ) {
                return;
         } elseif (\'publish\' != $post_status ) {
                return;
         }

          $my_cat = array(
              \'cat_name\' => $title, 
              \'category_parent\' => 3, //cat id of all products
              \'taxonomy\' => \'category\' 
          );

          wp_insert_category( $my_cat );
    }

结束

相关推荐

Get a list of categories ids

我正在使用基于自定义帖子类型的过滤器制作一个公文包。该过滤器必须只显示公文包中显示的帖子的类别,因为用户可以在短代码中通过id指定它们-[公文包id=“1,2,3”],而我无法获得该类别id的列表。下面是一个简单的例子,说明我正在尝试做什么:来自快捷码的自定义帖子ID列表:$ids 相同ID的数组:$id_array = explode(\',\', $ids) 必须返回类别ID列表的感兴趣的变量:$cat_ids = ??? 接下来,我们只获取具有所需id的类别:$ca