add_action hook cho bài hoàn toàn mới?


11

Publish_post Chạy khi bài đăng được xuất bản hoặc nếu nó được chỉnh sửa và trạng thái của nó là "xuất bản". Đối số chức năng hành động: ID bài.

- Tài liệu API bổ trợ

Tôi đã thêm hook Publish_post vào một plugin WordPress mà tôi đang viết. Hàm được gọi bởi chính hook, có nghĩa là thay đổi danh mục của một số bài đăng bằng cách sử dụng hàm wp_update_post.

Tuy nhiên, hook này không hoạt động vì kết quả được trả về từ việc chạy wp_update_post luôn là 0. Tôi đoán tốt nhất là việc chạy wp_update_post khiến một phiên bản hook khác của tôi chạy vì nó xuất bản lại bài đăng ... mà tôi tin là mang lại ". .. hoặc nếu nó được chỉnh sửa và trạng thái của nó là "xuất bản" " của tuyên bố trên.

Có bất kỳ hook hành động nào khác mà tôi có thể sử dụng sẽ chỉ được gọi khi bài đăng được thêm hoàn toàn mới và không được chỉnh sửa không?

<?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'));
?>

Tôi đã chuyển sang sử dụng hook wp_insert_post trong thời gian này ... nhưng tôi vẫn không thể có được hàm wp_set_post_clists để thay đổi danh mục của bài viết.

Tôi hiểu rằng có lẽ tôi sẽ cần cập nhật mã này để nó tính đến các danh mục hiện có của bài đăng và chỉ sửa đổi các mục được chỉ định bởi plugin, nhưng bây giờ nó thực sự chỉ là một bản alpha.


1
@ leeand00 - Bạn có thể đăng mã của mình dưới dạng cập nhật cho câu trả lời của bạn để chúng tôi có thể thấy tốt hơn những gì cần sửa không?
MikeSchinkel

@Mike Đây là bản cập nhật!
leeand00

@MikeSchinkel Đôi khi điều đó chỉ vì tôi chưa có cơ hội để thử câu trả lời và tôi không muốn đánh dấu một câu trả lời không tốt .... nhưng tôi sẽ quay lại và xem tôi có thể làm gì !
leeand00

@MikeSchinkel Được rồi, tôi đã dọn sạch chúng và chọn câu trả lời hay nhất, xin lỗi về điều đó, tôi không nhận ra mình đã bỏ bê StackExchange cụ thể này như thế nào.
leeand00

Câu trả lời:


17
add_action('new_to_publish', 'your_function');
add_action('draft_to_publish', 'your_function');
add_action('pending_to_publish', 'your_function');

2
Làm thế nào về wp_insert_posthành động? core.trac.wordpress.org/browser/tags/3.3.1/wp-includes/iêu
soulseekah

Nhưng những điều này sẽ chạy lại nếu, ví dụ, trạng thái được thay đổi từ xuất bản trở lại dự thảo sau đó sang xuất bản lại?
brandonjp

6

Mục tiêu chính xác tạo ra bài viết mới thực sự khó khăn hơn nó có vẻ. Về mặt kỹ thuật, có nhiều cách bài viết có thể được tạo hoặc cập nhật và có rất nhiều điều không rõ ràng cũng là bài viết về mặt kỹ thuật (ví dụ sửa đổi).

WordPress cung cấp các móc động theo dõi không chỉ tạo bài, mà còn là gì và nó đã trở thành gì. Xem chuyển trạng thái bài trong Codex.


4

Tôi đã đọc rộng rãi cốt lõi của WordPress và tôi đã thử tất cả. wp_transition_post_status(), new_to_publish(), new_{post_type}(), wp_insert_post().

Tất cả những thứ này, sau tất cả, không đáng tin cậy.

wp_transition_post_status()không đáng tin cậy vì trạng thái mới "xuất bản" là trạng thái mặc định cả để tạo bài đăng mới và cập nhật bài đăng hiện có. Trạng thái cũ không đáng tin cậy để xác định bài đăng mới là gì và không phải vì nó có thể là bản nháp, tự động soạn thảo, xuất bản, v.v.

new_to_publish() không hoạt động cho các loại bài tùy chỉnh.

new_{post_type} chỉ chuyển $ post làm tham số và bạn không thể biết nó mới hay đang cập nhật thông tin hiện có

wp_insert_post() có tham số $ update phải là TRUE nếu cập nhật các bài đăng hiện có và FALSE nếu tạo bài đăng mới, nhưng nó không đáng tin cậy vì nó trả về TRUE cho các bài đăng mới vì tự động soạn thảo.

Tôi đã kết thúc việc này:

/**
*   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 );

Tùy chọn, nếu bạn cần cập nhật các bài đăng hiện tại của mình với meta "check_if_run_once", vì vậy nó không chạy mã ở trên cho các bài đăng hiện có được tạo trước khi bạn thêm chức năng đó, bạn có thể làm:

/**
*   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');
}

1

Sử dụng thử nghiệm nhiều hơn là theo tài liệu, điều này hiệu quả với tôi (WP 3.3). Tôi nhận được một cuộc gọi hook trans_post_status với $ new_status được đặt thành "tự động phác thảo" khi bạn tạo một bài đăng mới.

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');

1
Điều này sẽ tắt mỗi khi lưu bản nháp tự động, tức là cứ sau một phút hoặc lâu hơn khi chỉnh sửa.
soulseekah

Điểm tốt. Trong trường hợp của tôi đây không phải là một vấn đề nhưng nó có thể là cho người khác, tùy thuộc vào những gì bạn đang làm.
PapaFreud

tôi muốn upvote, nhưng tôi chưa thể. vì vậy đạo cụ đi đến đây, @PapaFreud. btw, điều này hiện được ghi lại tại codex.wordpress.org/Post_Status_Transitions . một lần nữa, cảm ơn người đàn ông
Ana Ban

1
@soulseekah Điểm thú vị mà bạn nêu ra, tôi đã thử nghiệm điều này và auto-draftđược chỉ định là $new_statusmột bài đăng khi tạo ra nó (tức là Thêm mới), chỉ một lần. Ngay sau khi AUTOSAVEquy trình đầu tiên kích hoạt sau 1 phút, $new_statusgiá trị được cập nhật thành draft. Các $old_statusvẫn là NULLcho đến khi bài được bằng tay lưu hoặc công bố. Vì vậy, về mặt kỹ thuật, nó sẽ hoạt động và không kích hoạt mỗi khi trình soạn thảo tự động lưu công việc của bạn. Là một biện pháp bổ sung, bạn có thể kiểm tra để đảm bảo rằng đó $old_statusNULLđể xác minh ->if ($new_status == "auto-draft" && $old_status === NULL)
Adam

0

Tôi tìm thấy tùy chọn tốt nhất là kiểm tra trạng thái bài đăng khi wp_insert_postđược gọi.

Khi một bài viết mới được tạo, trạng thái ban đầu là auto-draft.

if (!function_exists('benyonsFunction')) {
    function benyonsFunction($postId, $post) {
        if ($post->post_status == "auto-draft") {
            error_log('NEW POST!!!');
        }
    }
}

add_action('wp_insert_post', 'benyonsFunction', 10, 2);

Error_log này sẽ chỉ bắn một lần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.