Разработка плагинов: Wordpress обрабатывает дважды на обновлении сообщения. Как пропустить процесс на первом?

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

Теперь, у меня есть функция ВСТАВКИ в моем процессе, таким образом, он теперь вставляет данные дважды.

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

* примечание: предназначение для Wordpress 3.0 + *

Пример (завершают плагин):

<?php
/*
Plugin Name: Something Amazing
Plugin URI: http://www.somewhere.com/
Description: Displays something.
Author: Some guy
Version: 1.0
Author URI: http://www.somewhere.com/
*/
function call_something() {
 return new something();
}
if (is_admin()) add_action('load-post.php','call_something');

class something {

 public function __construct() {
  add_action('add_meta_boxes',array(&$this,'something_add_boxes'));
  add_action('save_post',array(&$this,'something_process'),1,1);
 }

 public function something_add_boxes() {
  add_meta_box('something','Some Thing',array(&$this,'something_form'),'post','side','default');
 }

 public function something_form($post,$args) {
  echo '<p><input type="text" name="somethingnew" /></p>';
 }

 public function something_process($id) {
  echo 'hey there! I\'m going to cause a redirect warning, but you will see this line twice per submit!';
  //do_something_amazing();
 }
}
?>

Возможно, существует лучший рычаг для использования для обработки, который не заставляет его записать дважды?

1
13.07.2011, 03:19
5 ответов

Рычаг Функций @Steve к save_post всегда называют дважды, Wordpress вызывают функции, сцепленные с save_post дважды потому что:

  • в первый раз это сохраняет пересмотр сообщения.
  • во второй раз это сохраняет фактическое сообщение.

Примечание: Если Вы отключили использование изменений сообщения define('WP_POST_REVISIONS', false); затем рычаг save_post будет запущен только однажды, когда фактическое сообщение будет сохранено.

Я просто протестировал следующий код, и он работает как ожидалось, и эхо только работает однажды в функции something_process.

Примечание: путем я сцепился с save_post

<?php
/*
Plugin Name: Something Amazing
Plugin URI: http://www.somewhere.com/
Description: Displays something.
Author: Some guy
Version: 1.0
Author URI: http://www.somewhere.com/
*/
function call_something() {
 return new something();
}
if (is_admin()) add_action('load-post.php','call_something');

class something {

 public function __construct() {
  add_action('add_meta_boxes',array(&$this,'something_add_boxes'));
  add_action('save_post',array(&$this,'something_process'),1,2);
 }

 public function something_add_boxes() {
  add_meta_box('something','Some Thing',array(&$this,'something_form'),'post','side','default');
 }

 public function something_form($post,$args) {
  echo '<p><input type="text" name="somethingnew" /></p>';
 }

 public function something_process($id, $post_object) {
    // don't run the echo if this is an auto save
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
        return;

    // don't run the echo if the function is called for saving revision.
    if ( $post_object->post_type == 'revision' )
        return;

  echo 'hey there! I\'m going to cause a redirect warning, but you will see this line twice per submit!';
  //do_something_amazing();
 }
}
?>
4
19.02.2020, 22:42
  • 1
    Спасибо, который является точно этим. Это работает отлично и, кажется, использует все в платформе WP. –  Exit 24.07.2011, 02:58

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

Проверьте, является ли текущий идентификатор сообщения действительно фактическим сообщением не пересмотр, или сохраненное автоматически сообщение путем выполнения этого (фактическое сообщение будет всегда возвращать ЛОЖНОЕ значение):

if ( is_int( wp_is_post_revision( $id ) ) )
    return;

if( is_int( wp_is_post_autosave( $id ) ) )
    return;
2
19.02.2020, 22:42

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

if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return '';
    }

обновление

Как я отправил, просто добавьте вышеупомянутый отрывок к очень главному из Вашего something_process функция перед любой вещью еще.

1
19.02.2020, 22:42
  • 1
    я просто пробежался через вопрос снова и наблюдение Вашего кода, поможет определить причину 2-го процесса. –  Bainternet 13.07.2011, 01:03
  • 2
    , для какой? ссылка? –  Bainternet 13.07.2011, 01:45
  • 3
    Код кода, предоставленный Wordpress, имеет эту ту же проблему: codex.wordpress.org/Function_Reference/add_meta_box версия класса. Я помещу обобщенную версию выше. –  Exit 13.07.2011, 01:46
  • 4
    Предел составлял 5 минут для редактирования, удар вводят отправленный преждевременно, обвиняют Facebook в глупом, входят =, отправляют ерунду. –  Exit 13.07.2011, 01:47
  • 5
    , который код кодекса не выполняет дважды, протестировал его о 100 времена, вероятно, что-то еще в Вашем коде. –  Bainternet 13.07.2011, 01:51

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

public function something_process($id, $post) {
    if ($post->post_type == 'revision') return;
    echo 'hey there! I\'m going to cause a redirect warning, but you will see this line twice per submit!';
    //do_something_amazing();
}

Добавление if ($post->post_type == 'revision') return; строка, Вы "отменяете" первый вызов функции на WP.

Необходимо сделать, второе изменение на действии сцепляется также. Просто измените строку:

add_action('save_post',array(&$this,'something_process'),1,1);

к этому:

add_action('save_post',array(&$this,'something_process'),1,2);

Как это Вы передаете второй параметр действию "save_post" ( $post переменная)

1
19.02.2020, 22:42
  • 1
    Привет, спасибо, но это также не работает. Я попробовал тот метод прежде, но я сделал некоторую проверку и во время обеих передач, это никогда не устанавливает post_type на 'пересмотр', когда это находится в функции процесса. Оба раза регистры тот же тип сообщения, который кажется нечетным. Вы пытались выполнить этот плагин, чтобы видеть, работает ли он? Это не могло бы работать, делают к ошибке в WP. –  Exit 13.07.2011, 04:57
  • 2
    Здесь в моих работах веб-сайта лаборатории.. Какова Ваша версия WP? –  Caio Alves 15.07.2011, 16:11

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

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

function complex_meta_update_on_save($id){
$ppid = wp_is_post_revision($id);
(can also employ) if($post_parent_id === false) $ppid = $id;
...set environmentals...

static $tc;
if($tc < 1){
execute conditions essential  for revisions, or preprocess for ppid 
}
//note no else-
i can do stuff here that is ok to duplicate, processing, etc. 

if($tc > 0) {
execute conditions and statements essential for post parents
update custom tables with custom queries, register newly processed taxonomies, et. al. 
keep in mind, on Save hook, post data has been saved in db. My plugin uses special  
metadata that needs to know whether I've got a revision, or the parent. 
update_post_meta($id, $blah);now is ok to use $id in
}
//oh the staticness of it all
$tc++;
}//end function

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

0
19.02.2020, 22:42

Теги

Похожие вопросы