我构建了一个简单的插件,它有一个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();
}
最合适的回答,由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
, 因为在多站点上它们是无用的),或者当您知道需要更改重写规则时。不要在任何常规触发的挂钩上执行此操作