سال‌ها پیش در پروژه‌ای، برای نصب یک افزونه ساده که فقط یک متن به انتهای نوشته‌ها اضافه می‌کرد، مدیر سایت نگران بار اضافه روی سرور بود. به‌جای افزونه، شش خط کد در چایلد تم نوشتم و همان کار انجام شد، با صفر بار اضافه. آن تجربه به یک عادت تبدیل شد: هر بار که کاری با چند خط کد قابل انجام است، اول به کد فکر می‌کنم، بعد به افزونه. در این مقاله، ۵۰ قطعه کد آماده وردپرس را در دسته‌های مختلف جمع کرده‌ام؛ همان‌هایی که در پروژه‌های واقعی بارها استفاده کرده‌ام.

یادآوری مهم پیش از هر چیز: پیش از اضافه کردن هر قطعه کد، از سایت بکاپ بگیرید و کد را در چایلد تم یا افزونه snippets نگه دارید. اگر با مفهوم چایلد تم آشنا نیستید، ابتدا قالب چایلد وردپرس چیست را بخوانید. همچنین برای درک کلی، پست‌های قطعه کد وردپرس چیست و افزودن کد سفارشی به وردپرس پیش‌نیاز خوبی هستند.

بخش اول: تنظیمات پایه (۱ تا ۷)

این کدها، پایه‌ای‌ترین تنظیمات هر سایت وردپرسی هستند. معمولاً در فایل functions.php چایلد تم قرار می‌گیرند.

۱. حذف نسخه وردپرس از head

remove_action( 'wp_head', 'wp_generator' );

این کد نسخه وردپرس شما را از کدهای head حذف می‌کند و کمی سطح امنیت را بالا می‌برد.

۲. حذف متاتگ generator از RSS

add_filter( 'the_generator', '__return_empty_string' );

۳. تغییر طول خلاصه نوشته

add_filter( 'excerpt_length', function() { return 30; } );

عدد ۳۰، تعداد کلمات خلاصه است؛ می‌توانید به دلخواه تغییر دهید.

۴. غیرفعال کردن ایموجی‌های وردپرس

remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'wp_print_styles', 'print_emoji_styles' );

ایموجی‌های وردپرس برای سایت‌های فارسی معمولاً لازم نیستند و بار اضافه می‌سازند.

۵. حذف پارامتر ver از فایل‌های CSS و JS

add_filter( 'script_loader_src', 'remove_ver_param' );
add_filter( 'style_loader_src', 'remove_ver_param' );
function remove_ver_param( $src ) {
    if ( strpos( $src, 'ver=' ) ) {
        $src = remove_query_arg( 'ver', $src );
    }
    return $src;
}

این کد به کش‌پذیری بهتر فایل‌ها کمک می‌کند.

۶. افزودن لوگو سفارشی به صفحه لاگین

add_action( 'login_enqueue_scripts', function() { ?>
    <style>
        #login h1 a {
            background-image: url('/wp-content/uploads/logo.png');
            background-size: contain;
            width: 200px;
        }
    </style>
<?php } );

۷. غیرفعال کردن XML-RPC

add_filter( 'xmlrpc_enabled', '__return_false' );

XML-RPC یکی از رایج‌ترین نقاط حمله Brute Force است. اگر از اپلیکیشن موبایل وردپرس استفاده نمی‌کنید، آن را غیرفعال کنید.

قطعه کد، جایگزین افزونه است، نه جایگزین استراتژی؛ اول بفهمید چه می‌خواهید، بعد کد بزنید.

بخش دوم: پیشخوان (۸ تا ۱۳)

۸. تغییر متن فوتر پیشخوان

add_filter( 'admin_footer_text', function() {
    return 'مدیریت سایت توسط تیم ما';
} );

۹. حذف منوهای اضافی از پیشخوان

add_action( 'admin_menu', function() {
    remove_menu_page( 'edit-comments.php' );
    remove_menu_page( 'tools.php' );
} );

اگر از بخش دیدگاه‌ها استفاده نمی‌کنید، حذف منو، پیشخوان را تمیزتر می‌کند.

۱۰. افزودن ستون سفارشی به لیست نوشته‌ها

add_filter( 'manage_posts_columns', function( $cols ) {
    $cols['post_id'] = 'شناسه';
    return $cols;
} );
add_action( 'manage_posts_custom_column', function( $col, $id ) {
    if ( $col === 'post_id' ) echo $id;
}, 10, 2 );

۱۱. تغییر رنگ پیشخوان

add_action( 'admin_head', function() { ?>
    <style>
        #adminmenu { background: #1a202c; }
    </style>
<?php } );

۱۲. مخفی کردن اعلان‌های به‌روزرسانی برای غیرمدیر

add_action( 'admin_head', function() {
    if ( ! current_user_can( 'manage_options' ) ) {
        remove_action( 'admin_notices', 'update_nag', 3 );
    }
} );

۱۳. تغییر ترتیب منوهای پیشخوان

add_filter( 'custom_menu_order', '__return_true' );
add_filter( 'menu_order', function() {
    return [ 'index.php', 'edit.php', 'upload.php', 'edit.php?post_type=page' ];
} );

بخش سوم: محتوا و نوشته‌ها (۱۴ تا ۲۰)

۱۴. افزودن متن به انتهای هر نوشته

add_filter( 'the_content', function( $content ) {
    if ( is_single() ) {
        $content .= '<p>ممنون که این مطلب را خواندید.</p>';
    }
    return $content;
} );

۱۵. افزودن متاباکس سفارشی

add_action( 'add_meta_boxes', function() {
    add_meta_box( 'custom_box', 'تنظیمات ویژه', function( $post ) {
        echo '<input type="text" name="custom_field" value="' . esc_attr( get_post_meta( $post->ID, 'custom_field', true ) ) . '" />';
    }, 'post' );
} );

۱۶. ذخیره متادیتا هنگام ذخیره نوشته

add_action( 'save_post', function( $id ) {
    if ( isset( $_POST['custom_field'] ) ) {
        update_post_meta( $id, 'custom_field', sanitize_text_field( $_POST['custom_field'] ) );
    }
} );

توجه: همیشه داده ورودی را پاک‌سازی کنید. مسیر کامل در افزودن کد سفارشی به وردپرس آمده است.

۱۷. محدود کردن تعداد ریویژن‌ها

define( 'WP_POST_REVISIONS', 5 );

این خط در wp-config.php قرار می‌گیرد و حجم دیتابیس را کنترل می‌کند.

۱۸. تغییر تعداد نوشته در آرشیو

add_action( 'pre_get_posts', function( $q ) {
    if ( $q->is_main_query() && ! is_admin() ) {
        $q->set( 'posts_per_page', 12 );
    }
} );

۱۹. غیرفعال کردن پینگ‌بک و ترک‌بک

add_filter( 'xmlrpc_methods', function( $methods ) {
    unset( $methods['pingback.ping'] );
    unset( $methods['pingback.extensions.getPingbacks'] );
    return $methods;
} );

۲۰. ساخت شورت‌کد ساده

add_shortcode( 'current_year', function() {
    return date_i18n( 'Y' );
} );

برای نمونه‌های بیشتر، پست ساخت شورت‌کد در وردپرس را ببینید.

شورت‌کد درست، محتوای شما را از قالب جدا می‌کند؛ شورت‌کد نادرست، محتوا را گروگان می‌گیرد.

بخش چهارم: کاربران (۲۱ تا ۲۵)

۲۱. مخفی کردن بخش کاربران از غیرمدیر

add_action( 'admin_menu', function() {
    if ( ! current_user_can( 'manage_options' ) ) {
        remove_menu_page( 'users.php' );
    }
} );

۲۲. افزودن فیلد سفارشی به پروفایل

add_action( 'show_user_profile', 'custom_profile_field' );
add_action( 'edit_user_profile', 'custom_profile_field' );
function custom_profile_field( $user ) { ?>
    <h3>اطلاعات تکمیلی</h3>
    <table class="form-table">
        <tr><th>کد ملی</th>
        <td><input type="text" name="national_id" value="<?php echo esc_attr( get_user_meta( $user->ID, 'national_id', true ) ); ?>" /></td></tr>
    </table>
<?php }

۲۳. ذخیره فیلد سفارشی پروفایل

add_action( 'personal_options_update', 'save_custom_profile' );
add_action( 'edit_user_profile_update', 'save_custom_profile' );
function save_custom_profile( $user_id ) {
    if ( isset( $_POST['national_id'] ) ) {
        update_user_meta( $user_id, 'national_id', sanitize_text_field( $_POST['national_id'] ) );
    }
}

کار با User Meta در User Meta در وردپرس کامل‌تر توضیح داده شده است.

۲۴. تغییر نقش پیش‌فرض کاربران جدید

add_filter( 'pre_option_default_role', function() {
    return 'subscriber';
} );

۲۵. محدود کردن دسترسی ادمین بر اساس IP

add_action( 'init', function() {
    if ( is_admin() && ! in_array( $_SERVER['REMOTE_ADDR'], [ '1.2.3.4', '5.6.7.8' ] ) ) {
        wp_die( 'دسترسی مسدود است' );
    }
} );

بخش پنجم: امنیت (۲۶ تا ۳۱)

۲۶. غیرفعال کردن ویرایشگر فایل پیشخوان

define( 'DISALLOW_FILE_EDIT', true );

این خط در wp-config.php قرار می‌گیرد.

۲۷. مخفی کردن پیام خطای ورود

add_filter( 'login_errors', function() {
    return 'اطلاعات ورود اشتباه است.';
} );

این کد جلوی افشای این‌که «نام کاربری اشتباه است یا رمز عبور» را می‌گیرد.

۲۸. افزودن هدرهای امنیتی

add_action( 'send_headers', function() {
    header( 'X-Frame-Options: SAMEORIGIN' );
    header( 'X-Content-Type-Options: nosniff' );
    header( 'Referrer-Policy: strict-origin-when-cross-origin' );
} );

۲۹. محدود کردن REST API برای غیرلاگین

add_filter( 'rest_authentication_errors', function( $result ) {
    if ( ! is_user_logged_in() ) {
        return new WP_Error( 'rest_forbidden', 'دسترسی محدود', [ 'status' => 401 ] );
    }
    return $result;
} );

۳۰. پاکسازی آپلود SVG

add_filter( 'wp_handle_upload_prefilter', function( $file ) {
    if ( $file['type'] === 'image/svg+xml' ) {
        $content = file_get_contents( $file['tmp_name'] );
        if ( preg_match( '/(<script|onload=|javascript:)/i', $content ) ) {
            $file['error'] = 'SVG حاوی کد مخرب است';
        }
    }
    return $file;
} );

۳۱. غیرفعال کردن ورود با ایمیل اشتباه

add_filter( 'authenticate', function( $user, $username, $password ) {
    if ( $user instanceof WP_User ) {
        return $user;
    }
    return new WP_Error( 'invalid', 'نام کاربری یا رمز عبور نادرست است.' );
}, 20, 3 );

بخش ششم: سرعت و بهینه‌سازی (۳۲ تا ۳۷)

۳۲. فعال‌سازی lazy-load تصاویر

add_filter( 'wp_lazy_loading_enabled', '__return_true' );

این ویژگی از وردپرس ۵.۵ به‌صورت پیش‌فرض فعال است، ولی اگر قالب یا افزونه آن را غیرفعال کرده باشد، این کد آن را برمی‌گرداند.

۳۳. به تعویق انداختن JS غیرضروری

add_filter( 'script_loader_tag', function( $tag, $handle ) {
    if ( ! is_admin() && ! in_array( $handle, [ 'jquery', 'jquery-core' ] ) ) {
        return str_replace( ' src', ' defer src', $tag );
    }
    return $tag;
}, 10, 2 );

۳۴. حذف Query String از فایل‌های استاتیک

پیش‌تر در کد شماره ۵ آمده است.

۳۵. Preload فونت اصلی قالب

add_action( 'wp_head', function() {
    echo '<link rel="preload" href="/wp-content/themes/my/fonts/main.woff2" as="font" type="font/woff2" crossorigin>';
}, 1 );

۳۶. محدود کردن Heartbeat API

add_filter( 'heartbeat_settings', function( $settings ) {
    $settings['interval'] = 60;
    return $settings;
} );

Heartbeat API در پیشخوان هر ۱۵ ثانیه یک درخواست می‌فرستد. افزایش به ۶۰ ثانیه، بار سرور را کم می‌کند.

۳۷. حذف اسکریپت ایموجی از فرانت

add_action( 'init', function() {
    remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
    remove_action( 'wp_print_styles', 'print_emoji_styles' );
} );
پیش از هر کد بهینه‌سازی، اول عدد بگیرید؛ بعد تغییر دهید؛ بعد عدد بگیرید. بدون اندازه‌گیری، کد فقط یک حدس است.

بخش هفتم: ووکامرس (۳۸ تا ۴۲)

۳۸. تغییر متن دکمه افزودن به سبد

add_filter( 'woocommerce_product_add_to_cart_text', function() {
    return 'خرید';
} );

۳۹. حذف فیلد از تسویه‌حساب

add_filter( 'woocommerce_checkout_fields', function( $fields ) {
    unset( $fields['billing']['billing_company'] );
    return $fields;
} );

۴۰. افزودن متن به صفحه محصول

add_action( 'woocommerce_after_single_product_summary', function() {
    echo '<p>ارسال رایگان برای سفارش‌های بالای ۵۰۰ هزار تومان</p>';
}, 15 );

۴۱. محدود کردن خرید به کاربران لاگین

add_action( 'template_redirect', function() {
    if ( class_exists( 'WooCommerce' ) && ! is_user_logged_in() && is_product() ) {
        wp_redirect( wc_get_page_permalink( 'myaccount' ) );
        exit;
    }
} );

۴۲. تغییر تعداد محصول در صفحه آرشیو

add_filter( 'loop_shop_per_page', function() { return 24; } );

برای مسائل سفارشی‌سازی فروشگاه، پست سفارشی‌سازی صفحه محصول ووکامرس را ببینید.

بخش هشتم: سئو و رسانه (۴۳ تا ۴۷)

۴۳. افزودن اتوماتیک alt به تصویر شاخص

add_filter( 'wp_get_attachment_image_attributes', function( $attr, $attachment ) {
    if ( empty( $attr['alt'] ) ) {
        $attr['alt'] = get_the_title( $attachment->ID );
    }
    return $attr;
}, 10, 2 );

۴۴. افزودن متاتگ Open Graph

add_action( 'wp_head', function() {
    if ( is_single() ) {
        echo '<meta property="og:title" content="' . esc_attr( get_the_title() ) . '">';
        echo '<meta property="og:description" content="' . esc_attr( get_the_excerpt() ) . '">';
    }
} );

۴۵. محدود کردن ابعاد تصاویر آپلودی

add_filter( 'wp_handle_upload_prefilter', function( $file ) {
    $size = getimagesize( $file['tmp_name'] );
    if ( $size && ( $size[0] > 3000 || $size[1] > 3000 ) ) {
        $file['error'] = 'ابعاد تصویر بیش از حد بزرگ است';
    }
    return $file;
} );

۴۶. حذف sitemap وردپرس

add_filter( 'wp_sitemaps_enabled', '__return_false' );

اگر از افزونه سئو استفاده می‌کنید، بهتر است sitemap وردپرس را غیرفعال کنید تا دو sitemap متناقض نداشته باشید.

۴۷. افزودن نویسه‌های ویژه فارسی به alt تصویر

add_filter( 'sanitize_file_name', function( $name ) {
    $name = str_replace( [ 'ي', 'ك' ], [ 'ی', 'ک' ], $name );
    return $name;
} );

برای مفاهیم مرتبط، پست‌های سئوی درون‌صفحه و سئوی تصویر را ببینید.

بخش نهم: پاکسازی دیتابیس (۴۸ تا ۵۰)

۴۸. حذف ترنزینت‌های قدیمی

global $wpdb;
$wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_%' AND option_value < UNIX_TIMESTAMP() - 86400" );

این کد به پاکسازی گزینه‌های موقت منقضی کمک می‌کند. ترنزینت‌ها را در Options API وردپرس توضیح داده‌ام.

۴۹. حذف ریویژن‌های اضافی

global $wpdb;
$wpdb->query( "DELETE FROM {$wpdb->posts} WHERE post_type = 'revision'" );

توجه: پیش از اجرا، از دیتابیس بکاپ بگیرید.

۵۰. حذف کرون‌های زمان‌بندی‌شده

add_action( 'init', function() {
    wp_clear_scheduled_hook( 'my_custom_cron_event' );
} );

پاکسازی کرون‌های بی‌استفاده، مصرف منابع هاست را کم می‌کند. راهنمای کامل در عیب‌یابی cron وردپرس.

خط پایان

پنجاه قطعه کد این مقاله، بخش عمده‌ای از نیازهای روزمره سایت‌های وردپرسی را پوشش می‌دهند. سه نکته پایانی که در همه پروژه‌ها رعایت می‌کنم:

  1. پیش از هر کد، بکاپ بگیرید: یک بار بی‌احتیاطی می‌تواند کل سایت را از کار بیندازد. مسیر بکاپ وردپرس راهنمای امن است.
  2. کد را در چایلد تم یا افزونه snippets نگه دارید: هرگز فایل قالب والد را دست نزنید. راهنمای چایلد تم وردپرس همین را توضیح می‌دهد.
  3. هر کد اضافه، یک بدهی فنی است: کمتر بنویسید، مرکزی نگه دارید، و بعد از شش ماه، کدهایی که استفاده نمی‌شوند را حذف کنید. اشتباهات رایج در این زمینه در اشتباهات رایج در استفاده از کد آماده آمده است.

اگر قطعه کد کاربردی دیگری دارید که در این فهرست نبوده و در پروژه‌های واقعی جواب داده، در دیدگاه‌ها بنویسید. فهرست پنجاه‌گانه را با تجربه‌های شما کامل‌تر می‌کنم و در نسخه بعدی این مقاله منتشر می‌شود. 🧩