add_action hook для совершенно нового сообщения?

  

publish_post Запускается, когда сообщение   опубликован или если он отредактирован и его   статус «опубликован». Функция действия   arguments: post ID.

- Документация API плагина

Я добавил hook_post к плагину WordPress, который я пишу. Функция, вызываемая самим крючком, предназначена для изменения категорий нескольких сообщений с использованием функции wp_update_post.

Этот крючок не работает, поскольку результат, возвращаемый при запуске wp_update_post, всегда равен 0. Моя лучшая догадка заключается в том, что запуск wp_update_post приводит к запуску другого экземпляра моего крючка, потому что он повторно публикует сообщение ... которое, как мне кажется, вызывает "... или если он отредактирован и его статус« опубликован »« вышеприведенного утверждения.

Есть ли какой-либо другой крючок действия, который я могу использовать, который будет вызываться только тогда, когда добавленная запись будет полностью новой и не отредактирована?

<?php
 /* 
 Plugin Name: Category Switcher Plugin
 Plugin URI: http://www.example.com
 Description: When a new post is created this plugin will cause the 
 Version: 0.1
 Author: Me
 License: GPL2 
?>
<?php
class categoryShifter {
  function shiftCategories($post_ID) {

    $maxNumPostsFirstTeir = 4;

    $first_teir_cat = "Fresh News Stories 1";
    $second_teir_cat = "Slightly Dated Stories 2";  

    $firephp = FirePHP::getInstance(true);

    $firephp->info('BEGIN: categoryShifter.shiftCategories()');

    $firephp->log($post_ID, 'post_ID: ');
    $firephp->trace('trace to here');    

    $first_teir_id = categoryShifter::getIDForCategory($first_teir_cat, $firephp); 
    $second_teir_id = categoryShifter::getIDForCategory($second_teir_cat, $firephp);

    $firephp->log($first_teir_id, '$first_teir_id');
    $firephp->log($second_teir_id, '$second_teir_id');   

    $qPostArgs = array(
      'numberposts' => 100,
      'order' => 'DESC', 
      'orderby' => 'post_date',
      'post_type' => 'post',
      'post_status' => 'published', 
      'category_name' => $first_teir_cat
    );

    $firstTeirPosts = get_posts($qPostArgs);   
    $firephp->log($firstTeirPosts, 'got posts:');

    $firephp->log(sizeof($firstTeirPosts), 'sizeof');


    // NOTE: This appears to work.
    for($i = sizeof($firstTeirPosts)-1; $i > $maxNumPostsFirstTeir-4; $i--) 
    {
      $newCats = array($second_teir_id);
      $editingId = $firstTeirPosts->ID;
      $result = wp_set_post_categories($editingId, $newCats); /* NOTE: Doesn't work presently... returns an array with the $second_teir_id in it. */
      $firephp->log($result, 'Result'); 
    }



    /*
    $my_post = array();
    $my_post['ID'] = 132;
    $my_post['post_category'] = array($second_teir_id);


    $firephp->log('Before', 'Before'); 
    if(wp_update_post( $my_post ) == 0) {
        $firephp->Error('Fatal Error, Post not updated', 'error');
    }
    $firephp->log('After', 'After');
    */
    return $post_ID;
  }


  function getIDForCategory($cat_name, $logger) {
    $logger->Info("Begin: getIDForCategory()");

    $cats = get_categories();      

    $whichCatId = "";

    foreach($cats as $single_cat) {
      if($single_cat->name == $cat_name) {
       $whichCatId = $single_cat->term_id;
       break;
      }
    }
    $logger->Info("End: getIDForCategory()");
    return (int)$whichCatId;
  }
}

/* Hook Post Creation */
/* add_action('publish_post', array('categoryShifter','shiftCategories')); */
add_action('wp_insert_post', array('categoryShifter', 'shiftCategories'));
?>

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

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

6 голосов | спросил leeand00 1 FebruaryEurope/MoscowbTue, 01 Feb 2011 08:47:33 +0300000000amTue, 01 Feb 2011 08:47:33 +030011 2011, 08:47:33

4 ответа


17
add_action('new_to_publish', 'your_function');
add_action('draft_to_publish', 'your_function');
add_action('pending_to_publish', 'your_function');
ответил Pippin 1 FebruaryEurope/MoscowbTue, 01 Feb 2011 09:50:56 +0300000000amTue, 01 Feb 2011 09:50:56 +030011 2011, 09:50:56
5

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

WordPress предоставляет динамические перехватчики, которые отслеживают не только создание сообщений, но и что это было и что стало. См. Переходы состояния публикации в Codex.

ответил Rarst 1 FebruaryEurope/MoscowbTue, 01 Feb 2011 09:51:01 +0300000000amTue, 01 Feb 2011 09:51:01 +030011 2011, 09:51:01
1

Больше, чем экспериментировать, чем после документов, это работает для меня (WP 3.3). Я получаю вызов hook_post_status с $ new_status, установленным на «auto-draft» при создании нового сообщения.

function my_post_new($new_status, $old_status=null, $post=null){
    if ($new_status == "auto-draft"){
        // do stuff here
    }
}
add_action('transition_post_status', 'my_post_new');
ответил PapaFreud 23 MarpmFri, 23 Mar 2012 13:38:50 +04002012-03-23T13:38:50+04:0001 2012, 13:38:50
0

Я внимательно прочитал ядро ​​WordPresss, и я пробовал все это. wp_transition_post_status(), new_to_publish(), new_{post_type}(), wp_insert_post().

Все это, в конце концов, ненадежное.

wp_transition_post_status() не является надежным, поскольку новый статус «publish» является статусом по умолчанию как для создания новых сообщений, так и для обновления существующих. Старый статус не является надежным, чтобы определить, что нового сообщения, а что нет, потому что это может быть черновик, авто-черновик, публикация и т. Д.

new_to_publish() не работает для пользовательских типов сообщений.

new_{post_type} только передает $ post как параметр, и вы не можете знать, является ли оно новым или обновляет существующий

wp_insert_post() имеют параметр обновления $, который должен быть TRUE, если обновлять существующие сообщения и FALSE при создании новых сообщений, но это ненадежно, потому что это возвращает TRUE для новых сообщений из-за автоматической черновики.

Я закончил это:

/**
*   Do something when a new book is created
*/
function new_book($post_id, $post, $update) {
    if ($post->post_type == 'book' && $post->post_status == 'publish' && empty(get_post_meta( $post_id, 'check_if_run_once' ))) {
        # New Post

        # Do something here...

        # And update the meta so it won't run again
        update_post_meta( $post_id, 'check_if_run_once', true );
    }
}
add_action( 'wp_insert_post', 'new_book', 10, 3 );

Необязательно, если вам нужно обновить существующие сообщения метафорой «check_if_run_once», чтобы он не запускал код выше для существующих сообщений, созданных до того, как вы добавили эту функцию, вы могли бы сделать:

/**
*   This is a temporary function to update existing posts with the "check_if_run_once" post meta
*   Access your website logged in as admin and add ?debug to the URL.
*/
function temporary_function() {
    if (current_user_can('manage_options')) {
        $posts = get_posts(array(
            'post_type' => 'book'
        ));
        foreach($posts as $post) {
            update_post_meta($post->ID, 'check_if_run_once', true);
        }
    }
}
if (isset($_GET['debug']));
    add_action('init', 'temporary_function');
ответил Lucas Bustamante 30 J000000Monday18 2018, 03:50:24

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132