2010-10-21 4 views
11

Dans Wordpress, vous obtenez les états de publication par défaut: Publié, Brouillon et Examen en attente. Est-il possible d'ajouter d'autres types de post en les enregistrant via le fichier function.php du thème actif?Wordpress crée un nouveau statut de publication?

Est-il également possible d'éditer les étiquettes de la Meta Box de publication? Ce que je soumets vraiment n'est pas la publication ...

Aussi aimer ajouter que je veux seulement que ces changements soient faits quand dans mon type de message personnalisé que j'ai fait.

Cordialement

Scott

+0

Ces statuts ont des implications profondes sur la façon dont les messages sont traités et affichés, n'est-ce pas? Je ne pense pas que vous pouvez simplement ajouter un nouveau à une liste. Quels nouveaux statuts souhaiteriez-vous ajouter? –

+0

Je souhaite uniquement ajouter de nouveaux statuts à mes types de publications personnalisés et à ceux qui gèrent déjà l'affichage de la publication via des requêtes personnalisées. Avec wordpress, vous pouvez effectuer une requête pour afficher les messages en fonction de leur statut. Donc, l'ajout de certains statuts tels que Vendu et Supprimé ne devrait pas être un problème majeur pour le système? – Brady

+1

@Brady Je vois. Je ne sais pas si c'est facilement possible. Qu'en est-il de l'utilisation du système de marquage/catégories pour cela? –

Répondre

18

Depuis WP 3.0, vous pouvez utiliser la fonction register_post_status() (http://hitchhackerguide.com/2011/02/12/register_post_status/) pour ajouter de nouveaux statuts à un type de publication. WP lui-même utilise register_post_status() pour enregistrer les statuts "published", "draft", etc. par défaut à l'aide de la fonction create_initial_post_types() dans wp-includes/post.php (http://hitchhackerguide.com/2011/02/11/create_initial_post_types/). Regardez le code dans ces liens, et vous pouvez avoir une idée de la façon d'utiliser la fonction.

J'espère que cela vous aidera à démarrer!

2

Vous pouvez écrire un plug-in si vous savez comment. Vous devez creuser dans la documentation ou des plugins similaires comme celui-ci http://wordpress.org/extend/plugins/edit-flow/ ou celui http://wordpress.org/extend/plugins/custom-post-type-ui/

Avec « crochets, actions et filtres » vous pouvez changer l'interface d'administration, voir ici http://codex.wordpress.org/Plugin_API

Jusqu'à présent, j'ai écriture juste un simple plugin et je ne connais pas les étapes exactes que vous devez suivre pour accomplir ceci ...

Bonne chance!

+0

Merci pour votre suggestion Keyne mais ce moment dans le temps je n'ai pas le temps d'aller creuser autour de l'API, je travaille actuellement à une date limite pour un client devra donc s'en tenir à une solution de terrain personnalisé pour l'instant. J'espérais juste que quelqu'un sache comment le faire et présenter un code de démonstration sur la façon de le faire. – Brady

1
/** 
* PostStatusExtender 
* 
* @author Hyyan Abo Fakher<[email protected].com> 
*/ 
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); 
    } 

} 

Et ici comment utiliser il

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: Correction d'une faute dans le code.

+0

Cela m'a juste donné un écran blanc et n'a rien fait ...... – Justin

Questions connexes