| کانال وردپرس |
Статистика⭕️ کانال وردپرس دولوپیکس 💠 دولوپیکس | جامعه توسعهدهندگان ایرانی 💎 @Developix 🚀 Developix.ir 📌 پشتیبانی و تبلیغات: @DevelopixSupport
- Последний пост
- 14 авг.
- Последнее чтение
- 13 авг.
- Постов за неделю
- 1
- Всего постов
- 27
- Тип
- открытый
- Язык
- персидский
- В каталоге с
- 13 авг.
- 1/24сутки в ленте
- 153
- 1/48двое суток
- 175
- 1/72трое суток
- 189
Оценка по просмотрам недавних постов: пост набирает почти всё за первые сутки.
Посты
без подписи
Dependency Injection در پلاگینهای وردپرس 💉 خیلی وقتها توی توسعه پلاگین وردپرس، همهچیز را میبریم داخل یک کلاس بزرگ: queryها، لاگها، ارسال ایمیل، تنظیمات و… نتیجه؟ کد سختخوان، سختتست و پر از وابستگی پنهان 🤕 یکی از راهحلهای جدی برای این مشکل در معماری نرمافزار، استفاده از Dependency Injection (DI) است. Dependency Injection یعنی چی؟ بهجای اینکه یک کلاس خودش وابستگیها را بسازد، آنها را از بیرون دریافت میکند. یعنی بهجای: class My_Plugin { private $mailer; public function __construct() { $this->mailer = new Wp_Mailer(); } } مینویسیم: class My_Plugin { private $mailer; public function __construct( Wp_Mailer $mailer ) { $this->mailer = $mailer; } } حالا My_Plugin فقط از Wp_Mailer استفاده میکند، ولی مسئول ساختنش نیست. این یعنی coupling کمتر و تستپذیری بیشتر ✅ نمونه ساده در پلاگین وردپرس فرض کن یک کلاس لاگگیر و یک سرویس سفارش داریم: class Logger { public function info( $message ) { error_log( '[my-plugin] ' . $message ); } } class Order_Service { private $logger; public function __construct( Logger $logger ) { $this->logger = $logger; } public function create( $data ) { // logic... $this->logger->info( 'Order created: ' . $data['id'] ); } } class My_Plugin_Bootstrap { public function run() { $logger = new Logger(); $order_service = new Order_Service( $logger ); add_action( 'init', function () use ( $order_service ) { // استفاده از $order_service } ); } } اینجا My_Plugin_Bootstrap نقش یک container خیلی ساده را دارد و وابستگیها را میسازد و تزریق میکند. چرا برای وردپرس مفید است؟ • راحتتر میشود کلاسها را جداگانه تست کرد 🧪 • برای جایگزین کردن implementation (مثلاً یک Logger جدید) فقط نقطه ساخت را عوض میکنی • کد کمتر به global و singletonهای سفتوسخت وابسته میشود نکته عملی برای پروژههای بزرگتر میتوان از containerهای آماده PHP مثل PHP-DI استفاده کرد، ولی در اکثر پلاگینهای وردپرسی همین container ساده با چند کلاس bootstrap کاملاً جواب میدهد. قدمبهقدم اگر وابستگیها را تزریق کنی، معماری پلاگین تمیزتر، قابلگسترشتر و حرفهایتر میشود 💪 🔖 #Wordpress #وردپرس #Dependency_Injection #Wordpress #PHP #Clean_Code #Architecture 👤 Developix 💎 Channel: @DevelopixWordpress
با Migration Boost هاستایران، برای مهاجرت به سرور ابری دوباره هزینه ترافیک نده! 🚀 با خرید اولین سرور ابری غیرساعتی از **هاستایران**، بسته ترافیک هدیه مهاجرت بهصورت خودکار برای سرویس شما فعال میشود: ✅ حداقل ۱۰۰ گیگابایت ترافیک هدیه مهاجرت ✅ افزایش حجم هدیه متناسب با ظرفیت دیسک اولیه ✅ ترافیک آپلود رایگان ✅ بدون محدودیت زمانی سرور ابری هاستایران را راهاندازی کنید و بکاپها، فایلها و پایگاه داده خود را بدون دغدغه هزینههای پنهان ترافیک منتقل کنید. 👇 مشاهده پلنهای سرور ابری هاستایران hostiran.club/Migration hostiran.club/Migration
⚡️ بهینهسازی سرعت وردپرس با WP Super Cache سرعت سایت وردپرسی مستقیماً روی سئو و تجربه کاربر تاثیر میگذاره. یکی از سادهترین و در عین حال حرفهایترین کارها، راهاندازی Page Cache با پلاگین معروف WP Super Cache ـه که توسط تیم رسمی WordPress.org توسعه داده میشه. ایدهٔ اصلی اینه که بهجای اجرای مداوم PHP و کوئریهای سنگین MySQL، نسخهی HTML استاتیک صفحات برای کاربر سرو میشه. این یعنی لود خیلی سریعتر، مخصوصاً روی هاستهای اشتراکی. ۱️⃣ نصب و فعالسازی پلاگین از بخش Plugins → Add New عبارت WP Super Cache رو جستوجو و نصب کن، بعد Activate. سپس به Settings → WP Super Cache برو. در تب Easy گزینهٔ Caching On رو انتخاب کن و Save Changes رو بزن. همین یک کار ساده میتونه برای خیلی از سایتها یک تفاوت محسوس ایجاد کنه. 🌱 ۲️⃣ فعالسازی حالت Expert برای کاربرهای جدیتر اگر دسترسی به فایل .htaccess داری و با سرور Apache کار میکنی، از تب Advanced میتونی حالت Expert رو فعال کنی. این کار باعث میشه کش در سطح وبسرور مدیریت بشه و درخواست حتی قبل از رسیدن به PHP پاسخ بگیره. در تب Advanced تیک گزینهٔ: Use mod_rewrite to serve cache files رو بزن و تنظیمات رو ذخیره کن. پلاگین خودش بهصورت خودکار کدهای لازم رو به .htaccess اضافه میکنه. نمونهای از این کد رو این پایین میبینی 👇 # BEGIN WPSuperCache <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_METHOD} !=POST RewriteCond %{QUERY_STRING} ="" RewriteCond %{HTTP_COOKIE} !^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$ RewriteCond %{REQUEST_URI} !^/wp-admin/.* RewriteCond %{REQUEST_URI} !^/wp-login.php RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{HTTP_HOST}%{REQUEST_URI}index.html -f RewriteRule ^(.*)$ /wp-content/cache/supercache/%{HTTP_HOST}%{REQUEST_URI}index.html [L] </IfModule> # END WPSuperCache اگر هاست اجازهٔ ویرایش .htaccess رو نده، پلاگین پیام میده و میتونی این بخش رو دستی در روت وردپرس اضافه کنی. فقط حواست باشه قبل از هر تغییری یک بکاپ کوچک بگیری. 🧯 ۳️⃣ تنظیمات مفید برای دنیای واقعی 🔹 در تب Advanced حتماً این گزینهها رو چک کن: • Compress pages so they’re served more quickly to visitors → فعال کن تا Gzip روی فایلهای کش اعمال بشه. • Don’t cache pages for known users → فعال باشه تا وقتی لاگین هستی، نسخه کششده رو نبینی و راحتتر دیباگ کنی. • Clear all cache files when a post or page is published or updated → فعال باشه تا بعد از انتشار مطلب، کش قدیمی پاک بشه. 🔹 در تب Preload میتونی برای سایتهای شلوغ، Preload فعال کنی تا پلاگین بهصورت دورهای همه صفحات رو پیشکش کنه. این برای سایتهای پر ترافیک که تکیه زیادی روی سئو دارن، خیلی کاربردیه. ۴️⃣ تست سرعت بعد از فعالسازی بعد از تنظیم کش، با ابزارهایی مثل PageSpeed Insights یا GTmetrix سرعت قبل و بعد رو مقایسه کن. معمولاً کاهش First Byte Time و Fully Loaded Time رو خیلی واضح میشه دید. یک نکتهٔ کوچک: اگر روی سایت افزونههای Membership، WooCommerce یا هر چیزی که محتوای داینامیک per-user ارائه میده داری، حتماً تنظیمات عدم کش صفحات خاص (یا کوئری استرینگها) رو در WP Super Cache بررسی کن تا سبد خرید یا پنل کاربری اشتباه کش نشه. در نهایت، همین یک تنظیم نسبتا ساده میتونه حس «سنگینی» وردپرس رو تا حد زیاد از بین ببره. امروز روی یک سایت تست کن و نتیجه رو مقایسه کن ⚙️🚀 🔖 #Wordpress #وردپرس #WordPress #Performance #WP_Super_Cache #Cache #Speed #وردپرس #Optimization 👤 Developix 💎 Channel: @DevelopixWordpress
🏆آفرهای جام جهانی ۲۰۲۶ هاستایران فعال شد! با کمپین «ترکیب برنده سایتت»، زیرساخت سایتت رو برای روزهای پرترافیک آماده کن: 🔥 ۲۵٪ تخفیف روی پلنهای ۳ ماهه هاست اشتراکی ایران ⚡ ۵۰٪ تخفیف روی پلنهای یکماهه سرویس ابری در دیتاسنترهای تهران، مشهد و اهواز 🧠 مشاوره رایگان زیرساخت توسط کارشناسان هاستایران فرصت استفاده از تخفیفها و ثبت فرم مشاوره محدود است. 📌 برای کپی کدهای تخفیف و ثبتنام در فرم مشاوره، روی لینک زیر کلیک کنید: 📌صفحه فرم مشاوره 📌تلگرام هاستایران 📌بله هاستایران #هاست_ایران #سرور_ابری_هاست_ایران #هاست_اشتراکی #دیتاسنتر #مشاوره_زیرساخت #جام_جهانی2026
ساخت یک Custom Post Type برای «پورتفولیو» از اون چیزهاییه که فوراً وردپرسِ ساده رو تبدیل میکنه به یه سایت حرفهای 😎 فرض کن یه سایت شرکتی یا شخصی داری و میخوای نمونهکارها رو جدا از نوشتهها نشون بدی، با URL تمیز، آرشیو جدا و فیلدهای مخصوص خودش. اینجاست که Custom Post Type بهدرد میخوره. این کاریه که خود تیم وردپرس هم توی داکیومنت رسمی پیشنهاد میده: آموزش Register کردن Custom Post Type تو این مثال، یه CPT به اسم portfolio میسازیم که: • توی منوی Admin کنار «Posts» دیده میشه 🧭 • URL ش شبیه /portfolio/project-name باشه 🌐 • آرشیو داشته باشه (لیست همه نمونهکارها) • پشتیبانی از عنوان، ادیتور، عکس شاخص و دستهبندیهای خودش 📌 کجا کد رو بذاریم؟ بهترین حالت برای شروع: داخل فایل functions.php در قالب Child Theme خودت. (یا تمیزترش: ساختن یه پلاگین سادهی اختصاصی، ولی برای شروع همون functions.php اوکیه.) 📦 کد آماده برای ساخت Custom Post Type «Portfolio» function wp_channel_register_portfolio_cpt() { $labels = array( 'name' => 'Portfolio', 'singular_name' => 'Project', 'menu_name' => 'Portfolio', 'name_admin_bar' => 'Project', 'add_new' => 'Add New', 'add_new_item' => 'Add New Project', 'edit_item' => 'Edit Project', 'new_item' => 'New Project', 'view_item' => 'View Project', 'search_items' => 'Search Projects', 'not_found' => 'No projects found', 'not_found_in_trash' => 'No projects in Trash' ); $args = array( 'labels' => $labels, 'public' => true, 'has_archive' => true, 'rewrite' => array( 'slug' => 'portfolio' ), 'menu_position' => 5, 'menu_icon' => 'dashicons-portfolio', 'supports' => array( 'title', 'editor', 'thumbnail' ), 'show_in_rest' => true, ); register_post_type( 'portfolio', $args ); } add_action( 'init', 'wp_channel_register_portfolio_cpt' ); نکتهها 🛠 • show_in_rest => true باعث میشه این CPT توی Gutenberg و REST API هم قابل استفاده باشه؛ یعنی بعداً راحت میتونی با Blockهای اختصاصی یا Headless کار کنی. • اگر بعد از اضافه کردن کد، URL ها 404 دادن، کافیه یه بار بری به: Settings > Permalinks و بدون تغییر، روی Save بزنی تا rewrite rules ریفرش بشن. • میتونی برای این CPT یه Template اختصاصی هم بسازی؛ مثلاً فایل archive-portfolio.php برای لیست همه پروژهها، و single-portfolio.php برای صفحهی هر پروژه. استفادهی واقعی از این روش توی تقریباً هر سایت حرفهای وردپرسی دیده میشه: نمونهکار، دورهها، محصولات سفارشی، Event ها، Property ها و هر چیزی که «نوشتهی معمولی» نیست. امتحانش کن، یه دوتا Project تستی بساز و توی منوی اصلی سایت لینک آرشیو /portfolio/ رو بذار؛ خیلی زود میبینی ساختار سایتت چقدر تمیزتر و قابلمدیریتتر میشه ✨ اگر مفید بود، برای همکار برنامهنویس یا طراح وردپرسیت هم بفرست تا اون هم از Custom Post Type استفاده کنه 🚀 🔖 #Wordpress #وردپرس #WordPress #Custom_Post_Type #Portfolio #functions_php #CPT #register_post_type 👤 Developix 💎 Channel: @DevelopixWordpress
Strategy Pattern برای منطق تخفیف در پلاگینهای وردپرس 🎯 وقتی روی پلاگین فروشگاهی یا افزونه سفارشی برای WooCommerce کار میشود، منطق تخفیف معمولاً اولین جایی است که تبدیل به spaghetti code میشود 😅 یک روز فقط «کد تخفیف ساده» داریم، چند هفته بعد: • تخفیف مناسبتی (جمعه سیاه) • تخفیف بر اساس نقش کاربر (VIP، همکار، …) • تخفیف برای دستهبندی خاص محصول اگر همه اینها داخل یک if / else غولآسا پیادهسازی شود، نگهداریاش عذاب است. اینجا Strategy Pattern بهکمک میآید. ایده اصلی Strategy Pattern 🔧 منطق متغیر (مثلاً «چطور تخفیف را حساب کنیم») از بقیه کد جدا میشود و هر استراتژی در یک کلاس مستقل قرار میگیرد. کدی که قیمت را حساب میکند فقط با یک «اینترفیس» صحبت میکند، نه با جزئیات انواع تخفیف. ساختار ساده در PHP (کاملاً قابل استفاده در پلاگین وردپرس) <?php interface DiscountStrategy { public function calculate($price, $user, $cart): float; } class NoDiscount implements DiscountStrategy { public function calculate($price, $user, $cart): float { return $price; } } class VipUserDiscount implements DiscountStrategy { public function calculate($price, $user, $cart): float { if (in_array('vip', (array) $user->roles, true)) { return $price * 0.8; // 20% تخفیف } return $price; } } class BlackFridayDiscount implements DiscountStrategy { public function calculate($price, $user, $cart): float { return $price * 0.7; // 30% تخفیف } } class PriceCalculator { private DiscountStrategy $strategy; public function __construct(DiscountStrategy $strategy) { $this->strategy = $strategy; } public function finalPrice($price, $user, $cart): float { return $this->strategy->calculate($price, $user, $cart); } } در وردپرس میتوان این استراتژی را بر اساس تنظیمات پنل ادمین یا فیلد option انتخاب کرد و سپس مثلاً در هوک woocommerce_before_calculate_totals استفاده کرد. چند نکته کاربردی برای وردپرس 🧩 • هر Strategy را در فایل جدا (یا فولدر src/Discounts) نگهداری شود تا ساختار پروژه تمیز بماند. • استراتژی پیشفرض (مثل NoDiscount) همیشه تعریف شود تا اگر تنظیمات پلاگین خراب شد، سایت دچار خطای fatal نشود. • برای جلوگیری از Memory Leak یا لود بیمورد، فقط استراتژیهای لازم require یا autoload شوند. منبع برای مطالعه بیشتر Strategy Pattern - refactoring.guru پیادهسازی Strategy Pattern در منطق تخفیف، هم کد را خواناتر میکند هم افزودن کمپینهای جدید را تبدیل به یک کار تمیز و کمخطر میکند. از پروژه بعدی، منطق متغیر را در Strategy جدا شود و از نتیجهاش لذت برده شود 🚀 🔖 #Wordpress #وردپرس #Strategy_Pattern #Design_Pattern #WordPress #WooCommerce #PHP #Clean_Code 👤 Developix 💎 Channel: @DevelopixWordpress
Repository Pattern در پلاگینهای وردپرس 🏗️ یکی از دردسرهای همیشگی در توسعه پلاگین وردپرس این است که کدهای SQL و منطق تجاری قاطی میشوند. همین ترکیب، نگهداری کد را سخت و تستنویسی را تقریبا غیرممکن میکند. اینجا الگوی Repository Pattern حسابی به درد میخورد ✨ با Repository، یک لایه میانی بین منطق اپلیکیشن و دیتابیس (یا حتی WP_Query) میسازیم؛ یعنی بقیه کدها دیگر مستقیم با جدولها، متا و کوئریها کار نمیکنند، فقط با یک اینترفیس تمیز حرف میزنند. مثال ساده برای مدیریت "course" به عنوان post type سفارشی: interface CourseRepositoryInterface { public function all(); public function find( $id ); public function create( array $data ); } class WPCourseRepository implements CourseRepositoryInterface { public function all() { return get_posts([ 'post_type' => 'course', 'posts_per_page' => -1, ]); } public function find( $id ) { return get_post( $id ); } public function create( array $data ) { return wp_insert_post([ 'post_type' => 'course', 'post_title' => $data['title'] ?? '', 'post_status' => 'publish', ]); } } حالا در بقیه بخشهای پلاگین، بهجای پخش کردن get_posts و wp_insert_post، فقط با Repository کار میشود: class CourseService { private $repo; public function __construct( CourseRepositoryInterface $repo ) { $this->repo = $repo; } public function publish_all_courses() { $courses = $this->repo->all(); foreach ( $courses as $course ) { // منطق مربوط به هر course } } } مزایا برای دنیای وردپرس 🚀 • تعویض راحت دیتاسورس: امروز از post_type استفاده میشود، فردا اگر خواستی بری روی جدول اختصاصی با wpdb، فقط داخل Repository را عوض میکنی. • تستنویسی سادهتر: میتوان یک FakeCourseRepository ساخت و بدون نیاز به وردپرس واقعی، روی منطق سرویس تست زد. • کد تمیزتر: صفحههای ادمین، REST API و Cron Job ها دیگر پر از SQL و get_posts نمیشوند. چند نکته کاربردی 🛠️ • اینترفیس Repository را در یک مسیر ثابت (مثلا includes/Domain) نگهدار تا ساختار پروژه قابل فهم بماند. • برای کوئریهای خیلی خاص (فیلتر بر اساس meta و taxonomy) متدهای مشخص داخل Repository تعریف کن تا از تکرار meta_query ها جلوگیری شود. برای مطالعه بیشتر در مورد Repository Pattern: martinfowler.com/eaaCatalog/repository.html کمکم اگر این الگو را در پلاگینهای کوچک خود وارد کنی، رشد پروژه و اضافه کردن فیچرهای جدید خیلی روانتر جلو میرود ✌️ 🔖 #Wordpress #وردپرس #Repository_Pattern #WordPress #Clean_Code #PHP #Design_Pattern 👤 Developix 💎 Channel: @DevelopixWordpress
⏱️ کمکردن لود سرور با تنظیم WordPress Heartbeat خیلی از سایتهای وردپرسی روی هاست اشتراکی بهخاطر Heartbeat API بیدلیل لود میخورند؛ مخصوصاً وقتی چند ادمین همزمان داخل wp-admin هستند. با یک قطعه کد ساده میشود فرکانس Heartbeat را کم کرد و درخواستهای AJAX را سبکتر نگه داشت 🚀 ✅ ایده: کاهش فاصله بین هر درخواست Heartbeat در بخش ادمین تا مثلاً ۶۰ ثانیه. کد را در پلاگین اختصاصی یا فایل functions.php قالب چایلد قرار بده: add_filter( 'heartbeat_settings', function( $settings ) { // کاهش فرکانس Heartbeat در پیشخوان به 60 ثانیه if ( is_admin() ) { $settings['interval'] = 60; } return $settings; } ); 🔹 نتیجه: درخواستهای پسزمینه کمتر، کاهش مصرف CPU و بهبود عملکرد روی هاستهای ضعیف. 🔹 اگر روی سایت از auto-save لحظهای خیلی وابسته نیستی، این عدد حتی میتواند بیشتر هم باشد. مرجع رسمی 👇 WordPress Developer – Heartbeat API امتحان روی سایت استیجینگ انجام شود تا مطمئن شوی همهچیز با جریان کاریات سازگار است 🌱 🔖 #Wordpress #وردپرس #WordPress #Heartbeat_API #Performance #PHP #Backend #وردپرس #بهینهسازی 👤 Developix 💎 Channel: @DevelopixWordpress
🌐 دریافت آپدیتها و پلاگینهای وردپرس در شرایط نت ملی در شرایط فعلی اینترنت (عدم دسترسی به اینترنت بینالملل)، وردپرس نمیتونه به مخزن اصلی وصل بشه و همین باعث میشه: – آپدیت ها انجام نشه – نصب/آپدیت پلاگینها fail بشه برای حل این موضوع، یه راهکار سبک به صورت افزونه (کاملا رایگان) آماده شده که درخواستهای وردپرس به مخزن رسمی رو هندل میکنه و امکان دریافت افزونهها و آپدیتها رو از داخل خود وردپرس فراهم میکنه. ✅ برای فعالسازی افزونه توکن API زیر را از بخش تنظیمات وردپرس، Taba Wp Connect وارد کنید : OnEDGFsyJDHKyHbPYEubSGtjIfB6YfcA 🔖 #Wordpress #وردپرس 👤 Ali 💎 Channel: @DevelopixWordpress
🛡 غیرفعال کردن ویرایش فایل های قالب و پلاگین از داشبورد خیلی وقتها روی سایت وردپرسی چند نفر دسترسی Administrator دارند یا احتمال هک شدن پنل وجود دارد. یکی از اولین کارهای امنیتی این است که ویرایشگر داخلی فایل ها در داشبورد وردپرس غیرفعال شود تا کسی نتواند از طریق Appearance → Theme File Editor یا Plugin File Editor کد مخرب اضافه کند. 🧨 فقط کافی است این خط را داخل فایل wp-config.php (قبل از خط «That's all, stop editing!») اضافه شود: define( 'DISALLOW_FILE_EDIT', true ); از این به بعد منوی ویرایشگر قالب و پلاگین از داشبورد ناپدید میشود و حتی اگر کسی به پنل ادمین برسد، دیگر نمیتواند به راحتی فایل های PHP را از داخل وردپرس ویرایش کند. 🔒 این کار جای بکاپ، محدودیت لاگین یا فایروال را نمیگیرد، اما یک لایه امنیتی ساده و کمهزینه است که روی هر سایت پروداشن وردپرسی باید فعال باشد. 🚀 مرجع رسمی: developer.wordpress.org 🔖 #Wordpress #وردپرس #WordPress #Security #wp_config #DISALLOW_FILE_EDIT #Hardening 👤 Developix 💎 Channel: @DevelopixWordpress
🇮🇷 مخزن داخلی WP Mirror این مخزن برای افرادی که دسترسی به اینترنت بینالمللی ندارند ایجاد شده و به راحتی از طریق اینترنت داخلی قابل دسترسی است. در حال حاضر شامل ۴۰۰ پلاگین اورجینال و رایگان از مخزن رسمی وردپرس است که بدون هیچگونه دستکاری و تغییر در اختیار شما قرار گرفته. به زودی پلاگینهای بیشتری به این مجموعه اضافه خواهد شد. برای دریافت آخرین آپدیتها به صورت رایگان، از لینک زیر استفاده کنید: http://wpexperts.ir مخزن به صورت هفتگی آپدیت میشود. 🔖 #Wordpress #وردپرس 👤 Mojtaba 💎 Channel: @DevelopixWordpress
🔁 ریدایرکت ۳۰۱ حرفهای در وردپرس (بدون خراب کردن سئو) خیلی وقتها توی سایت وردپرسی، آدرس یه نوشته یا صفحه عوض میشه: عوض کردن ساختار permalink، حذف یه دسته، انتقال از /blog/ به ریشه سایت و… اگه برای این آدرسهای قدیمی ریدایرکت درست تنظیم نشه، هم کاربر میره روی 404، هم سئو سایت ضربه میخوره. 😬 امروز یه آموزش کاملاً کاربردی برای مدیریت ریدایرکتها تو وردپرس، هم با پلاگین، هم با یه تکه کد سبک. منبع اصلی ایده و ساختار: Redirection plugin در مخزن رسمی و مستندات رسمی: wp_redirect() ۱️⃣ روش ساده: استفاده از پلاگین Redirection اگه دسترسی به نصب پلاگین داری و هاست معمولیه، این روش خیلی تمیز و امنه. – از منوی Plugins ← Add New – سرچ کن: Redirection (نویسنده: John Godley) – نصب و فعالسازی ✅ بعد از فعالسازی: – برو به: Tools ← Redirection – ویزارد اولیه رو رد کن تا جدولها ساخته بشه. حالا برای ساخت یه ریدایرکت ۳۰۱: – تو بخش "Add new redirection"، • فیلد Source URL: مثلا /old-page/ • فیلد Target URL: مثلا https://example.com/new-page/ • نوع ریدایرکت به صورت پیشفرض ۳۰۱ هست ("Redirections" group). از این به بعد هرکی بره /old-page/، خودکار میره روی /new-page/، بدون 404 و بدون افت سئو. 😎 ۲️⃣ روش دولوپری: ریدایرکت با کد در functions.php اگه پلاگین اضافه نمیخوای، یا روی یه theme اختصاصی کار میکنی، میتونی ریدایرکتهای خاص رو مستقیم با کد هندل کنی. این نمونه کد، اگه کاربر بیاد سراغ /old-page/، با ریدایرکت ۳۰۱ میفرستدش روی /new-page/: add_action( 'template_redirect', function () { // اگر در admin هستیم یا درخواست برای ajax هست، کاری نکن if ( is_admin() || wp_doing_ajax() ) { return; } $requested_path = trim( $_SERVER['REQUEST_URI'], '/' ); // آدرس قدیمی بدون دامنه if ( $requested_path === 'old-page' ) { wp_redirect( home_url( '/new-page/' ), 301 ); exit; } } ); چند نکته مهم از مستندات WordPress: • استفاده از هوک template_redirect برای ریدایرکت، استاندارد و امنه. • همیشه بعد از wp_redirect()، حتماً exit; بذار تا اسکریپت ادامه پیدا نکنه. • برای ساخت URL مقصد، از home_url() استفاده کن تا روی لوکال، استیجینگ و پروداکشن درست کار کنه. کِی پلاگین، کِی کد؟ 🤔 • پلاگین Redirection عالیه وقتی: – ریدایرکت زیاد داری و میخوای UI راحت برای مدیریت داشته باشی. – کسی که سایت رو مدیریت میکنه لزوماً دولوپر نیست. • کد در functions.php یا plugin اختصاصی بهتره وقتی: – پروژه کوچیکه و چند تا ریدایرکت ثابت داری. – روی Performance خیلی حساسی و نمیخوای پلاگین اضافه لود بشه. یه ریدایرکت ۳۰۱ درست، هم کاربر رو خوشحال نگه میداره، هم اعتبار سئوی لینکهای قدیمی رو حفظ میکنه. 🔧 اگه تو پروژههات آدرس عوض میشه، از همین امروز یکی از این دو روش رو روی سایت تست کن و نتیجۀ 404 کمتر رو توی Google Search Console ببین. 🚀 🔖 #Wordpress #وردپرس #WordPress #Redirect #وردپرس #SEO #Redirection_plugin #functions_php 👤 Developix 💎 Channel: @DevelopixWordpress
🎯 ساخت یک Gutenberg بلاک دکمه دانلود در وردپرس اگه با Gutenberg کار میکنی، ساختن بلاک اختصاصی یکی از بهترین راههاست برای تمیز نگه داشتن کدت و دادن کنترل بیشتر به کاربر توی ویرایشگر. اینجا یه نمونه واقعی از ساخت یه بلاک دکمه دانلود (Download Button) رو میبینیم که توی هر برگه یا نوشته میتونی استفادهاش کنی. 👇 ایدهٔ کلی اینه: • یه پلاگین ساده میسازیم. • با @wordpress/scripts کد React/JSX بلاک رو مینویسیم. • بلاک رو با registerBlockType رجیستر میکنیم. این روش کاملاً مطابق داکیومنت رسمی WordPress و آموزش Gutenberg هست: developer.wordpress.org/block-editor/reference-guides/block-api/block-registration/ --- ۱️⃣ ساختار افزونه داخل پوشه wp-content/plugins یه پوشه مثلاً به اسم: wp-download-button-block بساز و حداقل این فایلها رو داشته باش: • wp-download-button-block.php • build/index.js (خروجی Webpack / wp-scripts) --- ۲️⃣ فایل اصلی پلاگین (PHP) داخل wp-download-button-block.php این کد رو بذار: <?php /** * Plugin Name: WP Download Button Block * Description: A simple Gutenberg block for a custom download button. * Author: Your Name * Version: 1.0.0 */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } function wpdbb_register_block() { wp_register_script( 'wpdbb-block-script', plugins_url( 'build/index.js', __FILE__ ), array( 'wp-blocks', 'wp-element', 'wp-editor', 'wp-components', 'wp-i18n' ), filemtime( plugin_dir_path( __FILE__ ) . 'build/index.js' ) ); register_block_type( 'wpdbb/download-button', array( 'editor_script' => 'wpdbb-block-script', ) ); } add_action( 'init', 'wpdbb_register_block' ); این کد اسکریپت بلاک رو رجیستر میکنه و یه بلاک با نام wpdbb/download-button میسازه. --- ۳️⃣ کد بلاک (جاوااسکریپت) داخل build/index.js یه نسخه ساده از بلاک: • توی ویرایشگر: متن دکمه و لینک رو از طریق Inspector Controls تنظیم میکنی. • فرانتاند: یه دکمه با کلاس مشخص برای استایلنویسی CSS رندر میشه. نمونه ساده مطابق الگوی رسمی GitHub (مثل نمونهکدهای گوتنبرگ): github.com/WordPress/gutenberg-examples (در عمل این فایل با Babel/Webpack ساخته میشه؛ نکتهٔ مهم اینه که registerBlockType همین ساختار رو داشته باشه.) --- چند نکتهٔ کاربردی 🔧 • برای راحتی میتونی از @wordpress/create-block استفاده کنی تا اسکلت پلاگین و بلاک رو خودش بسازه. • حتماً برای لینک دکمه rel="nofollow noopener" و target="_blank" رو توی رندر لحاظ کن، مخصوصاً برای لینک فایلهای خارجی. • کلاس اختصاصی مثل .wpdbb-download-btn بذار تا استایلدهی توی theme راحت بشه. --- این بلاک کوچیک توی پروژههای واقعی، مخصوصاً صفحهٔ دانلود فایل، قالبهای آموزشی و فروش فایل، خیلی کمک میکنه که نویسندهها بدون درگیر شدن با HTML، یه دکمه تمیز و یکدست بسازن. 🚀 امتحانش کن روی یه سایت تست، یه استایل ساده توی theme بهش بده و کمکم بلاکهات رو حرفهایتر کن. 🌱 🔖 #Wordpress #وردپرس #WordPress #Gutenberg #Block #Plugin_Development #PHP #JS #Download_Button 👤 Developix 💎 Channel: @DevelopixWordpress
اگه برای هر چیزی تو سایت از نوشته معمولی استفاده میشه، مدیریت محتوا بعد یه مدت شلوغ و خستهکننده میشه. برای همین تو وردپرس میشه با Custom Post Type محتوای جدا مثل «پروژهها»، «دورهها» یا «نمونهکارها» درست کرد 💡 اینجا یه نمونه کاملاً واقعی برای ساخت پستتایپ پروژهها هست که از راهنمای رسمی وردپرس الهام گرفته شده: developer.wordpress.org – Registering Custom Post Types ایده کلی اینه که تو فایل functions.php قالب فرزند یا تو یه پلاگین کوچک شخصی، با تابع register_post_type() یه نوع نوشتهی جدید ثبت میکنیم. بعدش تو ادمین وردپرس یه منوی «پروژهها» داری که جدا از نوشتههاست 😍 نمونه کد کامل و قابل استفاده: <?php // قرار بدید داخل functions.php قالب فرزند // یا داخل یک پلاگین اختصاصی function wpdev_register_projects_cpt() { $labels = array( 'name' => 'پروژهها', 'singular_name' => 'پروژه', 'add_new' => 'افزودن پروژه جدید', 'add_new_item' => 'افزودن پروژه جدید', 'edit_item' => 'ویرایش پروژه', 'new_item' => 'پروژه جدید', 'view_item' => 'مشاهده پروژه', 'search_items' => 'جستجوی پروژهها', 'not_found' => 'چیزی پیدا نشد', 'not_found_in_trash' => 'در زبالهدان چیزی نیست', 'menu_name' => 'پروژهها', ); $args = array( 'labels' => $labels, 'public' => true, 'has_archive' => true, 'show_in_rest' => true, // پشتیبانی Gutenberg 'menu_position' => 5, 'menu_icon' => 'dashicons-portfolio', 'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt' ), 'rewrite' => array( 'slug' => 'projects' ), ); register_post_type( 'project', $args ); } add_action( 'init', 'wpdev_register_projects_cpt' ); نکات مهم 👇 • حتماً بعد از اضافهکردن این کد یک بار از منوی تنظیمات → پیوندهای یکتا روی ذخیره کلیک کن تا rewrite درست بشه و 404 نگیری. • با 'show_in_rest' => true این پستتایپ تو Gutenberg و REST API دیده میشه، یعنی بعداً راحت میتونی بلوک اختصاصی، یا فرانت جدا (مثلاً React) براش بسازی. • با 'supports' مشخص میکنی پروژهها دقیقاً چه امکاناتی داشته باشن (عنوان، ادیتور، تصویر شاخص و ...). برای قالببندی فرانت، میتونی یه فایل archive-project.php برای لیست همه پروژهها و یه single-project.php برای صفحه تکی تو پوشه قالب بسازی؛ وردپرس اتوماتیک از این فایلها استفاده میکنه ✨ (این هم تو مستندات قالببندی توضیح داده شده: Template Hierarchy – Theme Handbook) این کار هم ساختار سایتت رو تمیزتر میکنه، هم برای سئو و توسعه بعدی خیلی کمک میکنه. از همه مهمتر، دستت از افزونههای سنگین جدا میشه و خودت دقیق میدونی پشت صحنه چی داره اتفاق میافته 🔧 امتحانش کن روی یه سایت تستی و چند تا «پروژه» نمونه بساز، خیلی زود میبینی چقدر مدیریت محتوات راحتتر میشه 🙌 🔖 #Wordpress #وردپرس #WordPress #Custom_Post_Type #CPT #Theme_Development #Plugin_Development #Gutenberg #PHP 👤 Developix 💎 Channel: @DevelopixWordpress
ویراک کلود | تجربهی ابری بدون محدودیت ☁️🚀 🎁 ۲۰٪ شارژ هدیه روی اولین واریزی مزیتهایی که واقعاً فرق میسازن: ⚡️ پهنای باند 980 مگ 🌐با IP مازاد ⏱️ راهاندازی فوری 💳 پرداخت ساعتی 🛡 پشتیبانی ۲۴/۷ 💬 هر سوالی داشتی، تیم ما کنارتـه ✅ مناسب استارتاپها، تیمهای فنی، تا سازمانهای بزرگ همین الان شروع کن و با حداکثر منابع، سریعتر رشد کن 👇🏻 📞 تماس سریع: 02191555530 🔗 https://virakcloud.com
سرور اختصاصی تکنت؛ تحویل فوری، بدون قطعی ✅ 🔹 پورت اختصاصی واقعی 🔹 آپلود رایگان 🔹 آپتایم 99.99% تضمینی 🔹 ارائه IP مازاد 🔹 پشتیبانی 24/7 (تیکت + آنلاین) 🔹 نصب سریع 🔹 پرداخت ماهیانه ⏳ ظرفیت محدود — همین الان تماس بگیر و سرویس رو رزرو کن: 📞 02191555530 🔗 https://taknet.ir/services/dedicated-server
🛡️ پاککردن نسخه فایلها از ?ver= بهصورت امن در وردپرس خیلیوقتها برای بهبود سئو یا کمی تمیزتر شدن URLها، دوست داریم ?ver=... از انتهای فایلهای .css و .js حذف شود. اما اگر این کار اشتباه انجام شود، cache مرورگر بههم میریزد و آپدیتها بهموقع نمیرسند. این یک روش امن و تمیز است که فقط نسخهٔ قابلنمایش در URL را برمیدارد، بدون اینکه سیستم داخلی وردپرس را خراب کند. 🚀 ✅ ایده: نسخه را از query string حذف میکنیم، اما handle، وابستگیها و بقیه چیزها دستنخورده میماند. 📌 کد زیر را در functions.php قالب فرزند (child theme) یا در یک پلاگین اختصاصی قرار بدهید: function mytheme_remove_script_style_version( $src ) { $parts = explode( '?ver=', $src ); return $parts[0]; } add_filter( 'style_loader_src', 'mytheme_remove_script_style_version', 10, 1 ); add_filter( 'script_loader_src', 'mytheme_remove_script_style_version', 10, 1 ); 🔍 توضیح کوتاه: - فقط اگر ?ver= در URL باشد، جدا میشود. - خود فایل، handle و ترتیب لود شدن هنوز طبق wp_enqueue_script و wp_enqueue_style کنترل میشود. - برای cache-busting واقعی (مثلاً موقع انتشار نسخهٔ جدید)، بهتر است نسخه را در نام فایل بگذارید، مثل app.v2.1.0.css، نه در query string. ⚠️ نکتهٔ مهم: - اگر از CDN یا پلاگین cache استفاده میشود، بعد از اعمال این کد، حتماً cache را پاک کنید. - برای فایلهایی که همیشه باید سریعاً آپدیت شوند (مثلاً admin.js در محیط ادمین)، بهتر است ?ver= را نگه دارید و برای admin آن را حذف نکنید. برای مطالعهٔ بیشتر دربارهٔ enqueue کردن اسکریپت و استایل در وردپرس: Including CSS & JavaScript — WordPress Developer Resources 🔖 #Wordpress #وردپرس #WordPress #Performance #Speed #Scripts #Styles #functions_php 👤 Developix 💎 Channel: @DevelopixWordpress
🚀 سرور اختصاصی با تنوع منابع برای هر نوع نیاز ⏺پورت اختصاصی ⏺آپلود رایگان ⏺تخفیف پلکانی ترافیک ⏺آپتایم 99.99% ⏺24 ساعت تست رایگان ⏺رائه IP مازاد ⏺پشتیبانی 24/7 ⏺تحویل فوری ⏺ارائه سرویس Colocation ⏺بدون قطعی ⏺پرداخت ماهیانه ⏰ تعداد محدود – برای استفاده از این تخفیف ویژه سریع اقدام کن! برای اطلاعات بیشتر و سفارش، تماس بگیر: 🔺 02191555530 💻 خرید سرور اختصاصی
الگوی Repository در پروژههای وردپرسی 🧩 یکی از Design Patternهایی که توی پروژههای متوسط و بزرگ وردپرسی خیلی کمک میکند، Repository Pattern است. ایدهاش ساده است 👇 بهجای اینکه منطق کوئریهای دیتابیس (WP_Query، get_posts، متاها و…) را وسط templateها و functionها پخش کنیم، همهٔ دسترسی به داده (مثلاً نوشتهها، محصولات، سفارشها) را در یک لایهی جدا به اسم Repository نگه میداریم. 🔹 مزیتها برای پروژه وردپرسی • تمیز شدن کدهای theme و plugin • قابلتست شدن (Unit Test راحتتر) • تغییر راحت منبع داده (مثلاً بعداً REST API یا headless) • جلوگیری از تکرار کوئریهای پیچیده در جاهای مختلف مثال ساده: PostRepository برای نوشتهها فرض کنید چند جا در سایت باید «نوشتههای ویژه» را بگیریم. بهجای تکرار WP_Query، یک Repository میسازیم: class PostRepository { public function getFeaturedPosts($limit = 5) { $args = [ 'post_type' => 'post', 'posts_per_page' => $limit, 'meta_key' => 'is_featured', 'meta_value' => '1', ]; return get_posts($args); } public function getByAuthor($authorId, $limit = 10) { $args = [ 'post_type' => 'post', 'posts_per_page' => $limit, 'author' => $authorId, ]; return get_posts($args); } } حالا در قالب یا plugin، بهجای نوشتن مستقیم WP_Query: $postRepo = new PostRepository(); $featured = $postRepo->getFeaturedPosts(3); کد template تمیزتر میشود و منطق دیتابیس در یک جا متمرکز است ✅ کاربرد در Pluginهای جدیتر برای Custom Post Type مثل product یا course هم میشود ProductRepository، CourseRepository ساخت و همهٔ کوئریهای خاص آن نوع داده را آنجا نوشت. این کار وقتی سایت بزرگ میشود و چند نفر روی آن کار میکنند، جلوی کلی Memory Leak ذهنی و گیجشدن را میگیرد 🙂 چند نکتهٔ تمیزنویسی • Repository فقط روی «داده» تمرکز کند، نه HTML render • اسم متدها معنایی باشد: findPublished() بهتر از get1() • منطق فیلترهای ثابت (مثلاً فقط post_status => 'publish') داخل Repository باشد برای مطالعهٔ بیشتر درباره Repository Pattern (در معماریهای PHP): martinfowler.com/eaaCatalog/repository.html استفاده از این الگو، مخصوصاً در theme و pluginهای تجاری وردپرس، ساختار پروژه را قابلگسترشتر و حرفهایتر میکند. کمکم از پروژههای کوچک شروع شود تا دستتان راه بیفتد 🚀 🔖 #Wordpress #وردپرس #Repository_Pattern #WordPress #PHP #Clean_Code #Design_Patterns 👤 Developix 💎 Channel: @DevelopixWordpress