如何在WP中为自定义帖子类型设置默认分类法(类别)

时间:2013-10-31 12:36:55

标签: wordpress post categories taxonomy

我已经阅读了我能找到的每篇博文,但似乎没有什么对我有用。我需要做的就是让WP自动为我的自定义帖子类型“照片”分配默认分类/类别(“最新”),这样当用户添加新照片时,“最新”类别已被选中,已分配(例如正常博客帖子的“未分类”)。

declare ( encoding = 'UTF-8' );

! defined( 'ABSPATH' ) and exit;

add_action( 'init', array ( 'MCP_Photos', 'init' ) );

class MCP_Photos
{
    /**
     * Creates a new instance.
     * 
     * @wp-hook init
     * @see    __construct()
     * @return void
     */
    public static function init()
    {
        new self;
    }

    /**
     * Constructor
     */
    public function __construct()
    {
      $labels = array(
    'name' => 'Photography',
    'singular_name' => 'Photo',
    'add_new' => 'Add New',
    'add_new_item' => 'Add New Photo',
    'edit_item' => 'Edit Photo',
    'new_item' => 'New Photo',
    'all_items' => 'All Photos',
    'view_item' => 'View Photo',
    'search_items' => 'Search Photos',
    'not_found' =>  'No Photos found',
    'not_found_in_trash' => 'No Photos found in Trash', 
    'parent_item_colon' => '',
    'menu_name' => 'Photography'
  );

        $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true, 
    'show_in_menu' => true, 
    'query_var' => true,
            'rewrite' => array(
                'with_front' => false,
                'slug' => "photo"
            ),
     'capability_type' => 'post',
    'has_archive' => true, 
    'hierarchical' => true,
    'menu_position' => null,
    'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ),
    'taxonomies' => array('post_tag')
        );
        register_post_type("photos", $args);

        // Prevent WordPress from sending a 404 for our new perma structure.
        add_rewrite_rule(
        '^photo/(\d+)/[^/]+/?$',
        'index.php?post_type=photos&p=$matches[1]',
        'top'
        );

        // Inject our custom structure.
        add_filter( 'post_type_link', array ( $this, 'fix_permalink' ), 1, 2 );
    }

    /**
     * Filter permalink construction.
     * 
     * @wp-hook post_type_link
     * @param  string $post_link default link.
     * @param  int    $id Post ID
     * @return string
     */
    public function fix_permalink( $post_link, $id = 0 )
    {
        $post = &get_post($id);
        if ( is_wp_error($post) || $post->post_type != 'photos' )
        {
            return $post_link;
        }
        // preview
        empty ( $post->slug )
            and $post->slug = sanitize_title_with_dashes( $post->post_title );

        return home_url(
            user_trailingslashit( "photo/$post->ID/$post->slug" )
        );
    }
}



// ----------------------------- add photography categories taxonomy ---------------------------------- 


function create_photo_categories() {
    register_taxonomy(
        'photography', // name of the taxonomy
        'photos', // for which post type it applies
        array(
            'labels' => array(
                'name' => 'Categories',
                'add_new_item' => 'Add New Category',
                'new_item_name' => "New Category"
            ),
            'show_ui' => true,
            'show_tagcloud' => false,
            'hierarchical' => true
        )
    );
}

add_action( 'init', 'create_photo_categories', 0 );

4 个答案:

答案 0 :(得分:1)

我刚刚发现这个老问题,没有正确而完整的答案。因此,我正在将其写给对此主题感兴趣的任何人。

我将详细解释:

如何注册CPT和自定义分类法并添加默认术语(不可删除)

在通过CPT元框未选择其他术语的情况下,以及如何将此默认术语注册到我们的自定义帖子类型中。

继续进行的步骤:

  1. 您需要在初始化后使用register_post_type函数注册您的CPT。
  2. 注册CPT后,使用register_taxonomy函数注册自定义分类法。
  3. 注册后将术语添加到自定义分类中。
  4. 设置分类的默认术语。
  5. 在帖子保存时向CPT添加默认术语。

注意:我已经更改了问题中显示的代码的结构,并使用了单例方法,并删除了该问题的特定部分(例如,重写规则等)。我还将CPT名称更改为photo,分类名称为gallery_cat,默认词条为default_gallery_cat

  

重要提示: default_{$taxonomy}选项用于将默认类别设置为   不可移动,例如默认的uncategorized WP类别

注意::您只能将一个术语指定为默认分类法术语。

我在代码中写了其他细节作为注释。它是一个功能正常的WP插件。

最终代码:

<?php
/*
 Plugin Name: Sample CPT Default Taxonomy
 Plugin URI: http://www.yashar.site/
 Description: A sample plugin to register Photo CPT and gallery_cat custom taxonomy and add a default category.
 Version: 1.0
 Author: Yashar Hosseinpour
 Author URI: http://www.yashar.site/
 */

namespace My_Plugin;

if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly

class Photo
{
    /**
     * Instance of Photo
     * @access protected
     * @var object $instance The instance of Photo.
     */
    private static $instance = null;

    /**
     * Photo constructor.
     * This is a private constructor to be used in getInstance method to do things in a singleton way
     * It's a good idea to leave this constructor empty and make `init` method public to use it outside of the class, which is a good thing for Unit Testing
     * @access private
     */
    private function __construct()
    {
        $this->init();
    }

    /**
     * Initialize the plugin.
     * You can make it public and use it outside of the class
     * @access private
     * @return void
     */
    private function init()
    {
        // It's possible to use one method to cover these and hook it to `init`. I just like the way using single purpose OOP methods.
        // Note the priorities
        add_action('init', [$this, 'register_cpt'], 10);
        add_action('init', [$this, 'register_gallery_cat_tax'], 11);
        add_action('init', [$this, 'insert_default_gallery_cat_term' ], 12);

        // `save_post_{$post->post_type}` hook is used. Doc: https://developer.wordpress.org/reference/hooks/save_post_post-post_type/
        add_action( 'save_post_photo', [$this, 'set_default_gallery_cat'], 99, 2 );
    }

    /**
     * Register `Photo` CPT and `gallery_cat` taxonomy to it
     * This should be done after `init`
     * @access public
     * @wp-hook init
     * @return void
     */
    public function register_cpt()
    {
        $labels = array(
            'name' => 'Photos',
            'singular_name' => 'Photo',
            'add_new' => 'Add New',
            'add_new_item' => 'Add New Photo',
            'edit_item' => 'Edit Photo',
            'new_item' => 'New Photo',
            'all_items' => 'All Photos',
            'view_item' => 'View Photo',
            'search_items' => 'Search Photos',
            'not_found' =>  'No Photos found',
            'not_found_in_trash' => 'No Photos found in Trash',
            'parent_item_colon' => '',
            'menu_name' => 'Photography'
        );
        $args = array(
            'public' => true,
            'show_in_menu' => true,
            'labels' => $labels,
            'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ),
            'taxonomies' => array('post_tag', 'gallery_cat')
        );
        register_post_type('photo', $args);
    }

    /**
     * Register `gallery_cat` taxonomy
     * This should be done after registering CPT
     * @access public
     * @wp-hook init
     * @return void
     */
    public function register_gallery_cat_tax() {
        $labels = [
            'name'                      =>  'Gallery Categories',
            'singular_name'             =>  'Gallery Category',
            'all_items'                 =>  'All Gallery Categories',
            'edit_item'                 =>  'Edit Category',
            'view_item'                 =>  'View Category',
            'update_item'               =>  'Update Category',
            'add_new_item'              =>  'Add New Category',
            'new_item_name'             =>  'Category Name',
            'parent_item'               =>  'Parent Category',
            'parent_item_colon'         =>  'Parent Category:',
            'search_items'              =>  'Search Gallery Categories',
            'popular_items'             =>  'Popular Categories',
        ];
        register_taxonomy(
            'gallery_cat',
            'photo',
            array(
                'labels' => $labels,
                'show_ui' => true,
                'show_tagcloud' => false,
                'hierarchical' => true
            )
        );
    }

    /**
     * Insert default gallery_cat
     * `default_{$taxonomy}` option is used to make this term as default `gallery_cat` term (non-removable)
     * @access public
     * @wp-hook init
     */
    public function insert_default_gallery_cat_term()
    {
        // check if category(term) exists
        $cat_exists = term_exists('default_gallery_cat', 'gallery_cat');

        if ( !$cat_exists ) {
            // if term is not exist, insert it
            $new_cat = wp_insert_term(
                'Default Gallery Name',
                'gallery_cat',
                array(
                    'description'   =>  'This is your default gallery category',
                    'slug'          =>  'default_gallery_cat',
                )
            );
            // wp_insert_term returns an array on success so we need to get the term_id from it
            $default_cat_id = ($new_cat && is_array($new_cat)) ? $new_cat['term_id'] : false;
        } else {
            //if default category is already inserted, term_exists will return it's term_id
            $default_cat_id = $cat_exists;
        }

        // Setting default_{$taxonomy} option value as our default term_id to make them default and non-removable (like default uncategorized WP category)
        $stored_default_cat = get_option( 'default_gallery_cat' );

        if ( empty( $stored_default_cat ) && $default_cat_id )
            update_option( 'default_gallery_cat', $default_cat_id );
    }

    /**
     * Add an default `gallery_cat` taxonomy term for `photo` CPT on save
     * If no `gallery_cat` is selected, default gallery_cat will be registered to the post
     * @access public
     * @wp-hook save_post_photo
     * @param integer $post_id
     * @param object $post
     */
    public function set_default_gallery_cat($post_id, $post)
    {
        if ( 'publish' === $post->post_status ) {
            $gallery_cats = wp_get_post_terms( $post_id, 'gallery_cat' );
            $default_gallery_cat = (int) get_option('default_gallery_cat');

            if ( empty($gallery_cats) ) {
                wp_set_object_terms( $post_id, $default_gallery_cat, 'gallery_cat' );
            }
        }
    }

    /**
     * Instance
     * Used to retrieve the instance of this class.
     * @access public
     * @return object $instance of the class
     */
    static public function getInstance() {
        if (self::$instance == NULL) {
            self::$instance = new self();
        }
        return self::$instance;
    }
}

// Run this
Photo::getInstance();

已通过全面测试,并且可以在WP 5.1上运行

注意:save_post_{$post->post_type}钩子用于在保存photo CPT时添加默认类别术语。

  

请注意,我已经使用init钩子来注册内容,但是如果您   在多站点WP安装上,您可以考虑使用   改为使用wp_loaded挂钩(并且您可能还需要进行其他修改)。

P.S。我可能会在不久的将来完成并将此代码发布到Github上。

答案 1 :(得分:0)

register_post_type 函数的 $args - &gt;

中查找类似的内容
taxonomies => array('categories');

删除

注册自定义帖子类型使用功能的分类法

<强> Register Taxonomy

答案 2 :(得分:0)

添加像这样的分类法。

'taxonomies' => array('timeline','category',),

管理员的总代码变为如此:

// Admin
            'capability_type' => 'post',
            'menu_icon'     => 'dashicons-businessman',
            'menu_position' => 10,
            'query_var'     => true,
            'show_in_menu'  => true,
            'show_ui'       => true,
            'taxonomies' => array('timeline','category',),
            'supports'      => array(
            'title',
            'editor',
            'custom_fields',
            'timeline',
            ),

答案 3 :(得分:-1)

修改wp-includes/taxonomy.php并将自定义帖子类型名称写在'custom post name here'

http://img.prntscr.com/img?url=http://i.imgur.com/wl7VVjT.png http://img.prntscr.com/img?url=http://i.imgur.com/wl7VVjT.png