发布自定义帖子类型时插入自定义帖子

时间:2014-07-30 作者:jimlongo

当发布自定义类型(“my-solutions”)时,我试图用自定义值填充Posteta表。我读了一些线索,抄本和Pippin\'s blog 在这件事上,他尝试了很多变化,但都没能成功。如果有人可以添加或更正任何内容,那将是非常棒的。

function run_when_my_solution_published( $post ){
    global $wpdb;
    $id = $post->ID;
    if($post->post_type == \'my-solutions\'){
        $wpdb->insert(\'wp_postmeta\', array( \'meta_id\'     => NULL       ,
                                            \'post_id\'     => $id        ,
                                            \'meta_key\'    => \'my_json\'  ,
                                            \'meta_value\'  => \'json\'     ),
                                     array( \'%d\' , \'%d\' , \'%s\' , \'%s\' )
        );


    }
}
add_action(\'new_to_publish\', \'run_when_my_solution_published\');     

3 个回复
最合适的回答,由SO网友:Manny Fleurmond 整理而成

更新的新解决方案:

function wpse153622_transition_solution( $new_status, $old_status, $post ) {
    if ( $new_status != $old_status && \'publish\' === $new_status && \'my-solution\' === $post->post_type ) {
        update_post_meta( $post_id, \'my_json\', \'json\' );
    }
}
add_action(  \'transition_post_status\',  \'wpse153622_transition_solution\', 10, 3 );
这应该只在1时触发。新帖子的状态与旧帖子的状态不同2。new post status等于publish和3。职位类型等于你的职位类型。

新的解决方案编辑:在阅读了post状态转换之后,我认为这应该可以做到:

function wpse153622_save_solution( $post_id, $post ) {
    update_post_meta( $post_id, \'my_json\', \'json\' );
}
add_action(  \'publish_my-solution\',  \'wpse153622_save_solution\', 10, 2 );
这使用publish_my-solution, 只有当类型为my-solution 已发布。看见{status}_{post_type} here.

使用旧解决方案save_post_{post_type} 操作将为您完成作业,但无论何时更新帖子和发布,都会调用该操作:

function wpse153622_save_solution( $post_id, $post, $update ) {
    update_post_meta( $post_id, \'my_json\', \'json\' );
}
add_action( \'save_post_my-solution\', \'wpse153622_save_solution\', 10, 3 );
我以前用过这个,它很管用,但正如我所说,每当你对帖子进行更改时,它都会被调用。不过,我认为这不是什么大问题。

SO网友:Howdy_McGee

如果某个帖子类型是使用transition_post_status 钩我已将您的问题改编为下面的解决方案:

function run_when_my_solution_published( $new_status, $old_status, $post ) {
    global $wpdb;

    if($post->post_type == \'my-solutions\' && $new_status == \'publish\'){
        $wpdb->insert(\'wp_postmeta\', array( \'meta_id\'     => NULL       ,
                                            \'post_id\'     => $id        ,
                                            \'meta_key\'    => \'my_json\'  ,
                                            \'meta_value\'  => \'json\'     ),
                                     array( \'%d\' , \'%d\' , \'%s\' , \'%s\' )
        );
    }
}
add_action (\'transition_post_status\', \'run_when_my_solution_published\', 999, 3);
尽管如此The Codex 说用这个钩子是不可接受的,它是我唯一能有效工作的钩子。

SO网友:Jack Lenox

正如@Howdy\\u McGee所说,我实际上会使用publish_post action 相反

发布时发送电子邮件的示例代码块:

function post_published_notification( $ID, $post ) {
    $author = $post->post_author; /* Post author ID. */
    $name = get_the_author_meta( \'display_name\', $author );
    $email = get_the_author_meta( \'user_email\', $author );
    $title = $post->post_title;
    $permalink = get_permalink( $ID );
    $edit = get_edit_post_link( $author, \'\' );
    $to[] = sprintf( \'%s <%s>\', $name, $email );
    $subject = sprintf( \'Published: %s\', $title );
    $message = sprintf (\'Congratulations, %s! Your article “%s” has been published.\' . "\\n\\n", $name, $title );
    $message .= sprintf( \'View: %s\', $permalink );
    $headers[] = \'\';
    wp_mail( $to, $subject, $message, $headers );
}
add_action( \'publish_post\', \'post_published_notification\', 10, 2 );
您可以或多或少地使用此处已使用的内容进行筛选post_type. 我还绝对建议使用add_post_meta function 而不是自定义$wpdb 查询

结束

相关推荐

Wpdb->INSERT添加的行太多

我的functions.php$ar = array( \'price_content\' => \'hello\' ); $result = $wpdb->insert(\'hs_prices\', $ar); // insert \'hello\' into \'price_content\' 这应该只创建一行,但会在数据库中创建12行。当我运行此操作时,我在网站的主页上(通过刷新页面)。这可能是因为代码在functions.ph