Làm cách nào để hiển thị thông báo lỗi quản trị nếu cài đặt được lưu thành công?


7

Tiêu đề nghe có vẻ phản trực giác nhưng chịu đựng tôi. :)

Tôi có trang tùy chọn, được thực hiện với API Cài đặt. Khi người dùng nhập dữ liệu không hợp lệ, tôi muốn hiển thị thông báo lỗi với add_settings_error()cuộc gọi.

Nhưng! Để xác định dữ liệu đó không hợp lệ, tôi cần thực hiện cuộc gọi API từ xa. Cuộc gọi đó phụ thuộc vào dữ liệu đã lưu. Vì vậy, tôi không thể thực hiện điều này trong cuộc gọi lại vệ sinh (nơi được khuyến nghị để ném các thông báo như vậy) vì dữ liệu của tôi chưa được lưu.

Thay vào đó tôi đã cố gắng móc séc của tôi vào admin_notices. Nó hoạt động tốt hầu hết thời gian trừ một trường hợp (và quan trọng nhất) - khi các cài đặt được lưu, chúng luôn được theo sau bởi Cài đặt gốc được lưu. thông báo và thông báo tùy chỉnh của tôi hoàn toàn bị bỏ qua vì một số lý do.

Vậy làm thế nào để tôi ném thông báo lỗi đó ngay cả khi WP nghĩ mọi thứ đều ổn?

Biên tập

Câu hỏi tập trung hơn - tại sao chính xác Cài đặt được lưu. bất kỳ thông báo khác?

PS Tôi có thể cố gắng thực hiện cuộc gọi API tùy chọn lấy dữ liệu làm đối số thay vì đọc nó từ tùy chọn đã lưu, nhưng cho đến nay tôi nghĩ rằng nó sẽ làm cho các đối số quá cồng kềnh.

Câu trả lời:


4

Ok, tôi nghĩ rằng tôi có một ý tưởng những gì đang xảy ra.

  1. Danh sách các thông báo sẽ hiển thị được lấy bởi get_settings_errors()( nguồn ).

  2. Hàm này đọc các thông báo từ toàn cầu $wp_settings_errors trừ khisettings_errorstập tạm thời, vượt qua var toàn cầu.

  3. Khi cài đặt được lưu, kiểm tra không có lỗi cài đặt và nếu cài đặt được lưu. thông báo được tạo ra. Sau đó, (trong cả hai trường hợp) lỗi được lưu vào settings_errorstạm thời (tôi giả sử bảo toàn chúng khi chuyển hướng) ( nguồn ).

Về cơ bản, bất kể thông báo nào bạn tạo trong mã của mình - chúng sẽ bị bỏ qua khi được đặt tạm thời và nó sẽ luôn được đặt sau khi lưu cài đặt.

Đối với tôi, sẽ hợp lý hơn khi kết hợp nhất thời với biến toàn cục thay vì biến nó thành độc quyền hoặc lựa chọn.

Và tôi đoán để hiển thị các thông báo tùy chỉnh khi được đặt tạm thời, tôi sẽ cần phải lộn xộn với thoáng qua đó, điều này có lẽ không đáng để gặp rắc rối.


Wow ... tôi đã bỏ qua cách đối xử độc quyền của những người thoáng qua ... vâng, hoàn toàn, bạn mong đợi chúng được kết hợp, đó là lý do tại sao tôi bỏ lỡ những gì bạn phát hiện ra. ;-) Dù sao, việc gây rối với các quá độ nên khá tiết kiệm và đơn giản, bạn chỉ cần đọc cửa hàng tạm thời với get_settings_errors(), tại thời điểm đó, cửa hàng tạm thời bị xóa, sau đó bạn khôi phục chúng với add_settings_error()từng cái một và thêm cái mới của bạn. Bây giờ cửa hàng tạm thời bị xóa và bạn có tất cả chúng trong cửa hàng trang cục bộ, vì vậy lần chạy tiếp theo settings_errors()sẽ bắt chúng. Bạn nghĩ sao?
wyrfel

À, có một chút bối rối ... tôi đoán trong trường hợp của bạn, bạn sẽ cần lọc mẫu tin nhắn đã lưu kết quả của cuộc gọi get_sinstall_errors () hoặc giữ nó ở đó nếu mọi thứ đều ổn trong lần kiểm tra thứ hai của bạn.
wyrfel

Cuối cùng, @wyrfel tôi đã quyết định rằng việc thay đổi cơ chế của API Cài đặt và các thông báo đó không phải là mục đích hay phạm vi của plugin, vì vậy, đã triển khai kiểm tra API trong cuộc gọi lại vệ sinh (hóa ra dễ dàng điều chỉnh theo khóa API tùy ý thay vì lưu).
Rarst

Nghe có vẻ hợp lý, nhưng ít vui vẻ. ;-)
wyrfel

@wyrfel Tôi sẽ lưu loại niềm vui đó khi tôi tự viết mã cho mình :)
Hết

0

Một điều bạn có thể làm, tôi đoán:

  • trong cuộc gọi lại xác thực của bạn, hãy đọc các cài đặt hiện tại (bạn có thể làm như vậy không?) và lưu trữ chúng trong một biến
  • kiểm tra tất cả các giá trị khác trước
  • nếu chúng không hợp lệ, trả về lỗi, không kiểm tra giá trị tới hạn
  • nếu có, hãy lưu trữ chúng trong db (trong hàm xác thực của bạn)
  • thực hiện cuộc gọi API từ xa của bạn
  • xác nhận giá trị khó khăn
  • nếu hợp lệ, trả lại toàn bộ bó và tất cả đều tốt
  • nếu không, hãy lưu trữ các cài đặt cũ mà bạn đã nhận lúc đầu trở lại db, thực hiện đầu ra lỗi của bạn thông qua add_settings_error() Tất nhiên phần nào đánh bại / lạm dụng API Cài đặt, nhưng đó có thể là một cách.

Chỉnh sửa: Thông báo đã lưu Cài đặt không thổi phồng các thông báo khác của bạn, nó chỉ hiển thị vì các thông báo khác của bạn đã bị xóa (vì một số lý do) từ cửa hàng settings_error nội bộ. Tại sao đó là trường hợp tôi không biết, nhưng thông báo Cài đặt đã lưu chỉ được thêm vào kho lỗi nếu và chỉ khi nó trống. Điều có thể góp phần vào tình trạng khó xử của bạn là bất cứ khi nào cửa hàng lỗi cài đặt được đọc (thông qua get_settings_errors()), nó cũng sẽ bị xóa.


Nghĩ về việc làm theo cách này. Cách tiếp cận hoạt động, nhưng cũng rất cồng kềnh (và tôi đồng ý rằng nó dường như đánh bại API Cài đặt ở đây). Tôi đã thêm một câu hỏi hơi khó chịu - hiện tại tôi quan tâm nhiều hơn không phải là làm thế nào để nó hoạt động, nhưng tại sao nó không hoạt động theo cách của tôi (với các thông báo quản trị riêng biệt)?
Rarst

Bạn có thể đăng các dòng mã liên quan đến add_sinstall_error () và những người đang thực hiện hooking không?
wyrfel

Tôi nghĩ rằng tôi đã tìm ra nó (xem câu trả lời tôi vừa đăng), nhưng có thể sử dụng ý kiến ​​thứ hai về nó :)
Rarst

@Rarst Bạn có để ý ý kiến ​​thứ hai không?
wyrfel
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.