Изменение статуса сообщения Wordpress при публикации - PullRequest
5 голосов
/ 15 февраля 2011

Я пытаюсь проверить поля для пользовательского типа сообщения в панели администратора Редактировать страницу сообщения.

Когда пользователь нажимает «Опубликовать», я хочу проверить поля в данных POST и изменить post_status на «ожидающий», если данные не проходят тесты. Когда это происходит, я также хотел бы добавить ошибки на страницу в области уведомлений администратора.

Я пробовал это с добавленным хуком к действию "wp_insert_post", которое также сохраняет наши собственные данные. Я не уверен в порядке операций, но я предполагаю, что сначала происходят события wp_insert_post, а затем моя функция вызывается через ловушку.

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

Итак, вот порядок операций, который я хотел бы выполнить:

1. admin user edits post data and clicks "Publish"
2. via wp_insert_post, my data validation and post meta save routine is called
3. If data passes validation, post status is "published"
4. Otherwise, post status set to "pending" & message shown in admin notice area

Конечно, кто-то сделал это, но обширный поиск в Google просто приводит меня к тем же, на первый взгляд, неуместным страницам. Может ли кто-нибудь указать мне правильное направление здесь? Заранее спасибо -

UPDATE

Итак, RichardML действительно был прав: подключение к фильтру wp_insert_post_data дало мне подходящее место для проверки полей страницы редактирования сообщения администратора. Однако я обновляю это, чтобы заметить, какова остальная часть решения, в частности, узнать причину, указанную в области уведомлений администратора.

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

Что вам нужно сделать, так это воспользоваться функцией фильтра проверки. Если вы решите, что вам нужно будет отображать ошибки, используйте set_option (), чтобы добавить опцию блога с уникальным именем (я использовал «publish_errors»). Это должен быть HTML-код в div с классом «error».

Вам также необходимо добавить хук действия для 'admin_notices', указывающий на функцию, которая проверяет наличие опции 'publish_errors', и, если она находит ее, печатает ее на странице и удаляет ее с помощью delete_option ( ).

1 Ответ

9 голосов
/ 15 февраля 2011

Вы можете использовать фильтр wp_insert_post_data для проверки и изменения данных поста до их добавления в базу данных.


В ответ на ваше обновление я не считаю необходимым временно добавлять опцию в базу данных. Должна быть возможность просто добавить строковую переменную запроса к перенаправлению Wordpress, примерно так:

add_filter('wp_insert_post_data', 'my_post_data_validator', '99');
function my_post_data_validator($data) {
  if ($data['post_type'] == 'post') {
    // If post data is invalid then
    $data['post_status'] = 'pending';
    add_filter('redirect_post_location', 'my_post_redirect_filter', '99');
  }
  return $data;
}

function my_post_redirect_filter($location) {
  remove_filter('redirect_post_location', __FILTER__, '99');
  return add_query_arg('my_message', 1, $location);
}

add_action('admin_notices', 'my_post_admin_notices');
function my_post_admin_notices() {
  if (!isset($_GET['my_message'])) return;
  switch (absint($_GET['my_message'])) {
    case 1:
      $message = 'Invalid post data';
      break;
    default:
      $message = 'Unexpected error';
  }
  echo '<div id="notice" class="error"><p>' . $message . '</p></div>';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...