gorillapatch
  • 0
Новичок

Какое действие вызывается при сохранении черновиков?

  • 0

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

Для этого я закодировал следующие вещи

  1. создать метабокс на новом посте и странице новой страницы
  2. обрабатывать значение флажка в мета-поле и соответствующим образом устанавливать метаданные поста или страницы

Я преуспел в 1. но у меня проблемы с номером 2. У меня есть следующий код для обработки настройки метаданных:

Обновлять метаданные в зависимости от значения флажка в метабоксе

// register action
add_action( 'save_post', 'cl_save_postdata');
/* When the post is saved, saves our custom data */

function cl_save_postdata( $post_id ) {
  // check if $post_id is just a revision id and if so get the parent id
  if($parent_id = wp_is_post_revision($post_id)){
    $post_id = $parent_id;
  }  
  // verify this came from the our screen and with proper authorization,
  // because save_post can be triggered at other times

  if ( !wp_verify_nonce( EMU2_I18N_DOMAIN, plugin_basename(__FILE__) ) )
      return $post_id;
  // verify if this is an auto save routine. 
  // If it is our form has not been submitted, so we dont want to do anything
  if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
      return $post_id;

  // Check permissions
  if ( 'page' == $_POST['post_type'] ) {
    if ( !current_user_can( 'edit_page', $post_id ) )
        return $post_id;
  } else {
    if ( !current_user_can( 'edit_post', $post_id ) )
        return $post_id;
  }

  // OK, we're authenticated: we need to find and save the data

  if ($_POST['cl-activated']) {
     add_post_meta( $post_id, 'cl-activated', true, true) or update_post_meta( $post_id, 'cl-activated', true);
  } elseif (get_post_meta ($post_id, 'cl-activated', true)) {
    delete_post_meta( $post_id, 'cl-activated');
  }
  return $cl_is_activated;
}

Идея этого кода состоит в том, чтобы установить или отключить метаданные «cl-activated» в зависимости от значения флажка. Форма метабокса следующая:

Создать внутренний метабокс HTML

function cl_generate_inner_box($post, $metabox) {
      // Use nonce for verification
  wp_nonce_field( plugin_basename(__FILE__), EMU2_I18N_DOMAIN );

  // The actual fields for data entry
  echo '<label for="cl-activated">';
       _e("Activate collect links", EMU2_I18N_DOMAIN );
  echo '</label> ';
  echo '<input type="checkbox" id="cl-activated" name="cl-activated" value='.$metabox['args']['cl-parameter-name'];
  if (get_post_meta($post_id, 'cl-activated', true)==true) {
    echo ' checked="checked"';
  }
  echo ' />';
}

Мои проблемы

  1. метаданные поста не заданы. Я попытался найти метаданные в таблице wp-postmeta в базе данных, но их там нет, что бы я ни делал.
  2. Есть ли способ сохранить метаданные, даже если сообщение или страница все еще являются черновиком, а пользователь только нажимает «Сохранить черновик»? Если я использую действие save_post, как сейчас, у меня создается впечатление, что оно вызывается только тогда, когда пост уже опубликован.

Редактировать

Первая проблема решена. Я дважды проверил хуки перехода, которые предоставляет WordPress. Мне казалось, что save_post хук должен срабатывать, когда я редактирую пост. Однако происходит то, что он вызывается, когда я нажимаю кнопку нового сообщения, но не тогда, когда я затем сохраняю сообщение как черновик.

Чтобы очистить, мне нужен хук, который позволяет мне выполнять функцию, когда пользователь что-либо изменил в сообщении, чтобы увидеть, был ли изменен мой пользовательский флажок, чтобы я мог соответствующим образом обновить метаданные сообщения.

Share
  1. После WP 2.3 у вас для всех статусов есть крючок:{$new_status}_{$post->post_type}

    В качестве альтернативы вы можете использовать ans if для статуса на хуке save_post; пример для сообщения post_type, вы можете изменить этот «сообщение» на свой post_type или форму по умолчанию WP:

        public function set_status_private($id, $post) {
    
            if ( is_object($post) && 
                 'post' === $post->post_type && 
                 'publish' === $post->post_status
                ) {
                $post->post_status = 'private';
    
                wp_update_post($post);
            }
        }
    

    Я надеюсь, это поможет вам.

    • 0

Оставить ответ

You must login to add an answer.