我正在尝试通过oop构建一些不错的metabox功能。
我有我的主要DazSEO类,其中包含一个Metabox类。
当我在metabox类中设置WordPress保存数据时,它们不会触发,但是当我从根类中设置它们时,它们会触发。
是否在嵌入式类内部使用了与WordPress钩子系统不兼容的钩子?
这里我将花费很多时间来尝试找出问题所在,我想这是wp引擎的一些对象范围问题,但我并不相信。 DazSEO类{ 公共静态$ plugins = array();
public $metaBox;
public function __construct() {
add_action('admin_init', array($this, 'adminInit') );
add_action('init', array($this, 'init'));
}
public function adminInit() {
$this->setupMetaBox();
}
public function setupMetaBox() {
if( $pagenow === 'term.php' ) { // returns true
if( isset($_GET['taxonomy']) ) {
$term = get_term( $_GET['tag_ID'], $_GET['taxonomy'], OBJECT );
require_once('admin\metabox\TermMetaBox.php');
$this->metaBox = new TermMetabox( $_GET['taxonomy'] ); // confirmed this does fire
DazSEO::$mode = 'term';
DazSEO::$wpID = $_GET['tag_ID'];
DazSEO::$typeName = $_GET['taxonomy'];
}
}
}
}
class TermMetabox extends MetaBoxBase {
private $_taxonomy;
public function __construct(string $taxonomy) {
if( strlen($taxonomy) === 0 ) { echo 'no taxonomy passed'; exit(); }
$this->_taxonomy = $taxonomy;
add_action( $this->_taxonomy . '_edit_form', array($this, 'buildMetaBox') );
add_action('edit_terms', array($this, 'onTermSave')); // SETUP TERM SAVE
}
public function loadHooks() {
}
// NOT BEING CALLED
public function onTermSave(int $term_id) {
echo '<pre>' . print_r($_REQUEST, 1) . '</pre>'; exit();
if( $this->onSaveChecks($term_id) ) {
return;
}
foreach(DazSEO::$plugins as $plugin) {
$plugin->onTermSave($term_id, $_REQUEST);
}
}
}
TermMetabox :: onTermSave永远不会被调用
如果这是从根类(DazSEO)中调用的,那么我也将save方法移到了那里...
add_action('edit_terms', array($this, 'onTermSave'));
但是这样的设计很混乱。
此插件的初始化方式如下...
$dazSEO = new DazSEO();
$wpCleanHeader = new RemoveWPHeaderJunk();
$dazSEO->loadPlugin($wpCleanHeader);
答案 0 :(得分:1)
如果$pagenow
是global WordPress admin variable,则它们可能会回答以下问题:(以下提到的PHP文件保存在wp-admin
中)
当您访问term.php
(即,分类术语编辑)页面时,$_GET['taxonomy']
和$_GET['tag_ID']
默认情况下已设置/可用(WordPress需要确定这些术语)您正在编辑)。因此,isset($_GET['taxonomy'])
的值为true
。
但是,在您的TermMetabox
类构造函数中,您将TermMetabox::onTermSave()
钩接到edit_terms
操作上(同样,默认情况下,该操作未在{{1}上触发) }页面。
term.php
上的分类法编辑表单来自term.php
,其中edit-tag-form.php
开头的标签如下:
<form>
,它包含以下隐藏的<form name="edittag" id="edittag" method="post" action="edit-tags.php" ...>
字段:
input
如您所见,表单将使用<input type="hidden" name="action" value="editedtag"/> <- the action
<input type="hidden" name="tag_ID" ...>
<input type="hidden" name="taxonomy" ...>
方法通过POST
动作向edit-tags.php
提交表单。
在editedtag
上,如果操作为edit-tags.php
,则会调用wp_update_term()
,最终您将回到editedtag
。而且,如果您还不知道,请执行term.php
操作wp_update_term()
fires。
因此,使用您现有的代码,您可以像这样修复它,即检查edit_terms
是否为$pagenow
,并且使用edit-tags.php
而不是$_POST
:
$_GET
或者,您可以使用public function setupMetaBox() {
// global $pagenow; // I used this when testing.
if( $pagenow === 'edit-tags.php' ) {
if( isset($_POST['taxonomy']) ) {
...
require_once('admin\metabox\TermMetaBox.php');
$this->metaBox = new TermMetabox( $_POST['taxonomy'] );
...
}
}
}
操作来代替$pagenow === 'edit-tags.php'
检查,就像这样:
load-edit-tags.php
:
DazSEO::adminInit()
public function adminInit() {
add_action( 'load-edit-tags.php', array( $this, 'setupMetaBox' ) );
}
:
DazSEO::setupMetaBox()