وردپرس و ووکامرس
سازندگان صفحه
بخش بزرگی از سایتهای وردپرس دنیای واقعی بهجای گوتنبرگ ساده از یک سازنده صفحه استفاده میکنند. افزونه Pitchbar، صفحات هر سازنده پشتیبانیشده را با API بومی خود سازنده قبل از ارسال HTML به دستیار فروش Pitchbar نمایش میدهد، بنابراین محتوای همگامسازیشده همان چیزی است که بازدیدکننده واقعاً میبیند.
این صفحه نحوه عملکرد تشخیص + نمایش، سازندگان پشتیبانیشده و نحوه لغو رفتار با یک فیلتر را توضیح میدهد.
چرا این مهم است
بیشتر سازندگان صفحه، صفحه نمایش داده شده را در post_content ذخیره نمیکنند. آنها درخت چیدمان را در postmeta نگهداری کرده و HTML را در زمان نمایش دوباره ترکیب میکنند. اگر مسیر همگامسازی شما بهسادگی post_content را خوانده و apply_filters('the_content', …) را فراخوانی کند، دریافت خواهید کرد:
- Elementor: رشته خالی. چیدمان بهطور کامل در
_elementor_datapostmeta قرار دارد. - Bricks: خالی. چیدمان در
_bricks_page_content_2. - Oxygen: یک کد کوتاه
[oxygen_html]ساده. چیدمان واقعی درct_builder_shortcodespostmeta است. - Beaver Builder: HTML "بازگشت" خلاصهشده اگر سازنده هرگز فرصت لغو پیدا نکند.
- Divi: چیدمان رمزگذاریشده با کد کوتاه در
post_content. فقط زمانی بهدرستی نمایش داده میشود که حلقه پست بهدرستی مقداردهی اولیه شود.
راهنمای PageBuilderContent افزونه هر مورد را بهطور صریح مدیریت میکند. اولین تطابق برنده است. پستی که به هیچ سازنده تشخیصدادهشدهای تعلق ندارد، به مسیر the_content ساده بازمیگردد.
سازندگان پشتیبانیشده
| سازنده | postmeta تشخیص | نمایشدهنده |
|---|---|---|
| Elementor (رایگان + حرفهای) | _elementor_edit_mode = builder |
\Elementor\Plugin::$instance->frontend->get_builder_content_for_display($id, true) |
| Beaver Builder | _fl_builder_enabled = 1 |
FLBuilder::render_content_by_id($id) |
| Oxygen Builder | ct_builder_shortcodes (غیرخالی) |
do_shortcode($shortcodes) |
| Bricks Builder | _bricks_page_content_2 (غیرخالی) و BRICKS_VERSION تعریف شده |
\Bricks\Frontend::render_content($payload) |
| Divi | _et_pb_use_builder = on |
از طریق فیلتر the_content (با setup_postdata مقداردهی اولیه) هدایت میشود. |
هر نمایشدهنده در try/catch (Throwable) پیچیده شده است. یک نمایشدهنده سازنده که خطا میدهد، بهطور بیصدا به تشخیص بعدی یا مسیر ساده بازمیگردد، بنابراین یک نسخه ارتقایافته سازنده که API داخلی خود را تغییر میدهد، هرگز نمیتواند همگامسازی را با خطای مهلک متوقف کند.
چرا Divi متفاوت است
Divi چیدمان خود را در post_content ذخیره میکند — بهعنوان نشانهگذاری رمزگذاریشده با کد کوتاه مانند [et_pb_section][et_pb_row][et_pb_column][et_pb_text]…. کدهای کوتاه فقط زمانی از طریق زنجیره فیلتر وردپرس بهدرستی حل میشوند که حلقه پست مقداردهی اولیه شود: $GLOBALS['post'] تنظیم شده و setup_postdata() فراخوانی شده باشد.
بسیاری از افزونههای شخص ثالث (Yoast، Jetpack، پردازشگرهای نصب) نیز بازخوانیهای the_content خود را براساس یک $post سراسری معتبر محدود میکنند. بدون مقداردهی اولیه دادههای پست، هر یک از آنها زود بازمیگردند و HTML همگامسازیشده فاقد بخشهایی است که صفحه را واقعاً مفید میکند.
رفع در نسخه v2.0.0 افزونه ارسال شد: PostContentExtractor همیشه $GLOBALS['post'] را مقداردهی اولیه کرده و setup_postdata() را در اطراف زنجیره فیلتر فراخوانی میکند، کار را در try/finally میپیچد و $GLOBALS['post'] را بازیابی کرده و wp_reset_postdata() را حتی اگر یک فیلتر خطا دهد، فراخوانی میکند.
شکل داده در ارتباط
برای یک صفحه Elementor با عنوان "قیمتگذاری"، افزونه HTML کاملاً نمایش داده شده را دقیقاً همانطور که مرورگر دریافت میکند به /api/v1/wp/posts/sync ارسال میکند — از جمله پوششهای بخش، HTML ویجت و نامهای کلاس خود Elementor. سپس Pitchbar تگها را در سمت سرور برای تکهتکه کردن حذف میکند، بنابراین نامهای کلاس در جستجوی هوشمند قرار نمیگیرند.
نمونه payload برشخورده (برای خوانایی کوتاه شده):
{
"wp_id": 142,
"post_type": "page",
"permalink": "https://shop.example/pricing",
"title": "Pricing",
"content_html": "<div class=\"elementor elementor-142\"><section class=\"elementor-section …\">…</section>…</div>",
"excerpt": "سه پلن، دو نتیجه…",
"content_hash": "ab12…ef90",
"modified_at": "2026-05-09T14:30:00+00:00",
"language": "fa-ir",
"taxonomy_terms": []
}
لغو HTML نمایش داده شده
فیلتر pitchbar_post_content_html HTML نهایی را پس از اجرای نمایشدهنده سازنده (یا پس از اجرای زنجیره فیلتر ساده، برای پستهای غیر سازنده) دریافت میکند — بنابراین میتوانید آن را بدون توجه به اینکه کدام سازنده مالک صفحه است، پسپردازش کنید:
add_filter('pitchbar_post_content_html', function ($html, $post, $builder) {
// $builder یکی از: 'elementor', 'beaver', 'oxygen', 'bricks',
// 'divi' یا null برای پستهای ساده گوتنبرگ/کلاسیک است.
if ($builder === 'elementor') {
// iframeهای کمکی Elementor را که خزندهها نمیبینند، حذف کنید.
$html = preg_replace('#<iframe[^>]*data-elementor-[^>]*>.*?</iframe>#is', '', $html);
}
return $html;
}, 10, 3);
بازگرداندن یک رشته خالی، همگامسازی را برای آن پست متوقف میکند (Pitchbar محتوای خالی را میپذیرد اما دستیار فروش چیزی برای بازیابی نخواهد داشت). بازگرداندن null بقیه زنجیره فیلتر را کوتاه میکند.
زمانی که یک سازنده ارتقا مییابد و خراب میشود
سازندگان صفحه دورهای نمایشدهندههای داخلی خود را تغییر نام میدهند — زمانی که این اتفاق میافتد، فراخوانی مبتنی بر بازتاب افزونه به مسیر بعدی بازمیگردد و پست بهگونهای همگامسازی میشود که گویی یک پست معمولی گوتنبرگ است. نتیجه کاهش مییابد (ممکن است یک رشته خالی یا یک کد کوتاه دریافت کنید)، اما خود همگامسازی با خطای مهلک متوقف نمیشود.
اگر متوجه شدید که یک نسخه خاص از سازنده محتوای خالی تولید میکند، یک مسئله در مخزن Pitchbar با نام سازنده + نسخه باز کنید. راهحل معمولاً یک بهروزرسانی یک خطی به فراخوانی نمایشدهنده در PageBuilderContent است.
محدودیتها
- ویجتهای داده پویا. "برچسبهای پویا" Elementor Pro که دادههای زنده را دریافت میکنند (تعداد سبد خرید، نام کاربران) با بازگشت پیشفرض خود زمانی که هیچ بازدیدکننده واقعی در محدوده نیست، نمایش داده میشوند.
- قوانین نمایش شرطی. قوانین دید که به بازدیدکننده درخواستدهنده بستگی دارند (فقط واردشده، موقعیت جغرافیایی، انواع A/B) در برابر زمینه درخواست همگامسازی که سمت سرور است، حل میشوند. بخشهای محدود به "فقط کاربران واردشده" همگامسازی نمیشوند.
- بلوکهای درونخطی با بارگذاری تنبل. محتوای فقط جاوااسکریپت (ریز-فرانتاندهای React نصبشده بهعنوان ویجتهای HTML Elementor) هرگز در سمت سرور اجرا نمیشوند، بنابراین HTML همگامسازیشده، جایگیرنده را منعکس میکند، نه محتوای هیدراته شده.
این موارد ذاتی نمایش سمت سرور یک چیدمان سازنده هستند و برای هر افزونه CMS که همین کار را انجام میدهد (تولیدکنندههای نقشه سایت Yoast SEO، افزونههای نشانهگذاری طرحواره و غیره) اعمال میشوند.