2016-12-11 33 views
7

我正在嘗試爲我正在處理的主題的自定義小部件中的一組預定義標籤創建動態輸入字段。我想實現這樣的事情:WordPress小部件中的動態輸入字段

CourseName   FieldONE    FieldTWO 
------------------------------------------------------------- 
Chemistry   Sprint 2015   Summer 2015 (-) 
        Spring 2016   Summer 2016 (-) 
                 (+) 
------------------------------------------------------------- 
Biology    Sprint 2015   Summer 2015 (-) 
        Fall 2015   Winter 2015 (-) 
        Spring 2016   Summer 2016 (-) 
                 (+) 
-------------------------------------------------------------- 
Math     Fall 2015   Winter 2015 (-) 
                 (+) 
-------------------------------------------------------------- 
Physics    Fall 2015   Winter 2015 (-) 
                 (+) 
-------------------------------------------------------------- 

其中CourseName是化學,生物,數學和物理(僅限於預先定義的標籤,4 max)和FieldONEFieldTWO是動態的投入,我想輸入每個不同的術語課程。

因此,如果我點擊(+),則會爲該標籤創建兩個字段FieldOneFieldTWO。如果我點擊(-),這兩個字段都將被刪除。

我試圖用this Gist它創建類似的動態輸入作爲metabox,到目前爲止,我得到這個:

<?php 
/* 
Plugin Name: Dynamic Fields Widget 
Description: Dynamic Fields 
Version: 0.0 
Author: Rain Man 
*/ 
// Creating the widget 
class dynamic_widget extends WP_Widget 
{ 
    public function __construct() 
    { 
     parent::__construct(
      // Base ID of your widget 
      'dynamic_widget', 

      // Widget name will appear in UI 
      __('Dynamic Widget', 'dynamic_widget_domain'), 

      // Widget description 
      array('description' => __('Sample Dynamic Widget', 'dynamic_widget_domain')) 
     ); 
    } 

// widget 
public function widget($args, $instance) 
{ 
    $title = apply_filters('widget_title', $instance['title']); 
// This is where you run the code and display the output 
echo __('Hello, World!', 'dynamic_widget_domain'); 
    echo $args['after_widget']; 
} 

// form 
public function form($instance) 
{ 
    if (isset($instance[ 'title' ])) { 
     $title = $instance[ 'title' ]; 
    } else { 
     $title = __('New title', 'dynamic_widget_domain'); 
    } 
// Widget admin form 

    $repeatable_fields = array(); 
    $courses = array(
     'Chemistry' => array(
     'coursecode' => 'Chemistry 2059', 
     'professor' => 'Dr. James Bond', 
    ), 
     'Biology' => array(
     'coursecode' => 'Biology 3029', 
     'professor' => 'Dr. James Bond', 
    ), 
     'Math' => array(
     'coursecode' => 'Math 2043', 
     'professor' => 'Dr. James Bond', 
    ), 
     'Physics' => array(
     'coursecode' => 'Physics 2075', 
     'professor' => 'Dr. James Bond', 
    ) 
    ); 
    ?> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> 

<script type="text/javascript"> 
jQuery(document).ready(function($){ 
    $('#add-row').on('click', function() { 
    var row = $('.empty-row.screen-reader-text').clone(true); 
    row.removeClass('empty-row screen-reader-text'); 
    row.insertBefore('#repeatable-fieldset-one tbody>tr:last'); 
    return false; 
    }); 

    $('.remove-row').on('click', function() { 
    $(this).parents('tr').remove(); 
    return false; 
    }); 
}); 
</script> 
<?php foreach ($courses as $course_key => $course_info) { ?> 
<label><?php echo $course_info['coursecode']; ?></label> 
<table id="repeatable-fieldset-one" width="100%"> 
<thead> 
    <tr> 
    <th width="40%">Fall Term</th> 
    <th width="40%">Winter Term</th> 
    <th width="8%"></th> 
    </tr> 
</thead> 
<tbody> 
<?php 

if ($repeatable_fields) : 

foreach ($repeatable_fields as $field) { 
    ?> 
<tr> 
    <td><input type="text" class="widefat" name="name[]" value="<?php if ($field['name'] != '') { 
    echo esc_attr($field['name']); 
} ?>" /></td> 

    <td> 
    </td> 

    <td><input type="text" class="widefat" name="url[]" value="<?php if ($field['url'] != '') { 
    echo esc_attr($field['url']); 
} else { 
    echo ''; 
} ?>" /></td> 

    <td><a class="button remove-row" href="#">Remove</a></td> 
    <td><a id="add-row" class="button" href="#">Add</a></td> 

</tr> 
<?php 

} else : 
// show a blank one 

?> 
<tr> 
    <td><input type="text" class="widefat" name="name[]" /></td> 


    <td><input type="text" class="widefat" name="url[]" value="" /></td> 

    <td><a class="button remove-row" href="#">Remove</a></td> 
    <td><a id="add-row" class="button" href="#">Add</a></td> 

</tr> 
<?php endif; ?> 
<? } ?> 


<!-- empty hidden one for jQuery --> 
<tr class="empty-row screen-reader-text"> 
    <td><input type="text" class="widefat" name="name[]" /></td> 

    <td><input type="text" class="widefat" name="url[]" value="" /></td> 

    <td><a class="button remove-row" href="#">Remove</a></td> 
    <td><a id="add-row" class="button" href="#">Add</a></td> 

</tr> 
</tbody> 
</table> 
</p> 
<?php 

} 

// update 
public function update($new_instance, $old_instance) 
{ 
    $instance = array(); 
    $instance['title'] = (!empty($new_instance['title'])) ? strip_tags($new_instance['title']) : ''; 

    return $instance; 
} 
} // Class dynamic_widget ends here 

// Register and load the widget 
function wpb_load_widget() 
{ 
    register_widget('dynamic_widget'); 
} 
add_action('widgets_init', 'wpb_load_widget'); 

這裏是截圖:

enter image description here

有很多現在的問題,首先JavaScript的「添加」按鈕不再起作用,我不知道如何保存數據以便以後訪問。

任何想法如何使標籤的動態輸入字段?它不必與我分享的要點中的代碼相似,但最好能讓我的修改正常工作。

+1

首先您要添加的jQuery(而不是正常),這通常是不需要在Wordpress中,並可能導致衝突頭痛 –

+0

@TimHallman是的,這只是爲了測試,JavaScript沒有工作,所以我測試它通過添加一個jQuery庫。 –

+0

嗨@RainMan你需要這個小部件在前端右側可見?並且這些字段應該收集用戶的數據並且可以被管理員用戶訪問,更正? –

回答

1
+1

我不想使用任何額外的插件 –

+0

@RainMan雖然我明白需要避免額外的插件,高級自定義字段是一個非常好,積極維護和一般偉大的插件。如果你想寫自定義字段,這是做到這一點的方法。它會減少創建新字段的時間和噸數,這對於自己來說通常是一種痛苦,而且對於我的目的而言,這對我所做的每個WordPress項目都是絕對必要的。我基本上拒絕沒有ACF的WordPress。 pro版本的開發許可證是一次性費用。通過避免使用這個插件,你會在腳下射擊自己。 – dave

0
 <?php 
     /* 
     Plugin Name: Dynamic Fields Widget 
     Description: Dynamic Fields 
     Version: 0.0 
     Author: Rain Man 
     */ 
     // Creating the widget 
     class dynamic_widget extends WP_Widget 
     { 
      public function __construct() 
      { 
       parent::__construct(
        'dynamic_widget', __('Dynamic Widget', 'dynamic_widget_domain'), 
        array('description' => __('Sample Dynamic Widget', 'dynamic_widget_domain')) 
       ); 
      } 

     // widget 
     public function widget($args, $instance) 
     { 
      $title = apply_filters('widget_title', $instance['title']); 
      // This is where you run the code and display the output 
      echo __('Hello, World!', 'dynamic_widget_domain'); 
      echo $args['after_widget']; 
     } 

     // form 
     public function form($instance) 
     { 
      if (isset($instance[ 'title' ])) { 
       $title = $instance[ 'title' ]; 
      } else { 
       $title = __('New title', 'dynamic_widget_domain'); 
      } 
     // Widget admin form 

      $repeatable_fields = array(); 
      $courses = array(
       'Chemistry' => array(
       'coursecode' => 'Chemistry 2059', 
       'professor' => 'Dr. James Bond', 
       'id' => 'test1', 
      ), 
       'Biology' => array(
       'coursecode' => 'Biology 3029', 
       'professor' => 'Dr. James Bond', 
        'id' => 'test2', 
      ), 
       'Math' => array(
       'coursecode' => 'Math 2043', 
        'id' => 'test3', 
      ), 
       'Physics' => array(
       'coursecode' => 'Physics 2075', 
       'id' => 'test4', 
      ) 
      ); 

     $Inc=1; 
     foreach ($courses as $course_key => $course_info) { 
      echo $Inc; 
      ?> 
     <label><?php echo $course_info['coursecode']; ?></label> 
     <table id="repeatable-fieldset-<?php echo $course_info['id']; ?>" width="100%" class="tableclass"> 
     <thead> 
      <tr> 
      <th width="40%">Fall Term</th> 
      <th width="40%">Winter Term</th> 
      <th width="8%"></th> 
      </tr> 
     </thead> 
     <tbody> 
     <?php 


      if ($repeatable_fields): 

       foreach ($repeatable_fields as $field) {  ?> 
        <tr> 
         <td><input type="text" class="widefat" name="name[]" value="<?php if ($field['name'] != '') { echo esc_attr($field['name']);} ?>" /></td> 
         <td></td> 
         <td><input type="text" class="widefat" name="url[]" value="<?php if ($field['url'] != '') { echo esc_attr($field['url']); } else { echo ''; } ?>" /></td> 
         <td><a class="button remove-row" href="#">Remove</a></td> 
         <td><a id="add-row" class="button addrowbtn" href="#">Add</a></td> 
        </tr> 
       <?php } 

     else: 
     // show a blank one 

     ?> 
     <tr> 
      <td><input type="text" class="widefat" name="name[]" /></td> 
      <td><input type="text" class="widefat" name="url[]" value="" /></td> 
      <td><a class="button remove-row" href="#">Remove</a></td> 
      <td><a id="add-row" class="button addrowbtn" href="#">Add</a></td> 
     </tr> 
     <tr class="tablerowclone"> 
      <td><input type="text" class="widefat" name="name[]" /></td> 
      <td><input type="text" class="widefat" name="url[]" value="" /></td> 
      <td><a class="button remove-row" href="#">Remove</a></td> 
      <td><a id="add-row" class="button addrowbtn" href="#">Add</a></td> 
     </tr> 

     <?php endif; } ?> 
     <? $Inc++; } ?> 


     </tbody> 
     </table> 
     <style> 
      .tablerowclone{display:none;} 
      </style> 

     </p> 


     <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> 

     <script type="text/javascript"> 
     jQuery(document).ready(function($){ 
      jQuery(document).off().on('click',' .addrowbtn', function(event) { 
       event.preventDefault(); 
      var row = jQuery(this).closest(".tableclass").find("tr:last").clone(); 

      row.removeClass('tablerowclone'); 
      //row.insertBefore('#repeatable-fieldset-one tbody>tr:last'); 
      row.insertBefore(jQuery(this).closest(".tableclass").find("tbody tr.tablerowclone")); 
      return false; 
      }); 

      jQuery(document).on('click', '.remove-row' , function() { 
      var RowLenth = jQuery(this).closest("tbody").children().length; 

       if(RowLenth>2){ 
        jQuery(this).parents('tr').remove();       
       } 
      return false; 
      }); 
     }); 
     </script> 

     <?php 
     } 



    public function update($new_instance, $old_instance){ 
     $instance = array(); 
     $instance['title'] = (!empty($new_instance['title'])) ? strip_tags($new_instance['title']) : ''; 

     return $instance; 
    } 
} 

function wpb_load_widget() 
{ 
    register_widget('dynamic_widget'); 
} 
add_action('widgets_init', 'wpb_load_widget'); 

更新

似乎它的正常工作。

+0

你好,問題不只是JavaScript添加一個新的行,但如何存儲特定標籤的數據,也沒有運行你的代碼,你確定這是你改變的唯一行嗎? –

+0

您可以保存序列化的數據。保持隱藏的關鍵。 – vel

+0

你提到這是'第一個JavaScript'添加「按鈕不再有效' – vel

0

更新

 <?php 
     /* 
     Plugin Name: Dynamic Fields Widget 
     Description: Dynamic Fields 
     Version: 0.0 
     Author: Rain Man 
     */ 
     // Creating the widget 
     class dynamic_widget extends WP_Widget 
     { 
      public function __construct() 
      { 
       parent::__construct(
        'dynamic_widget', __('Dynamic Widget', 'dynamic_widget_domain'), 
        array('description' => __('Sample Dynamic Widget', 'dynamic_widget_domain')) 
       ); 
      } 

     // widget 
     public function widget($args, $instance) 
     { 
      $title = apply_filters('widget_title', $instance['title']); 
      // This is where you run the code and display the output 
      echo __('Hello, World!', 'dynamic_widget_domain'); 
      echo $args['after_widget']; 
     } 

     // form 
     public function form($instance) 
     { 
      if (isset($instance[ 'title' ])) { 
       $title = $instance[ 'title' ]; 
      } else { 
       $title = __('New title', 'dynamic_widget_domain'); 
      } 
     // Widget admin form 

      $repeatable_fields = array(); 
      $courses = array(
       'Chemistry' => array(
       'coursecode' => 'Chemistry 2059', 
       'professor' => 'Dr. James Bond', 
       'id' => 'test1', 
      ), 
       'Biology' => array(
       'coursecode' => 'Biology 3029', 
       'professor' => 'Dr. James Bond', 
        'id' => 'test2', 
      ), 
       'Math' => array(
       'coursecode' => 'Math 2043', 
        'id' => 'test3', 
      ), 
       'Physics' => array(
       'coursecode' => 'Physics 2075', 
       'id' => 'test4', 
      ) 
      ); 

     $Inc=1; 
     foreach ($courses as $course_key => $course_info) { 
      echo $Inc; 
      ?> 
     <label><?php echo $course_info['coursecode']; ?></label> 
     <table id="repeatable-fieldset-<?php echo $course_info['id']; ?>" width="100%" class="tableclass"> 
     <thead> 
      <tr> 
      <th width="40%">Fall Term</th> 
      <th width="40%">Winter Term</th> 
      <th width="8%"></th> 
      </tr> 
     </thead> 
     <tbody> 
     <?php 


      if ($repeatable_fields): 

       foreach ($repeatable_fields as $field) {  ?> 
        <tr> 
         <td><input type="text" class="widefat" name="name[]" value="<?php if ($field['name'] != '') { echo esc_attr($field['name']);} ?>" /></td> 
         <td></td> 
         <td><input type="text" class="widefat" name="url[]" value="<?php if ($field['url'] != '') { echo esc_attr($field['url']); } else { echo ''; } ?>" /></td> 
         <td><a class="button remove-row" href="#">Remove</a></td> 
         <td><a id="add-row" class="button addrowbtn" href="#">Add</a></td> 
        </tr> 
       <?php } 

     else: 
     // show a blank one 

     ?> 
     <tr> 
      <td><input type="text" class="widefat" name="name[]" /></td> 
      <td><input type="text" class="widefat" name="url[]" value="" /></td> 
      <td><a class="button remove-row" href="#">Remove</a></td> 
      <td><a id="add-row" class="button addrowbtn" href="#">Add</a></td> 
     </tr> 
     <tr class="tablerowclone"> 
      <td><input type="text" class="widefat" name="name[]" /></td> 
      <td><input type="text" class="widefat" name="url[]" value="" /></td> 
      <td><a class="button remove-row" href="#">Remove</a></td> 
      <td><a id="add-row" class="button addrowbtn" href="#">Add</a></td> 
     </tr> 

     <?php endif; } ?> 
     <? $Inc++; } ?> 


     </tbody> 
     </table> 
     <style> 
      .tablerowclone{display:none;} 
      </style> 

     </p> 


     <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> 

     <script type="text/javascript"> 
     jQuery(document).ready(function($){ 
      jQuery(document).off().on('click',' .addrowbtn', function(event) { 
       event.preventDefault(); 
      var row = jQuery(this).closest(".tableclass").find("tr:last").clone(); 

      row.removeClass('tablerowclone'); 
      //row.insertBefore('#repeatable-fieldset-one tbody>tr:last'); 
      row.insertBefore(jQuery(this).closest(".tableclass").find("tbody tr.tablerowclone")); 
      return false; 
      }); 

      jQuery(document).on('click', '.remove-row' , function() { 
      var RowLenth = jQuery(this).closest("tbody").children().length; 

       if(RowLenth>2){ 
        jQuery(this).parents('tr').remove();       
       } 
      return false; 
      }); 
     }); 
     </script> 

     <?php 
     } 



    public function update($new_instance, $old_instance){ 
     $instance = array(); 
     $instance['title'] = (!empty($new_instance['title'])) ? strip_tags($new_instance['title']) : ''; 

     return $instance; 
    } 
} 

function wpb_load_widget() 
{ 
    register_widget('dynamic_widget'); 
} 
add_action('widgets_init', 'wpb_load_widget'); 
4

試試這個代碼,我測試了它,它的工作原理。 js代碼需要插入頁腳而不是插件中,否則點擊按鈕將被執行兩次。

在函數widget()中,您將看到顯示輸入值的循環。

<?php 
/* 
Plugin Name: Dynamic Fields Widget 
Description: Dynamic Fields 
Version: 0.0 
Author: Rain Man 
*/ 
// Creating the widget 
class dynamic_widget extends WP_Widget 
{ 
    public $courses; 
    public function __construct() 
    { 
     parent::__construct(
      // Base ID of your widget 
      'dynamic_widget', 

      // Widget name will appear in UI 
      __('Dynamic Widget', 'dynamic_widget_domain'), 

      // Widget description 
      array('description' => __('Sample Dynamic Widget', 'dynamic_widget_domain')) 
     ); 
     $this->courses = array(
      'Chemistry' => array(
      'coursecode' => 'Chemistry 2059', 
      'professor' => 'Dr. James Bond', 
     ), 
      'Biology' => array(
      'coursecode' => 'Biology 3029', 
      'professor' => 'Dr. James Bond', 
     ), 
      'Math' => array(
      'coursecode' => 'Math 2043', 
      'professor' => 'Dr. James Bond', 
     ), 
      'Physics' => array(
      'coursecode' => 'Physics 2075', 
      'professor' => 'Dr. James Bond', 
     ) 
     ); 
     add_action('in_admin_footer',array($this,'jsfooter')); 
    } 
    public function jsfooter() { 
    ?> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> 

    <script type="text/javascript"> 
    jQuery(document).ready(function($){ 
     $(document).off('click').on('click','div.open .add-row' , function() { 

     var row = $(this).closest('tr').clone(true); 
     row.find('input').each(function(){ 
      $(this).val(""); 
     }); 
     // row.insertBefore('#repeatable-fieldset-one tbody>tr:last'); 
     $(this).parents('tr').after(row); 

     return false; 
     }); 

     $(document).on('click', 'div.open .remove-row',function() { 
      if ($(this).parents('tbody').find('tr').length >1) { 
      $(this).parents('tr').remove(); 
     } 
     return false; 
     }); 
    }); 
    </script> 
    <?php 
    } 

// widget 
public function widget($args, $instance) 
{ 
    $title = apply_filters('widget_title', $instance['title']); 
// This is where you run the code and display the output 
    foreach ($this->courses as $course_key => $course_info) { 
     echo $course_info['coursecode'] .'<br>'; 
     foreach ($instance['repeat'][$course_key ]["fall"] as $k=>$field) { 
      echo 'Fall Term ' . $field .'/'; 
      echo 'Winter Term ' . $instance['repeat'][$course_key ]["winter"][$k] .'<br>'; 
     } 
    } 

    echo $args['after_widget']; 
} 

// form 
public function form($instance) 
{ 
    if (isset($instance[ 'title' ])) { 
     $title = $instance[ 'title' ]; 
    } else { 
     $title = __('New title', 'dynamic_widget_domain'); 
    } 
// Widget admin form 
    $repeatable_fields= isset ($instance['repeat']) ? $instance['repeat'] : array(); 
    ?> 

<?php foreach ($this->courses as $course_key => $course_info) { ?> 
<label><?php echo $course_info['coursecode']; ?></label> 
<table id="repeatable-fieldset-one" width="100%"> 
<thead> 
    <tr> 
    <th width="40%">Fall Term</th> 
    <th width="40%">Winter Term</th> 
    <th width="8%"></th> 
    <th width="8%"></th> 
    </tr> 
</thead> 
<tbody> 
<?php 

if ($repeatable_fields[$course_key ]["fall"] || $repeatable_fields[$course_key ]["winter"]) : 
foreach ($repeatable_fields[$course_key ]["fall"] as $k=>$field) { 
    ?> 
<tr> 
    <td><input type="text" class="widefat" name="<?php echo $this->get_field_name('repeat')?>[<?php echo $course_key;?>][fall][]" value="<?php echo $field; ?>" /></td> 

    <td><input type="text" class="widefat" name="<?php echo $this->get_field_name('repeat')?>[<?php echo $course_key;?>][winter][]" value="<?php echo $repeatable_fields[$course_key ]["winter"][$k]; ?>" /></td> 

    <td><a class="button remove-row" href="#">Remove</a></td> 
    <td><a class="button add-row" class="button" href="#">Add</a></td> 

</tr> 
<?php 
} else : 
// show a blank one 

?> 
<tr> 
    <td><input type="text" class="widefat" name="<?php echo $this->get_field_name('repeat')?>[<?php echo $course_key;?>][fall][]" /></td> 


    <td><input type="text" class="widefat" name="<?php echo $this->get_field_name('repeat')?>[<?php echo $course_key;?>][winter][]" value="" /></td> 

    <td><a class="button remove-row" href="#">Remove</a></td> 
    <td><a class="button add-row" class="button" href="#">Add</a></td> 

</tr> 
<?php endif; ?> 
</tbody> 
</table> 
<?php } ?> 


<!-- empty hidden one for jQuery --> 

<?php 

} 

// update 
public function update($new_instance, $old_instance) 
{ 
    $instance = array(); 
    $instance['title'] = (!empty($new_instance['title'])) ? strip_tags($new_instance['title']) : ''; 
    $instance['repeat'] = array(); 

    if (isset ($new_instance['repeat'])) 
    { 
     foreach ($new_instance['repeat'] as $k =>$value) 
     { 
       $instance['repeat'][$k] = $value; 
     } 
    } 

    return $instance; 
} 
} // Class dynamic_widget ends here 

// Register and load the widget 
function wpb_load_widget() 
{ 
    register_widget('dynamic_widget'); 
} 
add_action('widgets_init', 'wpb_load_widget'); 

的數據將被存儲在$實例[「重複」在這樣的一個數組(瞭解我是如何做到的循環)

array (size=4) 
    'Chemistry' => 
    array (size=2) 
     'fall' => 
     array (size=1) 
      0 => string 'AAA' (length=3) 
     'winter' => 
     array (size=1) 
      0 => string 'BBBBBBB' (length=7) 
    'Biology' => 
    array (size=2) 
     'fall' => 
     array (size=2) 
      0 => string 'CCCCCC' (length=6) 
      1 => string 'EEEEEEE' (length=7) 
     'winter' => 
     array (size=2) 
      0 => string 'DDDD' (length=4) 
      1 => string 'FFFFFFFF' (length=8) 
    'Math' => 
    array (size=2) 
     'fall' => 
     array (size=1) 
      0 => string 'GGGGGGG' (length=7) 
     'winter' => 
     array (size=1) 
      0 => string 'HHHHHH' (length=6) 
    'Physics' => 
    array (size=2) 
     'fall' => 
     array (size=1) 
      0 => string 'IIIIIIIII' (length=9) 
     'winter' => 
     array (size=1) 
      0 => string 'JJJJJJJJ' (length=8) 
+0

upvoted。好東西! – vel