Mã mẫu để xác nhận metabox tùy chỉnh?


8

Tôi đã tìm thấy rất ít trên trang web này hoặc trong các tìm kiếm của Google để biết ví dụ về việc xác thực các trường tùy chỉnh metabox.

Nếu bất cứ ai muốn đưa ra ví dụ, đây là một số trường hợp sẽ hữu ích

1) Ngày nhập vào ngày 05/02/2011 là định dạng ngày hợp lệ
2) Số được nhập trong hộp văn bản là số và từ 100 đến 500
3) Văn bản trong hộp văn bản dài> 25 ký tự

Câu hỏi của tôi không phải là quá nhiều mã để xác nhận các trường nhưng đặt mã xác thực ở đâu? Sử dụng Javascript hay PHP? Nếu nó móc vào bài đăng lưu, kỹ thuật xử lý xác nhận thất bại - Cập nhật bài đăng? Đừng cập nhật bài viết? - làm thế nào để bạn ngăn chặn nó cập nhật? Cách tốt nhất để thông báo cho người dùng về các vấn đề.

Tất cả các đề xuất được đánh giá cao. Mã mẫu hữu ích hơn là chỉ mô tả về một kỹ thuật. (Đây sẽ là một chủ đề rất tốt cho ai đó để viết một bài báo trên.) Cảm ơn bạn




Vấn đề của tôi là làm thế nào để hiển thị các thông báo lỗi cho người dùng hơn là cách xác thực các trường riêng lẻ bằng PHP hoặc Javascript. Sau khi nghiên cứu một số cách tiếp cận, cuối cùng tôi đã tìm thấy một cách tôi có thể làm việc với wordpress.stackexchange.com/questions/15354/iêu Cảm ơn những người đã trả lời.
stvwlf

Câu trả lời:


2

Trực tiếp từ WP Codex @ http://codex.wordpress.org/Function_Reference/add_meta_box , bạn gọi save_posthook và chỉ định chức năng sẽ được chạy để xác thực / lưu dữ liệu của bạn:

/* Do something with the data entered */
add_action('save_post', 'myplugin_save_postdata');

Sau đó, bạn xác định chức năng đó, sẽ tự động được thông qua id bài. Ngoài ra, bạn có thể truy cập mảng $ _POST để nhận các giá trị trong metaboxes của mình:

/* When the post is saved, saves our custom data */
function myplugin_save_postdata( $post_id ) {
  // verify if this is an auto save routine. 
  // If it is our form has not been submitted, so we dont want to do anything
  if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
      return $post_id;

  // verify this came from the our screen and with proper authorization,
  // because save_post can be triggered at other times

  if ( !wp_verify_nonce( $_POST['myplugin_noncename'], plugin_basename(__FILE__) ) )
      return $post_id;


  // Check permissions
  if ( 'page' == $_POST['post_type'] ) 
  {
    if ( !current_user_can( 'edit_page', $post_id ) )
        return $post_id;
  }
  else
  {
    if ( !current_user_can( 'edit_post', $post_id ) )
        return $post_id;
  }

  // OK, we're authenticated: we need to find and save the data

  $mydata = $_POST['myplugin_new_field'];

  // Do something with $mydata 
  // probably using add_post_meta(), update_post_meta(), or 
  // a custom table (see Further Reading section below)

   return $mydata;
}

Tất cả các thói quen của bạn đối với dữ liệu hợp lệ sẽ được thực hiện trong chức năng này. Cuối cùng, bạn có thể sẽ lưu dữ liệu bằng cách sử dụng một cái gì đó như: update_post_meta('meta_key', 'meta_value');

EDIT: Tôi nhận ra rằng tôi đã không giải quyết được vấn đề của bạn, nhưng vì tôi đã dành thời gian cho việc này nên tôi để nó ở đây để giúp bạn đi được một phần tư.


1

Thực sự không có cách nào phù hợp để xác thực trường ngày, tất cả những gì bạn có thể làm là tách nó ra và kiểm tra nó theo từng phần ..

checkdate(), nhưng như đã đề cập trong các bình luận trên trang tài liệu, nó không thể được sử dụng như một phương tiện hiệu quả để vệ sinh đầu vào ngày ..

Điều đầu tiên tôi thường kiểm tra là loại dữ liệu, nếu mong đợi một chuỗi thì truyền thành một chuỗi và tương tự cho các giá trị số nguyên và mảng.

// Casting example
$string = (string) $string;
$num = (int) $num;
$array = (array) $array;

Đối với các trường ngày bạn thường có một phần tách biệt giữa mỗi phần của ngày, hãy phân chia dựa trên đó và phân chia các phần (tuy nhiên nhiều bạn mong đợi) dưới dạng số nguyên.

$date = explode( '/', (string) $string );
$date = array_map( 'intval', $date );
// Now count the parts and validate them further - eg. you don't want negative values

Tất nhiên, điều này thực sự phụ thuộc vào cách bạn lưu trữ ngày tháng và những gì bạn mong đợi trong lĩnh vực đó, đó là thứ bạn sẽ phải vệ sinh phù hợp theo nhu cầu cụ thể của mình.

Giá trị số khá dễ dàng, lần đầu tiên chuyển sang int ..

$num = (int) $var_with_num;
// Or
$num = absint( $var_with_expected_non_negative_num ); // absint is a WordPress function

Sau đó kiểm tra nó trong phạm vi nhất định của bạn (theo câu hỏi của bạn).

// If it's not in range
if( $num < 100 || $num > 500 ) {
    // Number is not in range
}

hoặc là..

// If it is in range - including 100 & 500 as possible values
if( $num >= 100 && $num <= 500 ) {
    // Number is in range
}

Kiểm tra xem một chuỗi có độ dài cụ thể có dễ không, rất dễ trong thực tế tôi sẽ liên kết bạn với tài liệu PHP cho strlen.

http://php.net/manual/en/feft.strlen.php

Theo tôi, các giá trị ngày là khó nhất, nhưng thực sự đó là trường hợp viết mã của bạn để phù hợp với những gì bạn mong đợi từ trường đó. Nếu bạn có một trường có định dạng ngày D/M/Ychẳng hạn, bạn biết rằng /(dấu gạch chéo chuyển tiếp) sẽ (nên) xuất hiện và việc phân tách trên dấu phân cách đó sẽ cung cấp cho bạn một mảng gồm 3 giá trị số ... (nếu phần tách không ' t cung cấp cho bạn 3 giá trị hoặc bất kỳ giá trị số không hợp lệ nào, sau đó dữ liệu không hợp lệ) ..

Hy vọng điều đó sẽ giúp .. (và tôi sẵn sàng phê bình nếu có ai có phương pháp tốt hơn cho bất kỳ điều nào ở trên).


1

Để xác thực hợp lệ đầu vào, bạn sẽ cần sử dụng kết hợp Javascript và PHP.

Tôi thực sự khuyên bạn nên sử dụng plugin Xác thực jQuery: http://docs.jquery.com/Plugins/Validation . Nó sẽ cho phép bạn xác nhận các đầu vào ngay lập tức và cung cấp phản hồi cho người dùng rằng có gì đó không đúng.

Bước thứ hai là xác nhận dữ liệu bằng PHP. WordPress có một loạt các chức năng xác thực tích hợp , vì vậy tôi sẽ bắt đầu từ đó và nếu bạn không thể tìm thấy những gì bạn cần chỉ đơn giản là xây dựng theo logic mà bạn cần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.