אכן כך, וורדפרס חוסמת קריאות ajax שלא רשומות דרכה,
הדרך הוא מאוד פשוטה,
שלב ראשון:
יש להעביר את הURL לדף admin-ajax אל ה js, הקוד מועבר ב PHP בצורת מערך, לjs הוא מגיע בתור אובייקט.
קוד:
wp_localize_script('main-js', 'js_script_ajax', array('ajaxurl' => admin_url('admin-ajax.php')));
הנתון הראשון שמעבירים הוא על איזה דף js להדפיס את האובייקט. (חשוב לוודא שהוא מגיע לדף לפני קריאת ה ajax)
הנתון השני יהיה שם האובייקט ב js.
שלב שני:
הכנת הפונקציה ב PHP.
קוד:
function do_something_in_ajax(){
// add php code
}
add_action('wp_ajax_do_something_in_ajax', 'do_something_in_ajax');
מוסיפים אקשן, נתון ראשון: שם האקשן עם התחילית wp-ajax, נתון שני: שם של הפונקציה שתרוץ, הפונקציה היא זאת שתעשה את העבודה, echo ידפיס חזרה ל js נתונים, בד"כ בצורת json.
שלב השלישי:
קריאת ה ajax, אני עושה עם fetch, אפשרי גם עם jQuery.
מה שחשוב הוא להוסיף לאובייקט היוצא את הנתון הבא:
קוד:
action : 'do_something_in_ajax'
את הפניה עושים כך:
הקריאה היא לדף ה admin-ajax.php, את הכתובת קיבלנו באמצעות האובייקט js בשם js_script_ajax שהדפסנו לעיל.
קוד:
let data = {key-1 : ' value-1' , key-2: 'value-2'};
data.action = "do_something_in_ajax";
fetch(js_script_ajax.ajaxurl, {
method: "POST",
body: data
})
.then(response=> response.json())
.then(json=> responseFromServer(json));
}
בהצלחה.
תוספת:
לגבי עדכון שדות ACF יש את הפונקציה:
קוד:
update_field($selector, $value, [$post_id]);
הנתון הראשון הוא שם השדה, השני הוא הערך החדש, השלישי הוא מספר הפוסט לעדכן.