/** * الدالة الرئيسية التي يتم تشغيلها عند حفظ المقال. * * @param int $post_id معرّف المقال. * @param WP_Post $post كائن المقال. * @param bool $update هل هو تحديث أم إنشاء جديد. */ function attfi_add_title_to_image( $post_id, $post, $update ) { // 1. تحقق من الشروط الأساسية لتجنب التشغيل غير الضروري // ---------------------------------------------------- // إذا كان هذا حفظاً تلقائياً، لا تفعل شيئاً. if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { return; } // تحقق من أن نوع المقال هو 'post' (يمكنك إضافة أنواع أخرى مثل 'page') if ( 'post' !== $post->post_type ) { return; } // تحقق من وجود صورة بارزة if ( ! has_post_thumbnail( $post_id ) ) { return; } // منع التكرار اللانهائي (Loop) // نضع علامة مؤقتة للتأكد من أننا لا نقوم بتشغيل الدالة مرة أخرى بعد تحديث الصورة if ( get_post_meta( $post_id, '_attfi_processing', true ) ) { return; } // 2. جلب البيانات المطلوبة // --------------------------------- $post_title = get_the_title( $post_id ); $thumbnail_id = get_post_thumbnail_id( $post_id ); $image_path = get_attached_file( $thumbnail_id ); // المسار الفعلي للصورة على السيرفر // تأكد من أن ملف الصورة موجود فعلاً if ( ! file_exists( $image_path ) ) { return; } // 3. معالجة النص العربي (مهم جداً) // ------------------------------------ // مكتبة GD لا تدعم اللغة العربية (RTL) بشكل افتراضي. نحتاج لمكتبة مساعدة. // سنستخدم مكتبة Ar-PHP لعكس النص وتشكيله بشكل صحيح. // قم بتنزيلها من هنا: https://github.com/ar-php/ar-php // وضع مجلد I18N داخل مجلد الإضافة. if ( file_exists( plugin_dir_path( __FILE__ ) . 'I18N/Arabic.php' ) ) { require_once plugin_dir_path( __FILE__ ) . 'I18N/Arabic.php'; $Arabic = new I18N_Arabic('Glyphs'); $post_title = $Arabic->utf8Glyphs($post_title); } // إذا لم تكن المكتبة موجودة، سيبقى النص مقطعاً، لكن الكود سيعمل. // 4. إعدادات الصورة والنص // ------------------------- $font_path = plugin_dir_path( __FILE__ ) . 'fonts/Cairo-Bold.ttf'; // مسار الخط $font_size = 40; // حجم الخط (يمكن تغييره) // جلب معلومات الصورة (العرض، الارتفاع، النوع) list( $img_width, $img_height, $img_type ) = getimagesize( $image_path ); // إنشاء الصورة من الملف الأصلي بناءً على نوعها switch ( $img_type ) { case IMAGETYPE_JPEG: $image = imagecreatefromjpeg( $image_path ); break; case IMAGETYPE_PNG: $image = imagecreatefrompng( $image_path ); break; case IMAGETYPE_GIF: $image = imagecreatefromgif( $image_path ); break; default: return; // نوع صورة غير مدعوم } // تحديد الألوان (النص أبيض، مع ظل أسود خفيف لزيادة الوضوح) $text_color = imagecolorallocate( $image, 255, 255, 255 ); // أبيض $shadow_color = imagecolorallocate( $image, 0, 0, 0 ); // أسود // 5. حساب مكان النص و كتابته // ----------------------------- // حساب أبعاد مربع النص لتوسيطه $text_box = imagettfbbox( $font_size, 0, $font_path, $post_title ); $text_width = $text_box[2] - $text_box[0]; $text_height = $text_box[7] - $text_box[1]; // حساب إحداثيات (X, Y) لتوسيط النص أفقياً ووضعه في الثلث السفلي عمودياً $x = ( $img_width / 2 ) - ( $text_width / 2 ); $y = $img_height - ($img_height / 3); // يمكنك تعديل هذه القيمة // إضافة الظل أولاً (بإزاحة بسيطة) imagettftext( $image, $font_size, 0, $x + 2, $y + 2, $shadow_color, $font_path, $post_title ); // إضافة النص الأساسي فوق الظل imagettftext( $image, $font_size, 0, $x, $y, $text_color, $font_path, $post_title ); // 6. حفظ الصورة الجديدة ورفعها إلى ووردبريس // --------------------------------------------- $upload_dir = wp_upload_dir(); $file_info = pathinfo( $image_path ); $new_filename = $file_info['filename'] . '-titled.jpg'; // اسم الملف الجديد $new_filepath = $upload_dir['path'] . '/' . $new_filename; // حفظ الصورة الجديدة كـ JPG imagejpeg( $image, $new_filepath, 90 ); // 90 هي جودة الصورة imagedestroy( $image ); // تحرير الذاكرة // إدراج الصورة الجديدة كمرفق في مكتبة الوسائط $attachment = array( 'guid' => $upload_dir['url'] . '/' . $new_filename, 'post_mime_type' => 'image/jpeg', 'post_title' => preg_replace( '/\.[^.]+$/', '', $new_filename ), 'post_content' => '', 'post_status' => 'inherit' ); $new_attachment_id = wp_insert_attachment( $attachment, $new_filepath, $post_id ); // إنشاء البيانات الوصفية للصورة (thumbnails, etc.) require_once( ABSPATH . 'wp-admin/includes/image.php' ); $attach_data = wp_generate_attachment_metadata( $new_attachment_id, $new_filepath ); wp_update_attachment_metadata( $new_attachment_id, $attach_data ); // 7. تعيين الصورة الجديدة كصورة بارزة للمقال // -------------------------------------------- // ضع علامة بأننا نقوم بالمعالجة الآن لمنع التكرار update_post_meta( $post_id, '_attfi_processing', true ); // تعيين الصورة الجديدة set_post_thumbnail( $post_id, $new_attachment_id ); // (اختياري) يمكنك هنا حذف الصورة القديمة التي تم توليدها سابقاً إذا أردت // لكننا سنتخطى هذه الخطوة للتبسيط // إزالة العلامة بعد الانتهاء delete_post_meta( $post_id, '_attfi_processing' ); } // ربط الدالة مع حدث حفظ المقال (لنوع المقالات 'post' فقط) add_action( 'save_post_post', 'attfi_add_title_to_image', 10, 3 );