PHP AJAX בוורדפרס

ש.ב.ח.

משתמש מקצוען
מנוי פרימיום
בוגר/תלמיד פרוג
עיצוב גרפי
D I G I T A L
שלום וברכה
בניתי דף בוורדפרס שמחזיר אובייקט json
עכשיו אני מעוניין לעשות אליו קריאת ajax
אלא שוורדפרס לא נותנת לעשות זאת בקלות...
ראיתי כל מיני הסברים אך עדיין אני לא תופס את הכיוון בו אני אמור לבצע את זה.
אשמח אם מישהו יתן לי כמה דקות להסבר...
כמו כן אני מעוניין לבצע שיחות ajax ע"מ לעדכן נתונים של שדות ACF, מי יודע?
 

s976

משתמש סופר מקצוען
הנדסת תוכנה
D I G I T A L
מה אתה מתכוון שוורדפרס לא נותנת?
אם עשית דף שמחזיר JSON, אז זה אמור לעבוד (אף פעם לא עשיתי דבר כזה מסיבה דלקמן, אבל קשה לי להאמין שזה לא יעבוד).
מה שכן, לוורדפרס יש כלים משלה בשביל העבודה עם AJAX
פונים לכתובת מסוימת, ורושמים פונקציה בצורה מסוימת כך שוורדפרס תדע לקשר את הפונקציה הזו לפנייה המדוברת.
כאן יש הסברים ודוגמאות https://codex.wordpress.org/AJAX_in_Plugins

זה אמור להיות יותר טוב (מאשר סתם פנייה לדף). אולי מבחינת האבטחה (כי יותר קל להגדיר את המשהו הזה, שאני לא זוכר כעת איך זה נקרא - שאם הדף לא הונפק על ידי המערכת, אלא זה איזה הקר פונה לשרת, אז הלקוח לא צליח להזדהות כראוי, ולא יקבל תשובה). וכן אולי זה קצת יותר נוח (במיוחד, שלא צריך לפתוח דף בפאנל הניהול). אבל במקרים רבים אין מה להסתיר מהגולשים, ואין ממה לחשוש, ואם כן, איני שום פסול בדרך שהתחלת ללכת - לפנות לדף מסוים.
 

Naftali Stein

משתמש מקצוען
מנוי פרימיום
בוגר/תלמיד פרוג
D I G I T A L
אכן כך, וורדפרס חוסמת קריאות 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]);

הנתון הראשון הוא שם השדה, השני הוא הערך החדש, השלישי הוא מספר הפוסט לעדכן.
 

s976

משתמש סופר מקצוען
הנדסת תוכנה
D I G I T A L
אכן כך, וורדפרס חוסמת קריאות ajax שלא רשומות דרכה,
מה כוונתך? הוא הציע לפנות לדף מסוים.
איך וורדפרס תחסום דבר כזה? היא הרי בכלל לא יודעת מי פונה לדף. האם זה AJAX או משתמש רגיל.
 

Naftali Stein

משתמש מקצוען
מנוי פרימיום
בוגר/תלמיד פרוג
D I G I T A L
בניתי דף בוורדפרס שמחזיר אובייקט json

זה מה שהוא כתב...

וורדפרס חוסמת גישה לדפי php שבמערכת, היא מחזירה קוד 500.

תנסה לגלוש לקובץ functions.php, שבכל אתר וורדפרס, לא מורכב להבין את הנתיב שלו...

כך שאם שלא משנה אם אתה דפדפן או ajax, אתה תקבל 500.

אתה חייב לעבור דרך admin-ajax.

קריאה החוצה ל API פתוח, אין שום בעיה.
 

s976

משתמש סופר מקצוען
הנדסת תוכנה
D I G I T A L
זה מה שהוא כתב...

וורדפרס חוסמת גישה לדפי php שבמערכת, היא מחזירה קוד 500.

תנסה לגלוש לקובץ functions.php, שבכל אתר וורדפרס, לא מורכב להבין את הנתיב שלו...

כך שאם שלא משנה אם אתה דפדפן או ajax, אתה תקבל 500.

אתה חייב לעבור דרך admin-ajax.

קריאה החוצה ל API פתוח, אין שום בעיה.
חחחח ברור
אבל לא כך עושים דף בוורדפרס
אתה יכול לעשות דף (בתוך התיקיה של התבנית) בשם page-api.php (וכן לפתוח דף בפאנל עם כותרת api) ואז אתה יכול לפנות אליו ככה: my-site.co.il/api
וזה אמור להיות בסדר גמור.
 

ש.ב.ח.

משתמש מקצוען
מנוי פרימיום
בוגר/תלמיד פרוג
עיצוב גרפי
D I G I T A L
@נטול עץ & @s976

תודה רבה על עזרתכם האדיבה,
האמת ראיתי את התשובות רק עכשיו.
שוב תודה אבל כבר הסתדרתי עם הקריאה, רק חסר לי משהו קטן (בהמשך).

ראשית מה שכתבתי ":בניתי דף" כוונתי היה שכתבתי קובץ php ודחפתי אותו בתקייה בתוך תקיית התבנית (בת).
שנית, כפי שאמרתי, הסתדרתי וכתבתי את הוו של wp_ajax_$myaction, והכל תקין.

אלא ש...

את המחלקה ההיא שמחזירה אובייקט json אני לא מעוניין להכניס אותה באופן מופשט בתוך קובץ function.php, כל זה למען הסדר הטוב.
ולכן מה שאני מעוניין לעשות בתוך הפונקצייה של הוו החדש היא incloud() לקובץ של הקלאס, רק שאז קריאה לajax מחזירה שגיאה 500.
חשוב לציין שכשהמחלקה כולה בתוך הפונקציה - הכל תקין, ורק כשהיא בקובץ אחר עם הייבוא הנ"ל יש בעיה.

מה אומרים רבותי, איך משתמשים בקובץ מחלקה בתוך הוו הזה?
 

אולי מעניין אותך גם...

הפרק היומי

הפרק היומי! כל ערב פרק תהילים חדש. הצטרפו אלינו לקריאת תהילים משותפת!


תהילים פרק קיט א'

א אַשְׁרֵי תְמִימֵי דָרֶךְ הַהֹלְכִים בְּתוֹרַת יְהוָה:ב אַשְׁרֵי נֹצְרֵי עֵדֹתָיו בְּכָל לֵב יִדְרְשׁוּהוּ:ג אַף לֹא פָעֲלוּ עַוְלָה בִּדְרָכָיו הָלָכוּ:ד אַתָּה צִוִּיתָה פִקֻּדֶיךָ לִשְׁמֹר מְאֹד:ה אַחֲלַי יִכֹּנוּ דְרָכָי לִשְׁמֹר חֻקֶּיךָ:ו אָז לֹא אֵבוֹשׁ בְּהַבִּיטִי אֶל כָּל מִצְוֹתֶיךָ:ז אוֹדְךָ בְּיֹשֶׁר לֵבָב בְּלָמְדִי מִשְׁפְּטֵי צִדְקֶךָ:ח אֶת חֻקֶּיךָ אֶשְׁמֹר אַל תַּעַזְבֵנִי עַד מְאֹד:
נקרא  34  פעמים

לוח מודעות

למעלה