Cách quản lý các cuộc gọi ajax và JSON trong wordpress


13

Tôi có một loại bài đăng tùy chỉnh mà tôi muốn truy cập thông qua jQuery - tốt nhất là sử dụng JSON.

Vì vậy, những điều đầu tiên đầu tiên. tạo một hàm trả về / echos json là đủ dễ dàng, nhưng làm thế nào tôi có thể truy cập nó thông qua jquery.

như Mike viết trong câu hỏi này , anh ấy - theo như tôi hiểu - đặt nó trong thư mục gốc. cái nào có thể truy cập bằng tên tệp php - nhưng điều này có được khuyến khích không? Tôi thà đặt nó trong một thư mục plugin.

Tôi đã thử đọc codex wordpress, nhưng cách xử lý các cuộc gọi ajax chỉ làm tôi bối rối, vì bạn đang đăng mỗi cuộc gọi ajax lên admin-ajax.php, mặc dù đó không phải là trang quản trị?

Ai đó có thể vui lòng nói thẳng ra những vấn đề tôi đang gặp phải không?

/Bão táp

biên tập

Vấn đề tôi gặp phải là cách các cuộc gọi ajax được thực hiện trong wordpress, cũng như nơi đặt mã php và js của bạn để thực hiện / xử lý các cuộc gọi.

Trong câu hỏi khác mà tôi đã liên kết đến, bạn đã tạo một hàm đặt tệp trong root wp - tôi không muốn làm điều đó. Nhưng bây giờ tôi đã học được cách sử dụng wp_ajax_ (nopriv _) [hành động] và có thể truy cập một cách hiệu quả json tôi tạo. Vấn đề còn lại là nơi tôi nên đặt JS để thực hiện cuộc gọi. Tôi muốn đặt nó trong tệp js của plugin, nhưng vì nó được trình bày trong một trang chứ không phải trên trang quản trị, ajaxurl không được xác định, vì vậy tôi phải lặp lại bằng php.

echo admin_url('admin-ajax.php');

Vì vậy, câu hỏi trở thành làm thế nào tôi nên kết hợp php này với javascript và sau đó tôi nên xử lý nó như thế nào, xem nó không phải là một tập tin hay một tập lệnh.


Tôi muốn chỉnh sửa tiêu đề câu hỏi của bạn để đưa ra một tiêu đề mô tả hơn nhưng sau khi đọc tôi vẫn không chắc chắn 100% câu hỏi của bạn là gì. Bạn chỉ đơn giản là hỏi cách truy cập nguồn cấp JSON, không liên quan đến các loại bài đăng tùy chỉnh (không phải CPT không thực sự nhập vào câu hỏi của bạn?) Và điều quan trọng là nó không nằm trong thư mục gốc? Có phải cho chức năng quản trị? Có lẽ nó sẽ hữu ích nếu bạn giải thích những gì bạn đang thực sự cố gắng thực hiện từ quan điểm của người dùng cuối cùng với phương pháp kỹ thuật mà bạn đang đấu tranh?
MikeSchinkel

Vâng, tôi có thể tin rằng tiêu đề không phải là mô tả nhất bao giờ hết. Tôi chỉ cần đặt một cái gì đó ở đó vì tôi đã đăng với một cái thậm chí còn tồi tệ hơn lúc đầu. Chỉnh sửa bài đăng với nhiều thông tin hơn.
Bão

Loại bài đăng tùy chỉnh tôi vừa đưa vào, bởi vì plugin json-api có vẻ phổ biến không thực sự bao gồm các loại bài đăng tùy chỉnh.
Bão

Câu trả lời:


17

Xử lý Ajax

Thực sự hơi khó hiểu khi trình xử lý Ajax có trong wp-admin/thư mục, nhưng vâng, bạn có thể và nên sử dụng nó cho các yêu cầu không phải của quản trị viên. Sau đó, bạn đăng ký một trình xử lý cho wp_ajax_nopriv_[action]hook, thay vì bình thường wp_ajax_[action]. Trong trường hợp này, bạn chỉ phải thực hiện theo các dòng đầu tiênadmin-ajax.php , vì một yêu cầu được thực hiện bởi người dùng chưa đăng nhập sẽ rời khỏi trang khoảng dòng 50.

Vì vậy, hãy đăng ký một hàm cho hook wp_ajax_nopriv_get_custom_post_datavà nó sẽ được gọi nếu bạn yêu cầu admin-ajax.phpvới actiontham số được đặt thành get_custom_post_data. Hãy chắc chắn gọi die()vào cuối trình xử lý của bạn, nếu không mặc định die(-1)sẽ được trả lại. Và cũng đăng ký phiên bản đăng nhập, wp_ajax_get_custom_post_data(với cùng chức năng xử lý, không có vấn đề gì), vì nếu bạn đã đăng nhập vào trang web của mình, bạn sẽ không gặp khó khăn nopriv.

Cấu hình phía máy chủ thành Javascript

Mẹo để gửi dữ liệu cấu hình phía máy chủ (như admin-ajax.phpurl), là wp_localize_script(). Bạn chuyển cho nó một mảng các khóa và giá trị sẽ được đưa vào đầu trang. Điều này có lẽ ban đầu chỉ được tạo cho các chuỗi có thể bản địa hóa, nhưng bạn cũng có thể sử dụng nó để truyền dữ liệu cấu hình.

wp_localize_script('storm_json_config', 'storm_config', array(
    'ajaxurl' => admin_url('admin-ajax.php'),
));

storm_json_configlà tên xử lý (nếu bạn muốn loại bỏ nó sau), storm_configlà tên của đối tượng Javascript sẽ chứa dữ liệu của bạn. Vì vậy, tệp Javascript tĩnh của bạn có thể chứa một dòng như jQuery.post(storm_config.ajaxurl, ...).

Xem thêm câu trả lời của bueltge cho một câu hỏi tương tự .

Javascript tĩnh từ thư mục plugin

Để tải tệp Javascript tĩnh từ thư mục plugin của riêng bạn, bạn sử dụng wp_enqueue_script(). Điều đó sẽ trông giống như thế này:

wp_enqueue_script('storm_json', plugin_dir_url(__FILE__) . 'js/json.js', array('jquery'), '20101105');

Trường hợp storm_jsonlại là tên xử lý, sau đó bạn cung cấp liên kết đến tệp, sau đó là phần phụ thuộc (có thể null) và sau đó là số phiên bản sẽ được thêm sau khi yêu cầu đánh bại bộ đệm của trình duyệt trên các bản cập nhật.


câu trả lời chính xác. Đây là những gì tôi đã tự hỏi, và tôi dường như đã làm cho nó hoạt động. Bây giờ tôi có thể truy cập /wp-admin/admin-ajax.php?action=[action] và nhận được kết quả json. Vấn đề của tôi bây giờ là nơi để đặt js để thực hiện cuộc gọi ajax. Vì tôi cần đặt echo admin_url ('admin-ajax.php'); là url, tôi không thể đặt nó trong tập tin js bổ trợ của mình. Vì vậy, làm thế nào tôi sẽ đi về enqueueing nó? Tôi không chỉ muốn in tập lệnh vào giữa trang.
Bão

@Storm: Tôi đã mở rộng câu trả lời của mình với wp_localize_script(), bạn có thể sử dụng để gửi dữ liệu cấu hình từ phía máy chủ đến trình duyệt. (Mẹo nhỏ: Nếu bạn thêm @vào tên người dùng, người đó sẽ nhận được thông báo về câu trả lời của bạn. Vì vậy, @Mike: I updated the titlehãy chắc chắn rằng anh ấy thấy nhận xét của bạn)
Jan Fabry

Cảm ơn một bó tháng một. Bây giờ tôi nghĩ rằng tôi hiểu toàn bộ gói. Tôi sẽ phải mân mê một chút với tất cả để hiểu nó đầy đủ nhưng bạn đã giúp đỡ rất nhiều! Trả lời được chấp nhận =) btw cảm ơn vì ghi chú @. Nhưng như tôi đang bình luận về câu trả lời của bạn bây giờ, bạn vẫn sẽ nhận được một cảnh báo phải không?
Bão

@Storm: Có, cảnh báo sẽ đến tác giả của câu hỏi hoặc câu trả lời mà bạn đang bình luận, và ngoài ra, nó có thể chuyển đến một người tham gia khác mà bạn đề cập trong một @ -comment. Vì vậy, tôi đã nhận được thông báo của bạn "miễn phí", nhưng bạn sẽ không nhận được thông báo này nếu tôi không bao gồm bạn. Có một lời giải thích đầy đủ về trang web meta chung của mạng Stack Exchange.
Jan Fabry
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.