Insira postmeta personalizado quando o tipo de publicação personalizado é publicado

Estou tentando preencher a tabela pós-meta com um valor personalizado quando um tipo personalizado (‘minhas soluções’) é publicado. Eu li alguns tópicos, o blog do Codex e Pippin sobre este assunto e tentei muitas variações, mas não consegui que isso funcione. Se alguém pode adicionar ou corrigir qualquer coisa que seja ótimo.

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'); 

Solutions Collecting From Web of "Insira postmeta personalizado quando o tipo de publicação personalizado é publicado"

Nova solução nova:

 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 ); 

Isso deve triggersr apenas quando 1. o status do novo post não é o mesmo que o antigo 2. O status do novo post é igual a publicar e o 3. tipo de publicação é igual ao seu tipo de publicação.

Nova Solução

Editar: depois de ler as transições de status do post, acho que isso deve fazer o truque:

 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 ); 

Isso usa publish_my-solution , que só deve ser publish_my-solution sempre que uma publicação do tipo my-solution seja publicada. Veja {status}_{post_type} aqui .

Solução antiga

Usar a save_post_{post_type} será o trabalho para você, embora seja chamado sempre que você atualizar a publicação e publicar:

 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 ); 

Eu usei isso antes e funciona, mas, como eu disse, será chamado sempre que você fizer alterações na postagem. No entanto, não acho que isso seja muito problemático.

Eu consegui adicionar / remover termos de um tipo de publicação se fosse publicado usando o gancho transition_post_status . Eu adaptei sua pergunta à minha solução abaixo:

 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); 

Embora o Codex diga que não é aceitável usar esse gancho, foi o único que eu conseguiria funcionar de forma acutânea.

Como o @Howdy_McGee disse, na verdade, eu usaria a ação publish_post .

Exemplo de bloco de código para enviar um email na publicação:

 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 ); 

Você pode usar mais ou menos o que você já usou aqui para filtrar por post_type . Eu definitivamente recomendaria usar a function add_post_meta vez de uma consulta $wpdb personalizada.