Поддержка Проблемы и решения post_id=0 при записи комментария на хук save_post

  • Пытаюсь добавить автокомментарий, но в таблицу wp_comments в поле comment_post_id всегда пишется 0

    function CP_PersonNotice{
    	global $post;
    	$post_id = $post->ID;
    	$post_type= get_post_type();
    	$persons = array();
    	$personsmails = array();
    
    	$member_id=get_post_meta($post_id,'member_from-cp-posts-sql', true);
    	$user_id=get_user_by_person($member_id);
    	if ($user_id==0) {
          $person_mail=get_post_meta($person_id,'email', true);
    	}
    	if ($person_mail<>''){
          // проверяем есть ли дата завершение, в зависимости от этого устанавливаем тип комментария
    	  $post_date_end = get_post_meta($post_id,'cp_date_end',true);
    	  if ($post_date_end<>''){
    	    $comment_type='persona_notice_end';
    	    $comment_text='Задача №'.$post_id.',закрыта, по всем вопросам обращаться:'.$person_mail;
    		$theme_text='Задача №'.$post_id.',закрыта';
    	  }
    	  else{
    	    $comment_type='persona_notice_start';
    	    $comment_text='Зарегистрирована задача №'.$post_id.',по всем вопросам обращаться:'.$person_mail;
    		$theme_text='Зарегистрирована задача №'.$post_id;
    	  }
    
    	  // проверим есть ли комментрарий указанного типа, если нет добавим, также запишем мета
    	  if (($post_id<>0) and ($post_type=='cases')){
    	    $comment = array (
                  'author_email' => '',
                  'id' => '',
                  'karma' => '',
                  'number' => '',
                  'offset' => '',
                  'orderby' => '',
                  'order' => 'DESC',
                  'parent' => '',
                  'post_id' => $post_id,
                  'post_author' => '',
                  'post_name' => '',
                  'post_parent' => '',
                  'post_status' => '',
                  'post_type' => 'cases',
                  'status' => '',
                  'type' => $comment_type,
                  'user_id' => '',
                  'search' => '',
                  'count' => false,
                  'meta_key' => '',
                  'meta_value' => '',
                  'meta_query' => '',
            );
    	    $comm = get_comments($comment);
    	      if ($comm) {return 0;}
    	        else {
    	          // создаем массив данных нового комментария
    		      $commentdata = array(
                      'comment_post_id' => $post_id,
                      'comment_author' => 'CasePress',
                      'comment_author_email' => '',
                      'comment_author_url' => 'http://',
                      'comment_content' => $comment_text,
                      'comment_type' => $comment_type,
                      'comment_parent' => 0,
                      'user_id' => '',
    	          );
                  // добавляем комментарий и мета
                  // не происходит ли автосохранение?
                  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
                  return;
                  // не ревизию ли сохраняем?
                  if (wp_is_post_revision($post_id))
                  return;
                  $headers = "Content-type: text/html; charset=utf-8 \r\n";
                  $headers .= "From: ". get_bloginfo('name') ." <no-reply@". ltrim(site_url(),'http://') .">\r\n";
                  $message = "Для того, чтобы просмотреть задачу, перейдите по ссылке <a href='" . get_permalink($post_id) . "'>" . get_permalink($post_id) . "</a>";
                  $mail_result=wp_mail($person_mail, $theme_text, $message, $headers, $attachments);
    			  if ($mail_result){
    			    $comment_id=wp_new_comment($commentdata);
    			    add_comment_meta( $comment_id, 'persona_notice-cp-comments-sql', $person_id);
    			  }
    			}
    
    	}
    }
    }
    add_action('save_post', 'CP_PersonNotice');

Просмотр 4 ответов — с 1 по 4 (всего 4)
  • Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    1. ID записи нужно брать не из глобальной переменной $post, которая не всегда может быть определена, а из параметра, передаваемого в функцию:
      function CP_PersonNotice( $post_id )
    2. defined( 'DOING_AUTOSAVE' ) и wp_is_post_revision( $post_id ) имеет смысл проверять в начале функции, чтобы не выполнять лишних действий.

    я правильно понимаю что при написании плагина мне необходимо
    1. function CP_PersonNotice( $post_id )
    2. получать ID поста за пределами функции в этом же плагине
    $post_id = get_the_id();
    ?

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    получать ID поста за пределами функции в этом же плагине

    Нет, параметр передаётся в функцию в момент выполнения действия save_post. Вторым параметром передаётся сама запись:
    http://core.trac.wordpress.org/browser/tags/3.6.1/wp-includes/post.php#L2882

    Кроме того:

    1. Неверно указан регистр имени поля — ошибка связана именно с этим. Вместо comment_post_id должно быть comment_post_ID:
      http://core.trac.wordpress.org/browser/tags/3.6.1/wp-includes/comment.php#L1377
    2. Возможно, wp_new_comment() стоит заменить на wp_insert_comment(). Первая функция предназначена для добавления комментария из POST-запроса, вторая — непосредственно для вставки комментария в базу данных.

    спасибо!

Просмотр 4 ответов — с 1 по 4 (всего 4)
  • Тема «post_id=0 при записи комментария на хук save_post» закрыта для новых ответов.