清理数组中的文本字段

时间:2017-06-21 作者:gp el

我尝试了这段代码来创建一些元框,所有这些都工作得很好,我面临的问题是如何清理文本字段和更新post-meta

    function Print_price_fileds($cnt, $p = null) {
    if ($p === null){
    $a = $b = $c = \'\';
    }else{
    $a = $p[\'n\'];
    $b = $p[\'d\'];
    $c = $p[\'p\'];
    }
    return  <<<HTML
    <li>
    <label>Nr :</label>
    <input type="text" name="price_data[$cnt][n]" size="10" value="$a"/>

    <label>Description :</label>
    <input type="text" name="price_data[$cnt][d]" size="50" value="$b"/>

    <label>Price :</label>
    <input type="text" name="price_data[$cnt][p]" size="20" value="$c"/>
    <span class="remove">Remove</span>
    </li>
    HTML
    ;
    }


    //add custom field - price
    add_action("add_meta_boxes", "object_init");

    function object_init(){
      add_meta_box("price_meta_id", "Price fields :","price_meta", "post", 
    "normal", "low");

    }

    function price_meta(){
     global $post;

    $data = get_post_meta($post->ID,"price_data",true);
     echo \'<div>\';
     echo \'<ul id="price_items">\';
     $c = 0;
     if (count($data) > 0){
        foreach((array)$data as $p ){
            if (isset($p[\'p\']) || isset($p[\'d\'])|| isset($p[\'n\'])){
                echo Print_price_fileds($c,$p);
                $c = $c +1;
            }
        }

    }
    echo \'</ul>\';

    ?>
        <span id="here"></span>
        <span class="add"><?php echo __(\'Add Price Data\'); ?></span>
        <script>
            var $ =jQuery.noConflict();
                $(document).ready(function() {
                var count = <?php echo $c - 1; ?>; // substract 1 from $c
                $(".add").click(function() {
                    count = count + 1;
                    //$(\'#price_items\').append(\'<li><label>Nr :</label><input type="text" name="price_data[\' + count + \'][n]" size="10" value=""/><label>Description :</label><input type="text" name="price_data[\' + count + \'][d]" size="50" value=""/><label>Price :</label><input type="text" name="price_data[\' + count + \'][p]" size="20" value=""/><span class="remove">Remove</span></li>\');
                   $(\'#price_items\').append(\'<? echo implode(\'\',explode("\\n",Print_price_fileds(\'count\'))); ?>\'.replace(/count/g, count));
                    return false;
                });
                $(".remove").live(\'click\', function() {
                    $(this).parent().remove();
                });
            });
        </script>
        <style>#price_items {list-style: none;}</style>
    <?php
    echo \'</div>\';
}


    //Save product price
    add_action(\'save_post\', \'save_detailss\');

    function save_detailss($post_id){ 
    global $post;


    // to prevent metadata or custom fields from disappearing... 
    if ( defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE ) 
    return $post_id; 
    // OK, we\'re authenticated: we need to find and save the data
    if (isset($_POST[\'price_data\'])){
        $data = $_POST[\'price_data\'];
        update_post_meta($post_id,\'price_data\',$data);
    }else{
        delete_post_meta($post_id,\'price_data\');
    }
} 

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

清理WordPress中文本字段的最佳方法是使用sanitize_text_field() 功能:

$data = sanitize_text_field( $_POST[\'key\'] );
此外,如果您正确注册元字段宽度register_meta() 函数,您还可以定义清理回调和预期的数据类型。例如:

add_action( \'init\', \'cyb_register_meta_fields\' );
function cyb_register_meta_fields() {
  $args = array(
    \'sanitize_callback\' => \'sanitize_text_field\'
  );
  register_meta( \'post\', \'key\', $args );
}
通过使用register_meta() 无需每次升级或创建元字段时都对其进行清理,只需使用upadate_post_meta()/add_post_meta() 并且将自动使用sanitize回调。因此,如果您的元字段是一个数组,它可以是这样的:

add_action( \'init\', \'cyb_register_meta_fields\' );
function cyb_register_meta_fields() {

  $args = array(
    \'sanitize_callback\' => \'sanitize_price_field\'
  );

  register_meta( \'post\', \'price_data\', $args );

}

function sanitize_price_field( $meta_value ) {

  foreach ( (array) $meta_value as $k => $v ) {
    if ( is_array( $v ) ) {
      $meta_value[$k] =  sanitize_price_field( $v );
    } else {
      $meta_value[$k] = sanitize_text_field( $v );
    }
  }

  return $meta_value;

}

SO网友:Sebastian Kurzynowski

Wordpress使用add_magic_quotes() 转义传入数据的步骤$_POST, $_GET$_COOKIE$_SERVER装载中。php第647行。您可以使用此函数的structur来构建自己的函数,该函数可以清理数组中的每个元素:

function add_magic_quotes( $array ) {
    foreach ( (array) $array as $k => $v ) {
        if ( is_array( $v ) ) {
            $array[$k] = add_magic_quotes( $v );
        } else {
            $array[$k] = addslashes( $v );
    }
}
return $array;
}

您可以使用所需的函数来代替addslashes。示例:

function sanitize_price_array( $array ) {
   foreach ( (array) $array as $k => $v ) {
      if ( is_array( $v ) ) {
          $array[$k] =  sanitize_price_array( $v );
      } else {
          $array[$k] = sanitize_text_field( $v );
      }
   }

  return $array;                                                       
}

$data = sanitize_price_array( $_POST[\'price_data\']);

结束

相关推荐

在特定页面上加载Header.php

(TL;DR 以下提供)我在使用Divi主题时遇到了一个问题。我正在使用Gravity表单插件生成一个具有多重上传的表单。这种多重上传似乎使用了Ajax,从我的小测试来看,这似乎与Divi相冲突。(我将CDN置于开发模式并停用了所有插件,上载按钮/拖放仍然不起作用)。这个问题的解决方案是删掉一些代码:gravity_form_enqueue_scripts( 2, true ); 开业前<?php 以及wp_head(); ?>. 然而,这与台式机上的全宽Divi头冲突。在某种意义