类属性似乎已失去作用域,是否附加到SAVE_POST操作?

时间:2015-03-12 作者:AliBaba

这可能更适合StackExchange,因此如果您认为这是引导我的问题的正确位置,请让我知道:)。

我有一个属性为的类save_list. 这是一个二维数组,其值的格式为array(\'meta_key\' => $meta_key). 该类实例化一次,如下所示$metabox 在我的functions.php 文件,然后$metabox 变量用于保持对对象的引用。

我的问题是save_post 动作,物体似乎失去了save_list 属性,因为尝试转储它时会显示一个没有值的数组。

class Metabox
{
    public function __construct() {
        $this->save_list = array();
        add_action(\'save_post\', array($this, \'save_postmeta\'));
    }

    public function text($meta_key, $atts) {
        global $post;

        $this->save_list[] = array(\'meta_key\' => $meta_key);
        $default_atts = array(
            \'value\' => false,
            \'class\' => \'\'
        );
        $atts = $atts + $default_atts;
        $atts[\'value\'] = (!$atts[\'value\']) ? get_post_meta($post->ID, $meta_key, true) : $atts[\'value\'];

        extract($atts);
        print_r($this->save_list);
        ?>
        <input name="<?php echo $meta_key; ?>" type="text" class="<?php echo $class; ?>" value="<?php echo $value; ?>">
        <?php
    }

    public function save_postmeta($post_id) {
        $save_list = $this->save_list;
        foreach ($save_list as $item) {
            $meta_key = $item[\'meta_key\'];
            update_post_meta($post_id, $meta_key, $_POST[$meta_key]);
        }
        exit(var_dump($save_list));
    }
}

然而print_r($this->save_list)text() 方法工作正常,并相应地保持作用域,例如,它的每次调用都会增加save_list 当被那个电话甩了的时候。

我想知道这是否与save_post 行动有效,或者我可能非常累,犯了一个简单的、平凡的错误。

任何帮助都将不胜感激!

(如果您认为这有助于了解背景functions.php 文件)

$metabox = new Metabox;
function add_input_metabox() {
    add_meta_box(\'text1\', \'text1\', \'input_metabox_callback\', \'eating\', \'side\');
    add_meta_box(\'text2\', \'text2\', \'input_metabox_callback_\', \'eating\', \'side\');
}
add_action(\'add_meta_boxes\', \'add_input_metabox\');

function input_metabox_callback() {
    global $metabox;
    $metabox->text(\'text3\', array(\'class\' => \'widefat\'));
    $metabox->text(\'text4\', array(\'class\' => \'widefat\'));
}

function input_metabox_callback_() {
    global $metabox;
    $metabox->text(\'text1\', array(\'class\' => \'widefat\'));
    $metabox->text(\'text2\', array(\'class\' => \'widefat\'));
}

1 个回复
SO网友:Pieter Goosen

$metabox 不在全局范围内,这就是您的两个功能不工作的原因。如果启用调试,您将收到大量关于使用的调试通知错误消息$metabox. 只需执行以下操作

$metabox = new Metabox;
不会使变量成为全局变量。它需要被定义为一个全局。但在继续执行此操作之前,请考虑建议不要使用全局范围,特别是使用易于重新创建的变量,如$metabox.

想想看,有两个插件使用相同的变量$metabox. 这很有效。现在,您定义$metabox 作为一个全球性的主题。这将更改的所有实例的值$metabox 这会导致您的插件使用错误的数据,并且在应该做的事情上失败。

正确的解决方案

为自己创建一个可以重用的“全局函数”,例如

function metabox_global_function()
{
    $metabox = new Metabox;
    return $metabox;
}
然后您可以使用metabox_global_function(); 任何功能中的任何位置。

结束

相关推荐

将显示名称设置为名字和姓氏(phpmyadmin SQL查询)

我正在尝试将所有用户的显示名称更改为他们的名字和姓氏。我已经研究了许多插件,并编写了自己的PHP来尝试实现这一点,但该网站有50000多名注册用户(我可以想象大多数是来自我的客户以前网站的垃圾邮件),但正因为如此,PHP挂起了,在放弃之前只有大约2000个。因此,我认为下一个最好的方法是从PHPmyAdmin中编写一个SQL语句来执行该任务,然而纯SQL让我很困惑,到目前为止,我所能做的就是将显示名设置为用户的名字,我不确定如何获得姓氏。这是我使用的语句。UPDATE wp_users, wp_userm