Conditional Meta Boxes

时间:2012-03-28 作者:Alex Mangini

我正在WordPress中创建多个元框,我希望用户能够打开或关闭某些框。

因此,他们单击一个单选按钮(在一个单独的元框中),更新选项,然后会出现附加到该单选值的另一个元框。

所以它基本上从一个元框(选择器框)变成了两个元框(选择器框和他们刚刚选择的新框)。

在我的代码中,可以通过如下方式创建元框(这是一个单选框,用户可以在其中选择其他元框来打开/关闭):

// Create meta box that gives user ability to select additional meta box,
   which will then show upon saving the post

$meta_boxes[] = array(
    \'id\' => \'meta_box_id\',
    \'title\' => \'Box title\',
    \'pages\' => array(\'page\'),
    \'context\' => \'side\',
    \'priority\' => \'low\',
    \'fields\' => array(
        array(
            \'name\' => \'Select:\',
            \'id\' => $prefix . \'meta_box_id\',
            \'type\' => \'radio\',
            \'options\' => array(
                array(\'name\' => \'Value 1\', \'value\' => \'value_one\'),
                array(\'name\' => \'Value 2\', \'value\' => \'value_two\'),
            )
        )
    )
);
以下是WordPress中的外观:

http://i.stack.imgur.com/xR69s.png

这是另一个元框,一旦在上面的元框中选中(假设选择了value\\u one),它将出现在post屏幕上:

// This meta box will only show if \'value_one\' is selected from 
the radio box above

$meta_boxes[] = array(
    \'id\' => \'standard_lead\',
    \'title\' => \'Standard Lead\',
    \'pages\' => array(\'page\'),
    \'context\' => \'normal\',
    \'priority\' => \'high\',
    \'lead\' => \'value_one\',
    \'fields\' => array(
        array(
            \'type\' => \'text\',
            \'id\' => $prefix . \'standard_title\',
            \'name\' => \'Lead Title\',
            \'desc\' => \'The title of your Standard Lead\',
            \'width\' => \'100\'
        ),
        array(
            \'type\' => \'textarea\',
            \'id\' => $prefix . \'standard_content\',
            \'name\' => \'Lead Content\',
            \'desc\' => \'The content of your Standard Lead (you can use HTML)\',
            \'width\' => \'100\'
        )
    )
);
该代码的重要部分是:

\'lead\' => \'value_one\',
我的计划是让[\'lead\']值(来自上面的元框代码)与[\'value\']值(来自无线电元框)匹配,这样它们就可以连接,然后用IF语句进行测试,确保它们等于相同的东西,然后仅当它们都等于value\\u one时才显示。

下面的功能实际上是将元框添加到WordPress中。在该函数中,我尝试创建此IF语句以将这两个语句匹配在一起:

if($this->_meta_box[\'value\'] == $this->_meta_box[\'lead\'])
。。。但它不起作用,我不知道如何定位[\'value\',因为它嵌套在多个数组中(或者我认为这是问题所在)。

以下是完整功能:

function add_meta_boxes()
{
    $this->_meta_box[\'context\'] = empty($this->_meta_box[\'context\']) ? \'normal\' : $this->_meta_box[\'context\'];
    $this->_meta_box[\'priority\'] = empty($this->_meta_box[\'priority\']) ? \'high\' : $this->_meta_box[\'priority\'];

    foreach($this->_meta_box[\'pages\'] as $page)
    {
        if($this->_meta_box[\'value\'] == $this->_meta_box[\'lead\'])
        {
            // adds meta box to WP
            add_meta_box($this->_meta_box[\'id\'], $this->_meta_box[\'title\'], array(&$this, \'show_meta_boxes\'), $page, $this->_meta_box[\'context\'], $this->_meta_box[\'priority\']);
        }
    }
}
希望我能很好地解释问题所在。我环顾四周,尝试了一些东西,但我不确定这是否是我自己能解决的问题。在这方面的任何投入,或是朝着正确的方向推动,都将是巨大的帮助。非常感谢。

PS:我也在考虑通过JS来实现这一点,但不确定从哪里开始。

2 个回复
最合适的回答,由SO网友:brasofilo 整理而成

这可以通过jQuery轻松解决,并且它具有实时反馈的优点。

我已经在几个问题中讨论了这种情况,因此,我建议您不要遍历代码并编写适当的函数,而是遍历我的代码并根据需要进行调整。

SO网友:Tan Nguyen

我尝试过jQuery,但我的代码很难维护,无法重用,所以我花了几个小时寻找插件并找到了元框条件逻辑。

对于元框,如果使用元框条件逻辑,只需将代码更新为:

$meta_boxes[] = array(
    \'id\' => \'standard_lead\',
    \'title\' => \'Standard Lead\',
    \'pages\' => array(\'page\'),
    \'context\' => \'normal\',
    \'priority\' => \'high\',
    \'show\' => array(\'lead\', \'value_one\'),
    \'fields\' => array(
        array(
            \'type\' => \'text\',
            \'id\' => $prefix . \'standard_title\',
            \'name\' => \'Lead Title\',
            \'desc\' => \'The title of your Standard Lead\',
            \'width\' => \'100\'
        ),
        array(
            \'type\' => \'textarea\',
            \'id\' => $prefix . \'standard_content\',
            \'name\' => \'Lead Content\',
            \'desc\' => \'The content of your Standard Lead (you can use HTML)\',
            \'width\' => \'100\'
        )
    )
);
这是插件链接:https://metabox.io/plugins/meta-box-conditional-logic/

结束

相关推荐

Metabox doesn't retain values

我在函数中有这个代码。php,以便在后端显示元框。问题是,在我将网站从子域(dev)移动到根域之前,这个功能一直正常运行,现在即使元盒出现在后端,它也不再保留这些值。<?php define(\'MY_WORDPRESS_FOLDER\',$_SERVER[\'DOCUMENT_ROOT\']); define(\'MY_THEME_FOLDER\',str_replace(\'\\\\\',\'/\',dirname(__FILE__))); define(\'MY_THE