Php Can';不要让WordPress钩子在嵌入式类中触发

Php Can';不要让WordPress钩子在嵌入式类中触发,php,wordpress,Php,Wordpress,我正在尝试用一些面向对象的方法构建一些很好的metabox功能 我有一个主要的DazSEO类,其中包含一个Metabox类 当我在metabox类中设置WordPress save data连接时,它们不会启动,但当我从根类中设置它们时,它们会启动 在嵌入式类中使用钩子是否与WordPress钩子系统不兼容 如果有任何帮助,我将不胜感激,因为我花了很多时间试图弄清楚这里的问题是什么,我想这是wp引擎的一些对象范围问题,但我不相信。 Dazzo类{ 公共静态$plugins=array() 但这样

我正在尝试用一些面向对象的方法构建一些很好的metabox功能

我有一个主要的DazSEO类,其中包含一个Metabox类

当我在metabox类中设置WordPress save data连接时,它们不会启动,但当我从根类中设置它们时,它们会启动

在嵌入式类中使用钩子是否与WordPress钩子系统不兼容

如果有任何帮助,我将不胜感激,因为我花了很多时间试图弄清楚这里的问题是什么,我想这是wp引擎的一些对象范围问题,但我不相信。 Dazzo类{ 公共静态$plugins=array()

但这样的设计很凌乱

这个插件是这样初始化的

<form name="edittag" id="edittag" method="post" action="edit-tags.php" ...>

如果
$pagenow
是一个,那么这些可能会回答以下问题:(下面提到的PHP文件保存在
wp admin
中)

  • 当您访问
    term.php
    (即分类术语编辑)页面时,
    $\u-GET['taxonomy']
    $\u-GET['tag\u-ID']
    默认设置/可用(WordPress要求您确定要编辑的术语)。因此
    isset($\u-GET['taxonomy'])
    的计算结果为
    true

  • 但是,在您的
    TermMetabox
    类构造函数中,您正在将
    TermMetabox::onTermSave()
    挂接到
    edit_terms
    操作,该操作(默认情况下)不会在
    term.php
    页面上触发

  • term.php
    上的分类法编辑表单来自
    edittagform.php
    ,其中开头的
    标签如下所示:

    <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
    上,如果操作是
    editedtag
    ,将被调用,并且您最终将返回到
    term.php
    。如果您还不知道,
    wp\u update\u term()
    操作

  • 因此,对于您现有的代码,您可以像这样修复它,我正在检查
    $pagenow
    是否为
    edit tags.php
    ,并且我使用
    $\u POST
    而不是
    $\u GET

    public function adminInit() {
        add_action( 'load-edit-tags.php', array( $this, 'setupMetaBox' ) );
    }
    
    或者,您可以使用
    load edit tags.php
    操作来代替
    $pagenow====“edit tags.php”
    检查,如下所示:

    • dazzeo::adminInit()

    • dazzeo::setupMetaBox()


    setupMetaBox()中
    $pagenow
    是什么,以及
    $pagenow==='term.php'
    可能从未计算为
    true
    ,因此您的
    TermMetabox
    类没有被实例化。感谢您的想法。是的,该语句确实计算为true,我在那里有一些调试代码,我删除了这些代码以保持示例稳定谢谢,我甚至没有考虑过表单提交的中间步骤。我的Meta Objax类设计在我实例化WordPress API以使它工作的时候不起作用。所以我制作了一个SaveDATA类,并将数据保存与之分离。现在我可以继续工作了。这真是太棒了,我很高兴C。我会帮你的。:)顺便说一句,当我说“term.php上的分类法编辑表单”时,我实际上是指“term.php上的分类法术语编辑表单”。很抱歉。谢谢,据我所知,分类法就像术语“分组”的类别它们作为普通的wp类别对帖子进行分组,但WordPress核心中有两个单独的API。是的,您对分组的看法是正确的,在分类法中(例如,标准/内置的帖子类别和标记),您可以有一对多的组,WordPress将其称为“术语”。然而,尽管帖子类别和标签具有特殊/内置的包装函数,但这些函数实际上使用相同的API,例如
    get_category()
    get_tag()
    ,它们都使用
    get_term()
    -您可以在
    wp includes/taxonomy.php
    中找到此函数和其他分类法/术语函数。如果需要有关分类法的更多信息,请参阅。:)
    <form name="edittag" id="edittag" method="post" action="edit-tags.php" ...>
    
    <input type="hidden" name="action" value="editedtag"/> <- the action
    <input type="hidden" name="tag_ID" ...>
    <input type="hidden" name="taxonomy" ...>
    
    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'] );
    
                ...
            }
        }
    }
    
    public function adminInit() {
        add_action( 'load-edit-tags.php', array( $this, 'setupMetaBox' ) );
    }
    
    public function setupMetaBox() {
        if( isset($_POST['taxonomy']) ) {
            ...
    
            require_once('admin\metabox\TermMetaBox.php');
            $this->metaBox = new TermMetabox( $_POST['taxonomy'] );
    
            ...
        }
    }