使用面向对象的方法创建自定义帖子类型?

时间:2018-12-22 作者:Lucas Bustamante

我正在寻找一种关于在WordPress中使用面向对象创建自定义帖子类型的好方法。如何以干净、有序的方式创建CPT?

考虑以下三种情况:

发行版插件(兼容5.2版)

  • 发行版主题
  • 自己的项目,完全控制PHP版本和依赖项

  • 2 个回复
    SO网友:Lucas Bustamante

    我会回答的scenario #3, 即使它也可以适用于场景1和场景2。

    WordPress抄本recommends 我们在插件中创建自定义帖子类型(CPT)。根据这一建议,我将使用现代PHP编写我的答案,这不是针对分布式插件,而是针对您可以控制PHP版本运行的自己的项目。

    在下面的示例代码中,我将使用原始示例来说明以OOP方式创建CPT背后的架构,但在实际项目中,“我的插件”类似于“我的项目”,而CPT的创建将是该插件的一种模块。

    my-plugin/my-plugin.php

    <?php
    /**
    * Plugin name: My Custom Post Types
    */
    namespace MyPlugin;
    
    use MyPlugin/CPT/Car;
    
    // ... Composer autoload or similar here
    
    Car::register();
    

    my-plugin/CPT/Car.php

    <?php
    
    namespace MyPlugin\\CPT;
    
    /**
     * Class Car
     *
     * Handles the creation of a "Car" custom post type
    */
    class Car
    {
        public static function register()
        {
            $instance = new self;
    
            add_action(\'init\', [$instance, \'registerPostType\']);
            add_action(\'add_meta_boxes\', [$instance, \'registerMetaboxes\']);
    
            // Do something else related to "Car" post type
        }
    
        public function registerPostType()
        {
            register_post_type( \'car\', [
                \'label\' => \'Cars\',
            ]);
        }
    
        public function registerMetaBoxes()
        {
            // Color metabox
            add_meta_box(
                \'car-color-metabox\',
                __(\'Color\', \'my-plugin\'),
                [$this, \'colorMetabox\'],
                \'car\'
            );
        }
    
        public function colorMetabox()
        {
            echo \'Foo\';
        }
    }
    
    这样,我们就有了一个用于CPT的名称空间,以及一个可以管理其属性的对象,例如注册post类型、添加或删除元盒等。

    如果我们接受从前端插入“Cars”,我们将使用REST API 接收POST请求并在REST Controller Class, 但这超出了这个答案的范围。

    SO网友:Justin Waulters

    我通常使用这样的方式:

    <?php
    
    /*
    Plugin Name: My Plugin
    Plugin URI: https://my.plugin.com
    Description: My plugin description
    Version: 1.0.0
    Author: Me
    Author URI: https://my.website.com
    License: GPL2 (or whatever)
    
    Notes:
    */
    
    class myClass {
    
        function __construct() {
    
            add_action( \'init\', array( $this, \'create_post_type\' ) );
    
        }
    
        function create_post_type() {
    
            $name = \'Foos\';
            $singular_name = \'Foo\';
            register_post_type( 
                \'rg_\' . strtolower( $name ),
                array(
                    \'labels\' => array(
                        \'name\'               => _x( $name, \'post type general name\' ),
                        \'singular_name\'      => _x( $singular_name, \'post type singular name\'),
                        \'menu_name\'          => _x( $name, \'admin menu\' ),
                        \'name_admin_bar\'     => _x( $singular_name, \'add new on admin bar\' ),
                        \'add_new\'            => _x( \'Add New\', strtolower( $name ) ),
                        \'add_new_item\'       => __( \'Add New \' . $singular_name ),
                        \'new_item\'           => __( \'New \' . $singular_name ),
                        \'edit_item\'          => __( \'Edit \' . $singular_name ),
                        \'view_item\'          => __( \'View \' . $singular_name ),
                        \'all_items\'          => __( \'All \' . $name ),
                        \'search_items\'       => __( \'Search \' . $name ),
                        \'parent_item_colon\'  => __( \'Parent :\' . $name ),
                        \'not_found\'          => __( \'No \' . strtolower( $name ) . \' found.\'),
                        \'not_found_in_trash\' => __( \'No \' . strtolower( $name ) . \' found in Trash.\' )
                    ),
                    \'public\'             => true,
                    \'has_archive\'        => strtolower($taxonomy_name),
                    \'hierarchical\'       => false,
                    \'rewrite\'            => array( \'slug\' => $name ),
                    \'menu_icon\'          => \'dashicons-carrot\'
                )
            );
    
        }
    
    }
    
    $my_class = new myClass();
    
    ?>
    
    您可以致电add_action 只要操作是init回调的一部分,就可以将函数转换为另一个函数。

    请注意add_action 函数在类中放置时使用数组而不是字符串。

    如果需要,您可以将其用作插件中的主文件。

    codex没有显示使用变量$name$singular_name, 但我喜欢这样开始,以便在开发过程中随时可以轻松更改它。

    以下是有关创建帖子类型的详细信息:https://developer.wordpress.org/reference/functions/register_post_type/https://codex.wordpress.org/Function_Reference/register_post_type

    相关推荐

    Separate First Post Loop

    我正在尝试使用<?php rewind_posts(); ?> 在我的主页模板上使用两个循环的功能。有人知道如何停止最新帖子后的第一个循环吗?这是我的代码:<?php if (have_posts()) : while (have_posts()) : the_post(); ?> <h1><a href=\"<?php the_permalink(); ?>\"><