Расширенные настраиваемые поля WordPress: обновить поле при удалении настраиваемой записи - PullRequest
0 голосов
/ 22 января 2019

Я хочу обновить поле при удалении пользовательского типа записи (CPT).Прямо сейчас у меня есть поле отношений стажеров как часть группы полей учебного курса.Поле стажеров заполняет значения из CPT стажера.

Я рассчитываю места обучения, оставленные с кодом ниже, каждый раз, когда обновляется курс обучения:

function my_acf_save_post( $post_id ) {

// get new value
$number_of_places_available = get_field('number_of_places_available');
$number_of_trainees = count(get_field('trainees')); 
if ( empty(get_field('trainees')) ) {
  $number_of_places_left = $number_of_places_available;
} else {
  $number_of_places_left = $number_of_places_available - $number_of_trainees;
}


// do something
update_field('number_of_places_left', $number_of_places_left, $post_id);
}

add_action('acf/save_post', 'my_acf_save_post', 20);  

Остальныеучебные курсы - это доступное только для чтения поле в бэкэнде, которое рассчитывается.

Я хочу обновить оставшиеся места для тренировок, оставшиеся после того, как стажер фактически удален (перемещен в корзину).В настоящее время, когда я удаляю стажера, мне нужно сохранить учебный курс, которому обучаемый принадлежит, чтобы остальные места обучения корректно обновлялись.Я хотел бы обновить это поле, когда стажер фактически удален, и мне не нужно сохранять учебный курс.

Я пытаюсь использовать переходы после состояния, чтобы сделать это, но, похоже, это не работает,Это означает, что когда я обновляю учебный курс в бэкэнде, даже если стажер был удален из поля отношений, количество доступных мест не было обновлено и обновляется только после сохранения учебного курса:

function on_publish_trash_post( $post ) {
    if ($post->post_type != 'trainee'){
        return;
    }

// get new value
$number_of_places_available = get_field('number_of_places_available');
$number_of_trainees = count(get_field('trainees'));
if ( empty(get_field('trainees')) ) {
  $number_of_places_left = $number_of_places_available;
} else {
  $number_of_places_left = $number_of_places_available - $number_of_trainees;
}

// do something
update_field('number_of_places_left', $number_of_places_left, $post->ID);
}

add_action(  'publish_to_trash',  'on_publish_trash_post', 10, 1 );

Что я делаю не так?

1 Ответ

0 голосов
/ 25 января 2019

Нашли решение для всех, кому интересно:

function gm_trash_trainee( $post_id ) {
    $post_type = get_post_type( $post_id );
    $post_status = get_post_status( $post_id );
    if ( $post_type == 'trainee' ) {

        $args = array( 'post_type' => 'training_course');

        $loop = new WP_Query( $args );
        while ( $loop->have_posts() ) : $loop->the_post();
            $number_of_places_available = get_field('number_of_places_available', the_ID());
            $number_of_trainees = count(get_field('trainees', the_ID()));
            $number_of_places_left = $number_of_places_available - $number_of_trainees;
            update_field('number_of_places_left', $number_of_places_left, the_ID());

        endwhile;
    }
}
add_action( 'trashed_post', 'gm_trash_trainee' );
...