自定义POST类型在WordPress 5更新后突然停止工作

时间:2019-02-18 作者:jogesh_pi

我构建了一个简单的插件,它有一个CPT和一个metabox部分,可以从管理员那里收集额外的信息。它在旧版本中运行良好,但当我刚刚将其更新到WordPress 5时,它停止了工作。

我试着弄清楚,当我对元框输入字段进行注释时,我的CPT工作正常。否则,我会出现以下错误。

检测到post类型不匹配。

如果我错过了什么,我在网上找不到任何帮助。

以下是我的metabox代码:

// add_action(\'add_meta_boxes\', array($this, \'answer_meta_action\'));
add_action(\'admin_menu\', array($this, \'answer_meta_action\'));

public function answer_meta_action() {
    add_meta_box( 
        \'ttl-to-edit\', 
        __(\'Edit In Response To\', \'ttl-p\'), 
        array($this, \'response_to_edit\'), 
        \'ttl\', // Custom Post Type 
        \'normal\', 
        \'high\'
    );
}

public function response_to_edit()
{
    $post_types = get_post_types();
    ?>
    <style>.clearfix {overflow: auto;}.clearfix::after {content: "";clear: both;display: table;}</style>
    <span class="tsqa_response_to_action-error" style="color:#ff0000;"></span>
    <div id="tsqa_response_to_action">
        <div style="margin: 10px 0 10px 0;" class="clearfix">
            <div class="box-section" style="width:250px;float:left;">
                <strong><label>Post Type:</label></strong> <br>
                <select name="post_type" style="width: 200px;margin-right:20px;">
                    <option value="">- Select -</option>
                    <?php foreach( $post_types as $post_type ): ?>
                        <option value="<?php echo $post_type ?>"><?php echo $post_type ?></option>
                    <?php endforeach; ?>
                </select>
            </div>
        </div>
    </div>
    <?php
}

CPT Register:

add_action(\'init\', array($this, \'init\'));
public function init() {


    $labels = array(
        \'name\' => _x( \'Question\', \'Post Type General Name\', \'\' ),
        ....
    );



    $args = array(
        \'labels\'             => $labels,
        \'description\'        => __( \'Questions\', \'\' ),
        \'public\'             => false,
        \'publicly_queryable\' => false,
        \'show_ui\'            => true,
        \'show_in_menu\'       => true,
        \'menu_position\'      => 5,
        \'menu_icon\'          => \'dashicons-format-status\',
        \'query_var\'          => true,
        \'rewrite\'            => array(\'slug\'=>\'question\'),
        \'capability_type\'    => \'post\',
        \'capabilities\'       => array(
            \'create_posts\'       => \'do_not_allow\', 
        ), 
        \'map_meta_cap\'       => true,
        \'has_archive\'        => \'questions\',
        \'hierarchical\'       => false,
        \'menu_position\'      => null,
        \'supports\'           => array( \'title\', \'editor\' ), 
    );


    register_post_type( \'ttl\', $args );
    flush_rewrite_rules();
}

1 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

好的,我必须调试它并且。。。您的代码一切正常。几乎所有东西。

单击“发布”按钮时,会出现以下错误:

检测到post类型不匹配

如果你看看你的表格,你就会明白为什么。。。

在表单中,您有以下字段:

<select name="post_type" style="width: 200px;margin-right:20px;">
post_type 名称已用于不同目的。因此,您的字段会覆盖它并导致错误。

在创建自己的元框时,应该避免使用一些名称。最好的办法是在字段前面加上前缀,以确保不会引起任何冲突。

所以如果你加上ttl-to-edit meta box,我会调用所有字段ttl-to-edit-post_type 或者类似的东西。有时把它们放在一个数组中很方便ttl_to_edit[post_type].

附言:你不应该flush_rewrite_rules 在init hook中,它将导致重大性能问题。

刷新重写规则是一项昂贵的操作,有教程和示例建议在“init”挂钩上执行它。这是不好的做法。它应该在“shutdown”挂钩上执行,或者在插件/主题(de)激活时执行activation 或deactivation, 因为在多站点上它们是无用的),或者当您知道需要更改重写规则时。不要在任何常规触发的挂钩上执行此操作

相关推荐

Starting with tabbed metabox

我的插件需要一个带选项卡的metabox。实际上,它们是5个代谢箱,每个都在一个选项卡中。我找到了以下脚本:https://speckyboy.com/10-simple-code-snippets-creating-beautiful-tabs/哪一个最适合在元框中使用?最好只有CSS?JS必须注册?我想开始测试这些脚本,但想知道从哪里开始。非常感谢。