WP_User_Query và dữ liệu usermeta không duy nhất


8

Chúng tôi gặp sự cố với plugin WP mà chúng tôi đã viết và duy trì - Xuất dữ liệu người dùng

Một người dùng đã báo cáo một vấn đề rằng các bản ghi dữ liệu meta người dùng không phải là duy nhất không được trả lại chính xác - tại đây

Trong plugin, chúng tôi xuất dữ liệu usermeta do người dùng chọn - sử dụng get_users () lần lượt sử dụng WP_User_Query:

Chúng tôi chuyển một vài đối số đơn giản cho get_users:

// build argument array ##
$args = array(
      'fields'    => 'all',
      'role'      => sanitize_text_field( $_POST['role'] )
);

Nếu chúng tôi kiểm tra một đối tượng WP_User được trả về, các trường usermeta sẽ không được trả về - ví dụ (dữ liệu đối tượng được giảm để tiết kiệm dung lượng):

Array
(
[0] => WP_User Object
    (
        [data] => stdClass Object
            (
                [ID] => 1267
                [user_login] => user@email.com
                ...
            )

        [ID] => 1267
        ...
    )

[1]...

Chúng tôi đã cố gắng thay đổi tham số get_users cho tham số "trường" từ "tất cả" thành "all_with_meta", tuy nhiên điều này dường như không thay đổi dữ liệu được trả về ban đầu.

Tại thời điểm chúng tôi xuất các hàng siêu dữ liệu người dùng này, trước tiên chúng tôi sẽ lặp qua mảng các đối tượng WP_User đó và sau đó lặp lại dữ liệu trường usermeta riêng lẻ (trường $ đến từ một mảng các trường $ lặp bên ngoài vòng lặp $ users):

// build row values for each user ##
foreach ( $users as $user ) {

    // grab value from $user object ##
    $value = $user->{$field};

}

Dữ liệu trường đang được thêm một cách kỳ diệu vào đối tượng $ user, mặc dù điều này không được hiển thị trong dữ liệu đối tượng được trả về ban đầu - tuy nhiên, chúng tôi không kiểm soát được nếu nó trả về một hoặc một giá trị cho mỗi trường usermeta.

Vì dữ liệu được trả về tự động, chúng tôi không kiểm soát phương thức đã chọn, chúng tôi sẽ có thể nếu chúng tôi sử dụng trực tiếp get_user_meta (nhưng chúng tôi vẫn có vấn đề không biết dữ liệu được lưu trữ là duy nhất hay không, mà không chạy thêm truy vấn - sẽ tốn kém khi xuất khẩu lớn).

Tôi đang viết tất cả những điều này để cố gắng giải thích cho người khác về vấn đề này, đồng thời để giúp chúng tôi tìm kiếm câu trả lời và giải quyết vấn đề này.

Cập nhật

Chúng tôi đã đẩy một bản sửa lỗi thử nghiệm lên github bằng một phương pháp để kiểm tra các khóa usermeta không duy nhất và trả về một mảng trong trường hợp có nhiều hơn một khóa khớp

Câu trả lời:


3

Giải pháp mà chúng tôi đã thực hiện cuối cùng sử dụng một lệnh gọi để get_user_meta chỉ chuyển $ user_id - theo cách này, tất cả dữ liệu người dùng được trả về trong một truy vấn duy nhất, giảm tải nặng cho DB trong quá trình xuất dữ liệu người dùng lớn.

Sau đó chúng tôi chạy một loạt các kiểm tra đối với dữ liệu được trả về - bao gồm:

  • is_serialized ($ value) - để kiểm tra xem dữ liệu đã được trả về ở dạng tuần tự chưa (sau đó chúng tôi cố gắng hủy xác nhận dữ liệu - trong một số trường hợp, điều này không thành công khi dữ liệu được lưu trữ ở dạng không chính xác).
  • is_array ($ value) - để kiểm tra xem dữ liệu được trả về có thực sự là một mảng không

Nếu chúng tôi thấy rằng dữ liệu được trả về trong một mảng, chúng tôi sẽ đệ quy lại mảng cho đến khi chúng tôi có một chuỗi dữ liệu để trở về tệp xuất.

Tôi chưa bao gồm mã cụ thể trong câu trả lời này, nhưng được liên kết với các tệp github được lưu trữ (tôi biết điều này không lý tưởng cho tương lai, nhưng các phần liên quan đến câu trả lời này được trải ra trong mã).

Xuất khẩu chạy sạch và không bị nghẹt - chúng tôi sẽ phát hành plugin cập nhật vào tuần tới.

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.