我尝试了这段代码来创建一些元框,所有这些都工作得很好,我面临的问题是如何清理文本字段和更新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\');
}
}
最合适的回答,由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\']);