لو بتكتب مقالاتك في Google Sheets وعايز ترفعها تلقائيًا إلى ووردبريس بضغطة زر (أو على جدول زمني)، المقال ده لك — عملي جدًا، خطوة بخطوة، وبالصور.
المتطلبات السريعة
- موقع ووردبريس مُفعل فيه REST API (مفعّل افتراضيًا في ووردبريس الحديث).
- حساب مستخدم لديه صلاحية نشر (Editor أو Author على الأقل).
- Application Password لحسابك في ووردبريس (هننشئها بعد شوية).
- ملف Google Sheets فيه الأعمدة:
post_id
,title
,content
,status
,categories
,tags
,featured_image
.
فكرة العمل باختصار: بنقرأ الصفوف من Google Sheets، وننشئ/نحدّث منشورات في ووردبريس عبر REST API. لو المنشور جديد نكتب الـ
post_id
الراجع من ووردبريس في الشيت، ولو موجود نعمل له تحديث.
الخطوة 1) جهّز ورقة Google Sheets
أنشئ شيت جديدة واسمها مثلًا Posts، وأضف الأعمدة التالية في الصف الأول بالترتيب:
post_id | title | content | status | categories | tags | featured_image
- post_id: يفضل تركها فاضية للصفوف الجديدة — هنملأها تلقائيًا بعد الإنشاء.
- status: اكتب
draft
أوpublish
. - categories وtags: اكتب أرقام المعرفات IDs مفصولة بفواصل (مثل:
2,9
). - featured_image: رابط مباشر لصورة (اختياري).
شكل الشيت (مثال):
الخطوة 2) افتح محرّر Apps Script من الشيت
من قائمة Extensions > Apps Script هيتفتح لك محرر السكربت.
واجهة المحرر:
لو أول مرة تستخدمه، الصورة دي بتبين أقسام المحرر الرئيسية 👇
الخطوة 3) ضع الكود التالي (في جدول مخصص للأكواد)
اسم الجزء | الكود |
---|---|
إعدادات ووردبريس والشيت | “`javascript |
const WP_BASE = ‘https://example.com‘; // بدون / في النهاية | |
const WP_USER = ‘you@example.com‘; | |
const WP_APP_PASSWORD = ‘xxxx xxxx xxxx xxxx’; // انسخها كما تظهر لك (بها مسافات) |
const SHEET_NAME = 'Posts';
const HEADERS = {
id: 'post_id',
title: 'title',
content: 'content',
status: 'status',
categories: 'categories',
tags: 'tags',
featured: 'featured_image'
};
| **إضافة القائمة المخصصة وتشغيل المزامنة** | ```javascript
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('WordPress')
.addItem('مزامنة الآن', 'syncSheet')
.addSeparator()
.addItem('مزامنة الصف المحدد', 'syncActiveRow')
.addToUi();
}
function syncSheet() {
const sheet = SpreadsheetApp.getActive().getSheetByName(SHEET_NAME);
const data = sheet.getDataRange().getValues();
const headerMap = mapHeaders(data[0]);
for (let r = 1; r < data.length; r++) {
const row = toObject(data[r], headerMap);
if (!row[HEADERS.title] || !row[HEADERS.content]) continue;
try {
const id = upsertPost(row);
if (id) sheet.getRange(r + 1, headerMap[HEADERS.id] + 1).setValue(id);
} catch (e) {
Logger.log(`Row ${r+1}: ${e}`);
}
}
SpreadsheetApp.getActive().toast('تمت المزامنة');
}
function syncActiveRow() {
const sheet = SpreadsheetApp.getActive().getSheetByName(SHEET_NAME);
const r = sheet.getActiveRange().getRow();
if (r === 1) return;
const data = sheet.getRange(1,1,sheet.getLastRow(),sheet.getLastColumn()).getValues();
const headerMap = mapHeaders(data[0]);
const row = toObject(data[r-1], headerMap);
const id = upsertPost(row);
if (id) sheet.getRange(r, headerMap[HEADERS.id] + 1).setValue(id);
}
``` |
| **دوال النشر والرفع** | ```javascript
function upsertPost(row) {
const token = Utilities.base64Encode(`${WP_USER}:${WP_APP_PASSWORD}`);
const headers = { 'Authorization': `Basic ${token}`, 'Content-Type':'application/json' };
let payload = {
title: row[HEADERS.title],
content: row[HEADERS.content],
status: row[HEADERS.status] || 'draft'
};
if (row[HEADERS.categories]) {
payload.categories = String(row[HEADERS.categories]).split(',').map(s => parseInt(s.trim(),10)).filter(n => !isNaN(n));
}
if (row[HEADERS.tags]) {
payload.tags = String(row[HEADERS.tags]).split(',').map(s => parseInt(s.trim(),10)).filter(n => !isNaN(n));
}
if (row[HEADERS.featured] && /^https?:\/\//i.test(row[HEADERS.featured])) {
const mediaId = uploadImage(row[HEADERS.featured], headers);
if (mediaId) payload.featured_media = mediaId;
}
const options = { method: 'post', headers, muteHttpExceptions: true, payload: JSON.stringify(payload) };
let res;
if (row[HEADERS.id]) {
res = UrlFetchApp.fetch(`${WP_BASE}/wp-json/wp/v2/posts/${row[HEADERS.id]}`, options);
} else {
res = UrlFetchApp.fetch(`${WP_BASE}/wp-json/wp/v2/posts`, options);
}
const json = tryParseJSON(res.getContentText());
if (res.getResponseCode() >= 200 && res.getResponseCode() < 300 && json && json.id) {
return json.id;
} else {
throw new Error(json && json.message ? json.message : `HTTP ${res.getResponseCode()}`);
}
}
function uploadImage(url, baseHeaders) {
try {
const resp = UrlFetchApp.fetch(url);
const blob = resp.getBlob();
const filename = `sheet-img-${Date.now()}.${(blob.getContentType().split('/').pop() || 'jpg')}`;
const headers = Object.assign({}, baseHeaders, {
'Content-Disposition': `attachment; filename="${filename}"`,
'Content-Type': blob.getContentType()
});
const res = UrlFetchApp.fetch(`${WP_BASE}/wp-json/wp/v2/media`, {
method: 'post', headers, payload: blob, muteHttpExceptions: true
});
const json = tryParseJSON(res.getContentText());
return (json && json.id) ? json.id : null;
} catch (e) {
Logger.log(`uploadImage error: ${e}`);
return null;
}
}
``` |
| **مساعدات** | ```javascript
function mapHeaders(headerRow) {
const map = {};
headerRow.forEach((name, idx) => map[String(name).trim().toLowerCase()] = idx);
Object.keys(HEADERS).forEach(k => {
if (map[String(HEADERS[k]).toLowerCase()] === undefined) {
throw new Error(`العمود "${HEADERS[k]}" غير موجود`);
}
});
const pos = {};
Object.keys(HEADERS).forEach(k => pos[HEADERS[k]] = map[String(HEADERS[k]).toLowerCase()]);
return pos;
}
function toObject(row, map) {
const obj = {};
Object.keys(map).forEach(key => obj[key] = row[map[key]] || '');
return obj;
}
function tryParseJSON(s){ try { return JSON.parse(s);} catch(e){ return null; } }
``` |
---
## الخطوة 4) شغّل السكربت لأول مرة ومنح الأذونات
من شريط الأدوات اختَر الدالة (مثلًا `syncSheet`) واضغط **Run**. أول مرة هتُسأل تمنح أذونات؛ وافق.

---
الخطوة 5) أنشئ Application Password في ووردبريس
1) من لوحة التحكم: Users > Profile.
2) انزل لقسم Application Passwords.
3) اكتب اسم (مثلاً: Google Sheets Sync) واضغط Add New Application Password.
4) انسخ كلمة المرور واحفظها.
الخطوة 6) استخدم القائمة المخصصة داخل الشيت
الخطوة 7) جدولة التشغيل التلقائي (Triggers)
تنبيهات وأخطاء شائعة
- 401 Unauthorized: راجع البريد وكلمة المرور.
- 403 أو 404: تأكد من صحة الرابط وفتح REST API.
- IDs للفئات/الوسوم: استخدم الأرقام (تظهر في روابط لوحة التحكم).
- الصورة المميزة: لازم يكون الرابط مباشر.
جاهز؟
- اكتب مقالاتك في الشيت.
- اضغط مزامنة الآن.
- أو فعّل Trigger علشان كل حاجة تحصل تلقائيًا ✨
اقرء ايضآ