2010-10-21 10 views
11

Trong Wordpress bạn nhận được trạng thái bài đăng mặc định: Đã xuất bản, Bản nháp và Đang chờ xem xét. Có thể thêm một số loại bài đăng khác thông qua đăng ký chúng thông qua tệp function.php của chủ đề đang hoạt động không?Wordpress tạo trạng thái bài đăng mới?

Cũng có thể chỉnh sửa lables của Hộp xuất bản Meta? Những gì tôi đang gửi thực sự isnt Xuất bản ...

Cũng giống như thêm tôi chỉ muốn những thay đổi này được thực hiện khi trong loại bài đăng tùy chỉnh của tôi mà tôi đã tạo.

Kind Regards

Scott

+0

Các trạng thái này có ý nghĩa sâu sắc về cách các bài đăng được xử lý và hiển thị, phải không? Tôi không tưởng tượng bạn chỉ có thể thêm một cái mới vào một số danh sách. Bạn muốn thêm trạng thái mới nào? –

+0

Tôi chỉ muốn thêm trạng thái mới vào các loại bài đăng tùy chỉnh của mình và với những bài đăng đó đã quản lý hiển thị bài đăng thông qua các truy vấn tùy chỉnh. Với wordpress bạn có thể truy vấn để hiển thị các bài viết tùy thuộc vào trạng thái của nó. Vì vậy, thêm một số trạng thái như Bán và Gỡ bỏ không nên là một vấn đề lớn đối với hệ thống? – Brady

+1

@Brady Tôi hiểu. Tôi không biết liệu điều này có dễ dàng không. Điều gì về việc sử dụng hệ thống gắn thẻ/danh mục cho mục đích này? –

Trả lời

18

Vì WP 3.0, bạn có thể sử dụng hàm register_post_status() (http://hitchhackerguide.com/2011/02/12/register_post_status/) để thêm trạng thái mới vào loại bài đăng.

Bản thân WP sử dụng register_post_status() để đăng ký trạng thái "đã xuất bản", "nháp", v.v. mặc định trên init bằng hàm create_initial_post_types() trong wp-includes/post.php (http://hitchhackerguide.com/2011/02/11/create_initial_post_types/).

Xem mã trong các liên kết đó và bạn có thể có ý tưởng về cách sử dụng hàm.

Tôi hy vọng điều đó sẽ giúp bạn bắt đầu!

2

Bạn có thể viết một plugin nếu bạn biết làm thế nào. Bạn phải thâm nhập vào các tài liệu hướng dẫn hoặc tương tự plug-in như thế này http://wordpress.org/extend/plugins/edit-flow/ hay này một http://wordpress.org/extend/plugins/custom-post-type-ui/

Với "Hooks, Hoạt động và bộ lọc" bạn có thể thay đổi giao diện quản trị, xem tại đây http://codex.wordpress.org/Plugin_API

Cho đến nay tôi đã ghi chỉ cần một plugin đơn giản và tôi không biết các bước chính xác mà bạn phải tuân thủ để thực hiện việc này ...

Chúc may mắn!

+0

Cảm ơn đề nghị của bạn Keyne nhưng thời điểm này tôi không có thời gian để đi đào xung quanh API, tôi hiện đang làm việc cho một thời hạn cho một khách hàng vì vậy sẽ phải dính vào một giải pháp lĩnh vực tùy chỉnh cho bây giờ. Tôi chỉ hy vọng rằng một số người sẽ biết làm thế nào để làm điều đó và trình bày một số mã demo trên làm thế nào để. – Brady

1

Bạn có thể thêm trạng thái bài đăng tùy chỉnh 'bằng cách sử dụng chức năng register_post_status. Hãy tham khảo create_initial_post_types() tại http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/post.php

Tuy nhiên, hãy cảnh báo rằng điều này không được tích hợp vào giao diện người dùng phụ trợ của Wordpress.

1
/** 
* PostStatusExtender 
* 
* @author Hyyan Abo Fakher<[email protected]> 
*/ 
class PostStatusExtender 
{ 

    /** 
    * Extend 
    * 
    * Extend the current status list for the given post type 
    * 
    * @global \WP_POST $post 
    * 
    * @param string $postType the post type name , ex: product 
    * @param array $states array of states where key is the id(state id) and value 
    *      is the state array 
    */ 
    public static function extend($postType, $states) 
    { 

     foreach ($states as $id => $state) { 
      register_post_status($id, $state); 
     } 

     add_action('admin_footer-post.php', function() use($postType, $states) { 

      global $post; 
      if (!$post || $post->post_type !== $postType) { 
       return false; 
      } 

      foreach ($states as $id => $state) { 

       printf(
         '<script>' 
         . 'jQuery(document).ready(function($){' 
         . ' $("select#post_status").append("<option value=\"%s\" %s>%s</option>");' 
         . ' $("a.save-post-status").on("click",function(e){' 
         . '  e.preventDefault();' 
         . '  var value = $("select#post_status").val();' 
         . '  $("select#post_status").value = value;' 
         . '  $("select#post_status option").removeAttr("selected", true);' 
         . '  $("select#post_status option[value=\'"+value+"\']").attr("selected", true)' 
         . ' });' 
         . '});' 
         . '</script>' 
         , $id 
         , $post->post_status !== $id ? '' : 'selected=\"selected\"' 
         , $state['label'] 
       ); 

       if ($post->post_status === $id) { 
        printf(
          '<script>' 
          . 'jQuery(document).ready(function($){' 
          . ' $(".misc-pub-section #post-status-display").text("%s");' 
          . '});' 
          . '</script>' 
          , $state['label'] 
        ); 
       } 
      } 
     }); 


     add_action('admin_footer-edit.php', function() use($states, $postType) { 

      global $post; 

      if (!$post || $post->post_type !== $postType) { 
       return false; 
      } 

      foreach ($states as $id => $state) { 
       printf(
         '<script>' 
         . 'jQuery(document).ready(function($){' 
         . " $('select[name=\"_status\"]').append('<option value=\"%s\">%s</option>');" 
         . '});' 
         . '</script>' 
         , $id 
         , $state['label'] 
       ); 
      } 
     }); 

     add_filter('display_post_states', function($states, $post) use($states, $postType) { 

      foreach ($states as $id => $state) { 
       if ($post->post_type == $postType && $post->post_status === $id) { 
        return array($state['label']); 
       } else { 
        if (array_key_exists($id, $states)) { 
         unset($states[$id]); 
        } 
       } 
      } 

      return $states; 
     }, 10, 2); 
    } 

} 

Và đây làm thế nào để sử dụng nó

add_action('init', function() { 
    PostStatusExtender::extend(self::NAME, array(
     'sold' => array(
      'label' => __('Sold', 'viasit'), 
      'public' => true, 
      'exclude_from_search' => true, 
      'show_in_admin_all_list' => true, 
      'show_in_admin_status_list' => true, 
      'label_count' => _n_noop('Sold <span class="count">(%s)</span>', 'Sold <span class="count">(%s)</span>'), 
     ) 
    )); 
}); 

Edit: typo cố định trong mã.

+0

Điều này chỉ cho tôi một màn hình trắng và không làm gì cả ...... – Justin