פלאגינים ומציאת hook-ים

וורדפרס ניתן להרחבה באמצעות גישת תכנות שבה המתכנת מפעיל בנקודות ריצה מסוימות הרחבות שנכתבו בנפרד.

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

לדוגמא – הרחבת (פלאגין) WooCommerce מחליף את הקוד woocommerce_cart (כאשר מוקף בסוגריים מרובעים) בתוכן המציג את סל הקניות. למשל עכשיו תוכן סל הקניות הוא:

סל הקניות שלך ריק כרגע.

חזור לחנות

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

כדי לכתוב הרחבה, למשל ל WooCommerce, נצטרך לדעת באילו קודים השתמשו המתכנתים. למרות שיש Codex וניתן תיאורטית למצוא את הקודים המתאימים מהתיעוד, לעתים משימה זאת מורכבת. לכן מוצעת להלן גישה פשוטה, אשר רושמת לתוך קובץ את כל הפעלות (do_action או apply_filter). גישה זאת פשוטה אך גוזלת משאבי ולכן נפעיל אותה רק לצרכי בדיקה בשרת פיתוח (לא בשרתים פעילים).

השינוי מתבצע בקובץ wp-includes/plugin.php. נוסיף את הפונקציה הבאה:

function CoreLog( $msg, $file = 'core.log' )
{

$error_file = '/tmp/' . $file;
$date = date( 'd.m.Y H:i:s' );
$log = $date . ": " . $msg . "\n";
$f= fopen($error_file, "a");
fwrite($f, $date . ':' . $msg . PHP_EOL);
fclose($f);

}

כעת נוסיף הודעות באחת משתי הפונקציות: do_action או apply_filters:

function do_action( $tag, …$arg ) {

CoreLog($tag);

כעת, כאשר נפעיל את הדף, ירשמו לקובץ הפעולות שבוצעות. /tmp/core.log

שיטה זאת יעילה לכמה מקרים:

  • גילוי סדר הפעלת הקודים. (באגים רבים נובעים מהנחות (סמויות) לגבי סדר הטעינה של פלאגינים).
  • למצוא קודים של פעולות שקשורות לדף מסוים.

כדי למצוא את פרטי פקודות ה AJAX שהופעלה נוסיף פלט של מערך $_POST. שדה action יכלול את הקוד שהופעל. שם ה Hook יהיה wp_ajax_woocommerce_ ולאחריו שם ה action. לדוגמא – עדכון עגלת הקניות מעמדת הניהול מפעיל את הפונקציה calc_line_taxes. כדי לשנות את ההתנהגות יש לרשום פונקציה נוספת לטיפול ב hook זה:

add_action('wp_ajax_woocommerce_calc_line_taxes', array($this, 'update_prices'), 10);

יעקב

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *