首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态创建Wordpress Metabox

动态创建Wordpress Metabox
EN

Stack Overflow用户
提问于 2017-01-11 14:13:13
回答 2查看 2.2K关注 0票数 1

我已经搜索了几天,但没有发现任何信息,说明如何允许管理用户通过单击按钮复制自定义post类型的metabox。

代码语言:javascript
复制
    add_meta_box(  
    'Presentation', // $id  
    'Presentation', // $title   
    'show_custom_presentation_meta_box', // $callback  
    'presentations', // $page  
    'normal', // $context  
    'high', // $priority
     $custom_presenter_meta_fields); // $callback_args  

考虑到add_meta_box函数是在add_meta_boxes操作中调用的,我不确定是否可以存储允许循环在用户保存带有其他元参数的post之后添加正确数量的元数据的变量。

我已经实现了动态字段,当用户单击按钮时,会在更新post时添加并保存额外的文本字段。

我不想重复在metabox中的字段。当单击+时,我希望创建整个metabox的副本。

一个正确方向的观点将是非常感谢的。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-17 11:46:58

我发现创建动态metabox的第一步之一是创建您希望在单击按钮时重复的额外的metabox。

在单独的metabox中,我们需要一个字段,该字段将包含所需的动态metabox的计数。*注意,该字段可以隐藏或可见。

代码语言:javascript
复制
global $presenter_count;

add_meta_box(  
    'Meetings', // $id  
    'Meetings Info', // $title   
    'show_custom_meetings_meta_box', // $callback  
    'meetings', // $page  
    'normal', // $context  
    'high', // $priority
     $custom_meetings_meta_fields); // $callback_args          

$c = 0;
$count = get_post_meta($post_id, 'meetings_presenter_count', true);

while ( $c < $count) {

    $presenter_count = 0;

    add_meta_box(  
        'Presentation'.$c, // $id  
        'Presentation '.++$c, // $title   
        'show_custom_meetings_meta_box', // $callback  
        'meetings', // $page  
        'normal', // $context  
        'low', // $priority
         $custom_meetings_presenter_meta_fields); // $callback_args  
}

在构建字段的回调函数中,我们要确保正在调用设置为$presenter_count的全局变量。

每次执行while循环时,根据演示文稿数量字段中的meta_value,演示者计数会增加,这将为我们的字段设置正确的数组。

代码语言:javascript
复制
// Callback args for metabox
$custom_meetings_presenter_meta_fields = array(  
        array(  
            'label' => 'Presenter\'s Name',
            'desc'  => 'The presenter\'s prefix and name',
            'id'    => $prefix.'name',
            'type'  => 'presenter_name'
        ));

// Callback function
    function show_custom_meetings_meta_box($post, $custom_meetings_field) {  
global $custom_meetings_meta_fields, $custom_meetings_presenter_meta_fields, $post, $presenter_count;
// Use nonce for verification 

echo '<input type="hidden" name="custom_meta_box_nonce" value="'.wp_create_nonce(basename(__FILE__)).'" />'; 
    // Begin the field table and loop 
    echo '<table class="form-table">';  
    foreach ($custom_meetings_field['args'] as $field) {  
        // get value of this field if it exists for this post  
        $meta = get_post_meta($post->ID, $field['id'], true);  
        // begin a table row with  
        echo '<tr> 
                <th><label for="'.$field['id'].'">'.$field['label'].'</label></th> 
                <td>';  
                switch($field['type']) {  
                    // Presenter Name
                    case 'presenter_name':  

                        $c = $presenter_count;

                        echo '<input type="text" name="'.$field['id'].'['.$c.']" id="'.$field['id'].'-'.$c.'" value="'.$meta[$c].'" size="30" /> 
                            <br /><span class="description">'.$field['desc'].'</span>';  

                    break; 
                } //end switch  
        echo '</td></tr>';  

        }

    } // end foreach  
    echo '</table>'; // end table  
}  

我们还需要为用户设置一个按钮,以便在命令中添加metabox。

按钮后面的代码:

代码语言:javascript
复制
jQuery('.add-presentation').on('click', function(){
    var c  = jQuery('#meetings_presenter_count').val(); // get presenter count
    var pc = 0;
    if ( c != '' ) {
        pc = c + 1;
        // write a condition that allows for one presenter to exist
        jQuery('#Presentation'+pc).after('Insert Metabox');
        jQuery('#meetings_presenter_count').val(pc); // Increment presenter count
    }else{ // If no presenter box exists make count = 1
        jQuery('#meetings_presenter_count').val('1');
        jQuery('#Meetings').after('Insert Metabox');
    }

});
票数 1
EN

Stack Overflow用户

发布于 2017-01-11 15:11:15

我不能在这里提供一个完整的答案,但可以给出指点。

要复制metabox,您需要添加javascript。

  1. 在所有输入字段中,请确保name=""字段的前缀类似于name="1_text" name="1_firstname"
  2. 使用jquery选择第一个metabox。
  3. 复制它。使用+1 name="2_text" name="2_firstname"更改名称属性,同时在示例'Presentation', // $id中将整个框的ID提高
  4. 保存时,检测这些不同的名称,并按您的意愿保存它们。
  5. 在加载编辑页面时,检测框数,并使用正确的数字对add_meta_box进行预测。

编辑。还可以使用数组符号来完成第1点:

代码语言:javascript
复制
<input type="text" name="text[1]" />
<input type="text" name="firstname[1]" />

这在存钱时更容易。而且在装货时可能更容易填充。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41593165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档