I’m trying to autofill a custom field only when the post is created and not when it is updated.
CPT “valoraciones”
ACF custom fields “ID_valoraciones”.
The ID_valoraciones is an incremental number. That is, for post 1, ID_valoraciones: 1, post 2, ID_valoraciones: 2 and so on …
So far I have the following action:
function auto_assign_ids( $post_id, $post, $update ) { // Only assign ID to new approved "valoraciones" posts if ( $post->post_status == 'publish' && $post->post_type == 'valoraciones' ) { // get the most recent "valoraciones" posts $valoracion_args = array( 'numberposts' => 2, 'post_type' => 'valoraciones', 'orderby' => 'post_date', 'order' => 'DESC' ); $valoraciones = get_posts( $valoracion_args ); // get the id_valoraciones of the prior post $last_id = get_post_meta( $valoraciones[1]->ID, 'id_valoraciones', true ); // increment if ( !$last_id ) { $last_id = 0; } $last_id++; // unhook this function so it doesn't loop infinitely remove_action( 'save_post', 'auto_assign_ids', 10, 3 ); // set the id_valoraciones of the current post update_post_meta( $post_id, 'id_valoraciones', $last_id ); // re-hook this function add_action( 'save_post', 'auto_assign_ids', 10, 3 ); } } add_action( 'save_post', 'auto_assign_ids', 10, 3 );
Every time I update a post, it modifies the value of the “id_valoraciones”, is there any way so that once it is created it does not modify that value?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Yes, it’s simple – check for existence of id_valoraciones
meta value when saving post. If post does not have id_valoraciones
set, do your job with getting last value and incerementing it. If the post has id_valoraciones
meta, then – do nothing. Like this:
<?php function auto_assign_ids( $post_id, $post, $update ) { // Only assign ID to new approved "valoraciones" posts if ( $post->post_status == 'publish' && $post->post_type == 'valoraciones' ) { $id_valoraciones = get_post_meta( $post_id, 'id_valoraciones', true ); if( ! $id_valoraciones ) { // get the most recent "valoraciones" posts $valoracion_args = array( 'numberposts' => 2, 'post_type' => 'valoraciones', 'orderby' => 'post_date', 'order' => 'DESC' ); $valoraciones = get_posts( $valoracion_args ); // get the id_valoraciones of the prior post $last_id = get_post_meta( $valoraciones[1]->ID, 'id_valoraciones', true ); // increment if ( !$last_id ) { $last_id = 0; } $last_id++; update_post_meta( $post_id, 'id_valoraciones', $last_id ); } else { // id_valoraciones was set before } } } add_action( 'save_post', 'auto_assign_ids', 100, 3 );
By the way, remove_action
part of your code is useless, update_post_meta
does not trigger save_post
hook, it’s used when wp_insert_post()
ing inside save_post
hook.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0