WordPress 插件自定义字段不显示表单

WordPress Plugin Custom Fields not showing form

好的,所以我找不到一个插件来做我想做的事,所以我开始创建自己的插件。我以前做过 PHP 编码,虽然已经有一段时间了。抓取了一堆互联网代码来修改和做我想做的,把它们放在一个单一的 class.

目前的目标是拥有一个新的 post 类型,带有自定义字段,并且能够在管理站点中编辑这些字段。我得到的是一种新的 post 类型,带有一堆带有正确标签的框,但没有显示任何表格。

这可能只是需要多看几眼,但我看不出这里有什么问题。 add_meta_box 调用似乎有效,它们只是没有在回调函数中回显任何内容。我错过了什么?非常感谢任何帮助。

如果需要,整个 repo 是 https://github.com/steev42/WrestleEFedManager;相关文件复制如下。

<?php
// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) exit;
if ( ! class_exists( 'Wrestleefedmanager_Federation' ) ) :
class Wrestleefedmanager_Federation {

    /**
     * Constructor
     */
    public function __construct() {
        // Hooking up our function to theme setup
        add_action( 'init',             array( $this, 'create_federation_post_type' ) ); 
        add_action( 'add_meta_boxes',   array( $this, 'initialize_federation_post_type') );
        add_action( 'save_post',        array( $this, 'save_fed') );
    }

    // Our custom post type function
    function create_federation_post_type() {

     $fedlabels = array(
        'name'                => _x( 'Federations', 'Post Type General Name'),
        'singular_name'       => _x( 'Federation', 'Post Type Singular Name'),
        'menu_name'           => __( 'Federations'),
        'parent_item_colon'   => __( 'Parent Fed'),
        'all_items'           => __( 'All Feds'),
        'view_item'           => __( 'View Fed'),
        'add_new_item'        => __( 'Add New Fed'),
        'add_new'             => __( 'Add New'),
        'edit_item'           => __( 'Edit Fed'),
        'update_item'         => __( 'Update Fed'),
        'search_items'        => __( 'Search Feds'),
        'not_found'           => __( 'Not Found'),
        'not_found_in_trash'  => __( 'Not found in Trash'),
    );

    $fedargs = array(
        'label'               => __( 'feds' ),
        'description'         => __( 'Federations' ),
        'labels'              => $fedlabels,
        // Features this CPT supports in Post Editor
        'supports'            => array( 'title', 'editor', 'author', ),
        // You can associate this CPT with a taxonomy or custom taxonomy. 
        //'taxonomies'          => array( 'genres' ),
        /* A hierarchical CPT is like Pages and can have
        * Parent and child items. A non-hierarchical CPT
        * is like Posts.
        */ 
        'hierarchical'        => true,
        'public'              => true,
        'show_ui'             => true,
        'show_in_menu'        => true,
        'show_in_nav_menus'   => true,
        'show_in_admin_bar'   => true,
        'menu_position'       => 5,
        'can_export'          => true,
        'has_archive'         => true,
        'exclude_from_search' => false,
        'publicly_queryable'  => true,
        'capability_type'     => 'page',
    );

        register_post_type( 'feds', $fedargs);
    }


    function initialize_federation_post_type() {
        /*
        add_meta_box( string $id, string $title, callable $callback, string|array|WP_Screen $screen = null, 
                      string $context = 'advanced', string $priority = 'default', array $callback_args = null )*/
        add_meta_box("abbreviation", "Abbreviation", "fed_abbr", "feds", "normal", "low");
        add_meta_box("founded", "Founded", "fed_founded", "feds", "side", "low");
        add_meta_box("closed", "Closed", "fed_closed", "feds", "side", "low");
        add_meta_box("parentfed", "Parent Federation", "fed_parent", "feds", "normal", "low");
        add_meta_box("logo", "Logo", "fed_logo", "feds", "normal", "low");
        add_meta_box("owner", "Owner", "fed_owner", "feds", "side", "low");     
    }

    function fed_abbr(){
        global $post;
        $custom = get_post_custom($post->ID);
        $abbr = $custom["abbreviation"][0];
        ?>
        <label>Abbr:</label>
        <input name="fed_abbreviation" type="text" value="<?php echo $abbr; ?>" />
        <?php
        }

    function fed_founded(){
        global $post;
        $custom = get_post_custom($post->ID);
        $founded = $custom["founded"][0];
        ?>
        <label>Founded:</label>
        <input name="fed_founddate" value="<?php echo $founded; ?>" />
        <?php
    }

    function fed_closed(){
        global $post;
        $custom = get_post_custom($post->ID);
        $closed = $custom["closed"][0];
        ?>
        <label>Closed:</label>
        <input name="fed_closedate" value="<?php echo $closed; ?>" />
        <?php
    }

    function fed_parent(){
    }

    function fed_logo(){
    }

    function fed_owner(){
        global $post;
        $custom = get_post_custom($post->ID);
        $owner = $custom["owner"][0];
        ?>
        <label>Owner:</label>
        <input name="fed_owner" value="<?php echo $owner; ?>" />
        <?php
    }

    function save_fed(){
        global $post;

        update_post_meta($post->ID, "abbreviation", $_POST["fed_abbreviation"]);
        update_post_meta($post->ID, "founded", $_POST["fed_founddate"]);
        update_post_meta($post->ID, "closed", $_POST["fed_closedate"]);
        update_post_meta($post->ID, "owner", $_POST["fed_owner"]);
    }


}
endif;

好的,经过反复试验和搜索谷歌,我能够完成这项工作。

首先,因为在 class 中,add_meta_box 中的回调需要 array ($this, <cb>) 格式,而不仅仅是原始字符串。

其次,register_post_type 的参数没有使用 add_meta_boxes 操作回调,而是有自己的选项,我这样使用:'register_meta_box_cb' => array( $this, 'initialize_federation_post_type')

因此,在让它工作并添加一些代码以使字段在视图模式下显示之后,文件如下所示:

<?php
// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) exit;
if ( ! class_exists( 'Wrestleefedmanager_Federation' ) ) :
class Wrestleefedmanager_Federation {

    /**
     * Constructor
     */
    public function __construct() {
        // Hooking up our function to theme setup
        add_action( 'init',             array( $this, 'create_federation_post_type' ) ); 
        //add_action( 'add_meta_boxes',     array( $this, 'initialize_federation_post_type') );
        add_action( 'save_post',        array( $this, 'save_fed') );

        add_filter ('template_include', array($this, 'display_federation_template' ) );
    }

    // Our custom post type function
    function create_federation_post_type() {

     $fedlabels = array(
        'name'                => _x( 'Federations', 'Post Type General Name'),
        'singular_name'       => _x( 'Federation', 'Post Type Singular Name'),
        'menu_name'           => __( 'Federations'),
        'parent_item_colon'   => __( 'Parent Fed'),
        'all_items'           => __( 'All Feds'),
        'view_item'           => __( 'View Fed'),
        'add_new_item'        => __( 'Add New Fed'),
        'add_new'             => __( 'Add New'),
        'edit_item'           => __( 'Edit Fed'),
        'update_item'         => __( 'Update Fed'),
        'search_items'        => __( 'Search Feds'),
        'not_found'           => __( 'Not Found'),
        'not_found_in_trash'  => __( 'Not found in Trash'),
    );

    $fedargs = array(
        'label'               => __( 'Federations' ),
        'description'         => __( 'Wrestling Companies' ),
        'labels'              => $fedlabels,
        // Features this CPT supports in Post Editor
        'supports'            => array( 'title', 'editor', 'author', ),
        // You can associate this CPT with a taxonomy or custom taxonomy. 
        //'taxonomies'          => array( 'genres' ),
        /* A hierarchical CPT is like Pages and can have
        * Parent and child items. A non-hierarchical CPT
        * is like Posts.
        */ 
        'hierarchical'        => true,
        'public'              => true,
        'show_ui'             => true,
        'show_in_menu'        => true,
        'show_in_nav_menus'   => true,
        'show_in_admin_bar'   => true,
        'menu_position'       => 17,
        'can_export'          => true,
        'has_archive'         => true,
        'exclude_from_search' => false,
        'publicly_queryable'  => true,
        'capability_type'     => 'page',
        'register_meta_box_cb' => array( $this, 'initialize_federation_post_type'),
    );

        register_post_type( 'feds', $fedargs);
    }


    function initialize_federation_post_type() {
        /*
        add_meta_box( string $id, string $title, callable $callback, string|array|WP_Screen $screen = null, 
                      string $context = 'advanced', string $priority = 'default', array $callback_args = null )*/
        add_meta_box("abbreviation", "Abbreviation", array( $this, 'fed_abbr'), "feds", "normal", "low");
        add_meta_box("founded", "Founded", array( $this, 'fed_founded'), "feds", "side", "low");
        add_meta_box("closed", "Closed", array( $this, 'fed_closed'), "feds", "side", "low");
        add_meta_box("parentfed", "Parent Federation", array( $this, 'fed_parent'), "feds", "normal", "low");
        add_meta_box("logo", "Logo", array( $this, 'fed_logo'), "feds", "normal", "low");
        add_meta_box("owner", "Owner", array( $this, 'fed_owner'), "feds", "side", "low");      
    }

    function fed_abbr(){
        global $post;
        $custom = get_post_custom($post->ID);
        $abbr = $custom["abbreviation"][0];
        ?>
        <label>Abbr:</label>
        <input name="fed_abbreviation" type="text" value="<?php echo $abbr; ?>" />
        <?php
        }

    function fed_founded(){
        global $post;
        $custom = get_post_custom($post->ID);
        $founded = $custom["founded"][0];
        ?>
        <label>Founded:</label>
        <input name="fed_founddate" value="<?php echo $founded; ?>" />
        <?php
    }

    function fed_closed(){
        global $post;
        $custom = get_post_custom($post->ID);
        $closed = $custom["closed"][0];
        ?>
        <label>Closed:</label>
        <input name="fed_closedate" value="<?php echo $closed; ?>" />
        <?php
    }


    function fed_parent(){
    }

    function fed_logo(){
    }

    function fed_owner(){
        global $post;
        $custom = get_post_custom($post->ID);
        $owner = $custom["owner"][0];
        ?>
        <label>Owner:</label>
        <input name="fed_owner" value="<?php echo $owner; ?>" />
        <?php
    }

    function save_fed(){
        global $post;

        update_post_meta($post->ID, "abbreviation", $_POST["fed_abbreviation"]);
        update_post_meta($post->ID, "founded", $_POST["fed_founddate"]);
        update_post_meta($post->ID, "closed", $_POST["fed_closedate"]);
        update_post_meta($post->ID, "owner", $_POST["fed_owner"]);
    }

    function display_federation_template ($template_path) {
        if ( get_post_type() == 'feds' ) {
        if ( is_single() ) {
            // checks if the file exists in the theme first,
            // otherwise serve the file from the plugin
            if ( $theme_file = locate_template( array ( 'single-feds.php' ) ) ) {
                $template_path = $theme_file;
            } else {
                $template_path = plugin_dir_path( __FILE__ ) . '/single-feds.php';
            }
        }
    }
    return $template_path;
    }

}
endif;