无法让WordPress钩子在嵌入式类中触发

时间:2018-11-04 08:37:36

标签: php wordpress

我正在尝试通过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);

1 个答案:

答案 0 :(得分:1)

如果$pagenowglobal WordPress admin variable,则它们可能会回答以下问题:(以下提到的PHP文件保存在wp-admin中)

  1. 当您访问term.php(即,分类术语编辑)页面时,$_GET['taxonomy']$_GET['tag_ID']默认情况下已设置/可用(WordPress需要确定这些术语)您正在编辑)。因此,isset($_GET['taxonomy'])的值为true

  2. 但是,在您的TermMetabox类构造函数中,您将TermMetabox::onTermSave()钩接到edit_terms操作上(同样,默认情况下,该操作未在{{1}上触发) }页面。

  3. 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提交表单。

  4. 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()