استيراد المنشورات تلقائيًا من Google Sheets إلى ووردبريس

استيراد المنشورات تلقائيًا من Google Sheets إلى ووردبريس

لو بتكتب مقالاتك في 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: رابط مباشر لصورة (اختياري).

شكل الشيت (مثال):

واجهة Google Sheets فارغة قبل الإعداد


الخطوة 2) افتح محرّر Apps Script من الشيت

من قائمة Extensions > Apps Script هيتفتح لك محرر السكربت.

واجهة المحرر:

واجهة محرر Google 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**. أول مرة هتُسأل تمنح أذونات؛ وافق.

![تشغيل الدالة ومشاهدة الـ Execution log](https://www.googleapis.com/download/storage/v1/b/spreadsheetdev-content/o/spreadsheetdev%2F198RhWcPZvuhpjmcCnP4nuQhr2_Rt73wFit6tUONBaP4%2F5709.png?alt=media&generation=1630809920881457)

---

الخطوة 5) أنشئ Application Password في ووردبريس

1) من لوحة التحكم: Users > Profile.
2) انزل لقسم Application Passwords.
3) اكتب اسم (مثلاً: Google Sheets Sync) واضغط Add New Application Password.
4) انسخ كلمة المرور واحفظها.

نافذة تفويض كلمة مرور تطبيق في ووردبريس


الخطوة 6) استخدم القائمة المخصصة داخل الشيت

مثال لقائمة مخصّصة داخل Google Sheets


الخطوة 7) جدولة التشغيل التلقائي (Triggers)

شاشة إعداد المشغّلات الزمنية في Apps Script


تنبيهات وأخطاء شائعة

  • 401 Unauthorized: راجع البريد وكلمة المرور.
  • 403 أو 404: تأكد من صحة الرابط وفتح REST API.
  • IDs للفئات/الوسوم: استخدم الأرقام (تظهر في روابط لوحة التحكم).
  • الصورة المميزة: لازم يكون الرابط مباشر.

جاهز؟

  • اكتب مقالاتك في الشيت.
  • اضغط مزامنة الآن.
  • أو فعّل Trigger علشان كل حاجة تحصل تلقائيًا ✨

 

اقرء ايضآ

مصطفى ووردبريس
مصطفى ووردبريس

مصطفى مالك موقع "مصطفى ووردبريس" محترفًا ذا خبرة واسعة في نظام إدارة المحتوى ووردبريس.

المقالات: 293

اترك ردّاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

أنا أقبلPrivacy Policy*

تفاصيل فائقة

نهتم بأدق التفاصيل لنقدم لك موقعًا احترافيًا متكاملًا يجمع بين الجمال والوظائف الذكية. فالتفاصيل الفائقة هي ما يصنع الفرق ويمنح عملك هوية رقمية مميزة.

سرعة تسليم المشروع فى الوقت المحدد

نلتزم دائمًا بتسليم مشروعك في الوقت المحدد دون أي تأخير، مع ضمان أعلى مستويات الجودة والدقة. لأننا نؤمن أن سرعة الإنجاز والالتزام بالمواعيد هو أساس بناء الثقة وتحقيق نجاح أعمالك الرقمية.

حماية فائقة

تمتع بحماية فائقة لموقعك تضمن أمان بياناتك وخصوصية عملائك، مع أحدث أنظمة الأمان والتحديثات المستمرة التي تحميك من أي تهديدات رقمية.