با انتشار وردپرس نسخه ۳.۰، امکان افزودن «انواع نوشته سفارشی» به قالبهای وردپرس اضافه شد که ابزار بسیار مفیدی است و من هم بارها در قالبهایی که ساختهام از آن استفاده کردم. این روزها انواع نوشتههای سفارشی بسیار محبوب شدهاند و تقریباً در هر قالب وردپرسی دیده میشوند. اما اکثر افرادی که با این قابلیت کار کردهاند احتمالاً با خطای ۴۰۴ Not Found هنگام تلاش برای باز کردن نوشتهای از نوع سفارشی خود مواجه شدهاند. خوشبختانه رفع این خطاها معمولاً راهحل سادهای دارد. در ادامه تعدادی از مشکلات رایجی که افراد هنگام استفاده از انواع نوشته سفارشی با آنها روبرو میشوند و دلیل ایجاد این خطاها را توضیح دادهام. امیدوارم این راهنماییها به شما کمک کند.
راهنمای مطالعه:
تنظیمات پیوند یکتا را بررسی کنید
این معمولاً یکی از دلایل رایج مشاهده خطای ۴۰۴ در انواع نوشته سفارشی است و خودم هم زیاد با آن سروکار داشتهام. راهحلهای مختلفی مثل ریست کردن قوانین بازنویسی (که خیلی توصیه نمیکنم) وجود دارد، اما معمولاً با این راهحل ساده موفق بودهام:
راهحل:
- ساختار دلخواه پیوند یکتا را (مثل %postname%) انتخاب کنید
- روی ذخیره کلیک کنید
- بررسی کنید که آیا صفحات تکی نوشته شما همچنان خطای ۴۰۴ میدهند
- اگر مشکلی وجود داشت، دوباره پیوند یکتا را روی حالت پیشفرض بگذارید و ذخیره کنید
- حالا مجدداً ساختار دلخواه را انتخاب و ذخیره کنید
معمولاً با چند بار تغییر و ذخیره این تنظیمات مشکل رفع میشود و خودم هم اغلب نتیجه گرفتهام.
البته اگر تنظیمات دسترسی روی سرور درست نباشد، شاید این روش جواب ندهد و مجبور شوید فایل .htaccess را به صورت دستی ویرایش کنید. برای این کار باید با استفاده از FTP یا SFTP وارد سایت شوید و به پوشه ریشه وردپرس بروید (همان جایی که فایل wp-config.php و پوشه wp-content قرار دارد). در این مسیر باید فایل .htaccess را پیدا کنید و ویرایش کنید (اگر نمیبینید مطمئن شوید گزینه نمایش فایلهای مخفی در برنامه FTP شما فعال باشد، یا اگر اصلاً وجود ندارد، یک فایل جدید بسازید). حالا مطمئن شوید این فایل شامل کد اصلی وردپرس طبق مستندات وردپرس باشد که شبیه این است:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
توجه: اگر در حال ویرایش فایل .htaccess هستید، حتماً یک نسخه پشتیبان روی رایانه خود ذخیره کنید تا در صورت مشکل، دسترسی داشته باشید.
بررسی تداخل نامک (slug) با صفحهای همنام با نوع نوشته سفارشی
یکی دیگر از دلایل بروز خطا این است که صفحهای برای نمایش نوشتههای نوع سفارشی ساختهاید که نامک آن با نامک تکنوشته این نوع نوشته یکسان است. مثلاً اگر نوع نوشتهای به نام «پورتفولیو» دارید و همزمان یک صفحه اصلی با نام «پورتفولیو» ایجاد کردهاید و هر دو نامک یکسان (مثلاً “portfolio”) دارند (در واقع برای مشاهده یک نوشته باید به سایت.com/portfolio/sample-post بروید)، این کار باعث تداخل و نمایش خطای ۴۰۴ خواهد شد. معمولاً به همین دلیل است که برای نوع نوشته پورتفولیو، نامکهایی مثل «projects» یا «portfolio-item» انتخاب میکنند.
راهحل:
- میتوانید نام صفحه را تغییر دهید تا با نوع نوشته سفارشی متفاوت باشد
- یا اینکه نامک نوع نوشته سفارشی را تغییر دهید که این کار با تغییر پارامتر rewrite هنگام ثبت نوع نوشته سفارشی انجام میشود
فلش خودکار قوانین بازنویسی (برای توسعهدهندگان)
هر بار که یک نوع نوشته جدید ثبت میشود، نیاز است قوانین بازنویسی وردپرس را «فلش» یا بهروزرسانی کنید. این کار را با مراجعه به تنظیمات > پیوندهای یکتا و کلیک روی دکمه ذخیره انجام میدهید (در بخش اول توضیح داده شد).
اگر روی پوسته یا افزونهای کار میکنید که نوع نوشته سفارشی دارد، میتوانید کاری کنید که با فعال شدن پوسته یا افزونه، این بهروزرسانی قوانین بازنویسی به طور خودکار انجام شود و کاربران با خطای ۴۰۴ مواجه نشوند. نمونه کد مورد نیاز در زیر آمده است:
// Code for themes
add_action( 'after_switch_theme', 'flush_rewrite_rules' );
// Code for plugins
register_deactivation_hook( __FILE__, 'flush_rewrite_rules' );
register_activation_hook( __FILE__, 'myplugin_flush_rewrites' );
function myplugin_flush_rewrites() {
// call your CPT registration function here (it should also be hooked into 'init')
myplugin_custom_post_types_registration();
flush_rewrite_rules();
}
سوال یا راهحل دیگری دارید؟
اگر با خطای دیگری روبرو هستید یا راهحل بهتری سراغ دارید، در بخش نظرات با ما در میان بگذارید تا دیگران هم استفاده کنند. ممنون از شما!
اطمینان از تعریف درست تابع پشتیبانی از آرگومانها
یک اشتباه دیگر هنگام ثبت نوع نوشته سفارشی، فراموش کردن برخی آرگومانهای مهم در تابع register_post_type است. به طور خاص، برخی توسعهدهندگان فراموش میکنند آرگومان 'public' => true و 'has_archive' => true را تعیین کنند. نبود این پارامترها باعث خواهد شد لینکهای آرشیو یا نوشته تکی به درستی ایجاد نشوند یا باز نشوند.
نمونه تنظیم صحیح:
register_post_type( 'portfolio',
array(
'labels' => array(
'name' => __( 'پورتفولیو' ),
'singular_name' => __( 'نمونه کار' ),
),
'public' => true,
'has_archive' => true,
'rewrite' => array( 'slug' => 'projects' ),
)
);
در مثال بالا، تعیین مقدار has_archive علاوه بر نمایش درست آرشیو، قوانین بازنویسی را نیز تکمیل میکند.
استفاده از افزونههای بهینهسازی و مشکلات کش (Cache)
اگر از افزونههایی مثل WP Super Cache، W3 Total Cache یا افزونههای مشابه استفاده میکنید، ممکن است پس از ثبت یا ویرایش انواع نوشته سفارشی، کش سایت باعث بروز خطا یا عدم نمایش صحیح مطالب شود. در این صورت:
- کش افزونه را یک بار کامل پاکسازی (پـُرج) کنید.
- اگر از سرویسهای کش سمت سرور (مثل LiteSpeed Cache یا کش در کنترلپنل هاستینگ) استفاده میکنید، آن را نیز خالی (Clear Cache) نمایید.
این کار را هنگام هر بار تغییر ساختار پیوند یکتا یا تعریف نوع نوشته سفارشی جدید انجام دهید.
بررسی ماژول mod_rewrite و پشتیبانی سرور
وردپرس برای مدیریت پیوندهای یکتا (Permalinks) به ماژول mod_rewrite سرور نیاز دارد. اگر روی یک لوکال هاست یا سرور جدید کار میکنید، حتماً مطمئن شوید که این ماژول فعال است. نبود این سرویس روی سرور باعث میشود پیوندهای شما بهخصوص برای انواع نوشته سفارشی کاملاً به صورت ساده یا حتی ناسالم کار کنند.
- در لوکال هاست XAMPP یا WAMP: وارد بخش Apache > Modules شده و mod_rewrite را فعال کنید.
- در هاست لینوکس: با پشتیبانی هاست خود تماس بگیرید یا از بخش مدیریت سرور وضعیت این ماژول را بررسی کنید.
بررسی افزونههای ناسازگار یا تداخلدار
افزونههایی که با قوانین بازنویسی (Rewrite Rules) کار میکنند میتوانند باعث اختلال در نمایش انواع نوشته سفارشی شوند. اگر بعد از نصب افزونه خاصی با خطای ۴۰۴ روبرو شدید، موقتا آن افزونه را غیرفعال کنید و تست نمایید.
- افزونههای امنیتی (مانند iThemes Security یا Wordfence)
- افزونههای مدیریت پیوند یکتا (Permalink Manager و مشتقات آن)
- افزونههایی با قابلیت ایجاد نوع نوشته سفارشی (CPT UI و …)
گاهی اوقات ترتیب عملکرد این افزونهها با تنظیمات قالب شما تداخل پیدا میکند.
رفع مشکل هنگام استفاده از افزونههای ایجاد کننده سازنده صفحه (Page Builder)
برخی افزونههای Page Builder، مانند Elementor یا WPBakery، هنگام استفاده با نوع نوشته سفارشی نیازمند تنظیم جداگانه هستند تا از همان ساختار پیوند یکتا پشتیبانی کنند. برای هر نوع نوشته سفارشی باید مطمئن شوید که پشتیبانی Page Builder فعال است.
مثلاً در افزونه المنتور: از منوی «المنتور > تنظیمات» نوع نوشته سفارشی را فعال کنید تا امکانات این افزونه برای نوع نوشته شما فعال شود.
فعال کردن پشتیبانی از taxonomy و دستهبندیها
اگر برای انواع نوشته سفارشی خود دستهبندی یا برچسب خاصی ایجاد کردهاید، حتماً باید بخش مربوط به taxonomies را نیز موقع ثبت نوع نوشته مشخص کنید تا نشانیهای مطالب به درستی پردازش شود.
register_post_type('book', array(
'public' => true,
'taxonomies' => array('category', 'post_tag')
));
در صورت فراموشی این تنظیم، ممکن است ساختار آدرسدهی شما با خطا روبرو شود.

دیدگاه و پرسش