{"id":276,"date":"2026-05-20T02:46:52","date_gmt":"2026-05-20T02:46:52","guid":{"rendered":"https:\/\/tools.dwiyanti.com\/blog\/?p=276"},"modified":"2026-05-20T02:52:46","modified_gmt":"2026-05-20T02:52:46","slug":"meta-description-custom-field-wordpress","status":"publish","type":"post","link":"https:\/\/tools.dwiyanti.com\/blog\/meta-description-custom-field-wordpress","title":{"rendered":"Meta Description Custom Field WordPress"},"content":{"rendered":"<pre style=\"white-space:pre-wrap\">\n<code>\nPERBEDAAN META TITLE, H1, META DESCRIPTION, DAN EXPERT DI EDITOR WORDPRESS\n-----\n\n Solusi: Buat Meta Description Custom Field + Kembalikan Excerpt ke Fungsi Semula\n\nBaik, saya akan berikan kode lengkapnya. Anda ingin:\n1. \u2705 Meta description CUSTOM (seperti meta title)\n2. \u2705 Excerpt kembali ke fungsi semula (untuk tampilan di blog, bukan untuk meta)\n\nBerikut kode lengkap yang harus Anda TAMBAHKAN di `functions.php`:\n\n---\n\n KODE LENGKAP (Copy Paste di functions.php)\n\n```php\n\/\/ =============================================\n\/\/ META TITLE & META DESCRIPTION CUSTOM FIELDS\n\/\/ =============================================\n\n\/\n * 1. ADD META BOXES UNTUK POST & PAGE\n *\/\nfunction add_custom_seo_metaboxes() {\n    $screens = ['post', 'page'];\n    foreach ($screens as $screen) {\n        \/\/ Meta Title Box\n        add_meta_box(\n            'custom_meta_title_box',\n            '\ud83c\udfaf SEO Meta Title',\n            'custom_meta_title_callback',\n            $screen,\n            'normal',\n            'high'\n        );\n        \n        \/\/ Meta Description Box\n        add_meta_box(\n            'custom_meta_desc_box',\n            '\ud83d\udcdd SEO Meta Description',\n            'custom_meta_desc_callback',\n            $screen,\n            'normal',\n            'high'\n        );\n    }\n}\nadd_action('add_meta_boxes', 'add_custom_seo_metaboxes');\n\n\/\n * 2. META TITLE CALLBACK (di editor)\n *\/\nfunction custom_meta_title_callback($post) {\n    wp_nonce_field('custom_seo_nonce', 'custom_seo_nonce_field');\n    \n    $meta_title = get_post_meta($post-&gt;ID, '_custom_meta_title', true);\n    $use_auto_title = get_post_meta($post-&gt;ID, '_use_auto_title', true);\n    \n    ?&gt;\n    &lt;style&gt;\n        .seo-meta-box { margin: 10px 0; }\n        .seo-meta-box input[type=\"text\"],\n        .seo-meta-box textarea { width: 100%; padding: 8px 12px; border: 1px solid ddd; border-radius: 4px; }\n        .seo-meta-box input:focus, .seo-meta-box textarea:focus { border-color: 2271b1; outline: none; }\n        .seo-counter { font-size: 12px; margin-top: 5px; color: 666; }\n        .seo-preview { background: f0f6fc; padding: 12px; border-radius: 4px; margin-top: 10px; border-left: 4px solid 2271b1; }\n        .seo-preview-title { font-size: 18px; color: 1a0dab; margin-bottom: 5px; }\n        .seo-preview-url { color: 006621; font-size: 13px; margin-bottom: 3px; }\n        .seo-preview-desc { color: 545454; font-size: 13px; }\n        .seo-toggle { background: f5f5f5; padding: 10px; border-radius: 4px; margin-bottom: 15px; }\n    &lt;\/style&gt;\n    \n    &lt;div class=\"seo-meta-box\"&gt;\n        &lt;div class=\"seo-toggle\"&gt;\n            &lt;label&gt;\n                &lt;input type=\"checkbox\" name=\"use_auto_title\" value=\"1\" &lt;?php checked($use_auto_title, '1'); ?&gt;&gt;\n                Gunakan judul postingan sebagai Meta Title (otomatis)\n            &lt;\/label&gt;\n            &lt;p style=\"margin: 5px 0 0 25px; font-size: 12px; color: 666;\"&gt;\ud83d\udca1 Centang jika ingin menggunakan judul biasa&lt;\/p&gt;\n        &lt;\/div&gt;\n        \n        &lt;div id=\"custom-title-field\" style=\"&lt;?php echo ($use_auto_title == '1') ? 'opacity:0.5;' : ''; ?&gt;\"&gt;\n            &lt;label style=\"font-weight: 600;\"&gt;Custom Meta Title:&lt;\/label&gt;\n            &lt;input type=\"text\" name=\"custom_meta_title\" id=\"custom_meta_title\" \n                   value=\"&lt;?php echo esc_attr($meta_title); ?&gt;\" \n                   placeholder=\"Contoh: 5 Cara Merawat Wajah Berminyak | Tips Skincare\"\n                   style=\"margin-top: 5px;\"\n                   &lt;?php echo ($use_auto_title == '1') ? 'disabled' : ''; ?&gt;&gt;\n            &lt;div class=\"seo-counter\" id=\"title-counter\"&gt;0 karakter (ideal: 50-60 karakter)&lt;\/div&gt;\n        &lt;\/div&gt;\n        \n        &lt;div class=\"seo-preview\"&gt;\n            &lt;div class=\"seo-preview-title\" id=\"preview-title\"&gt;\n                &lt;?php echo !empty($meta_title) ? esc_html($meta_title) : get_the_title(); ?&gt;\n            &lt;\/div&gt;\n            &lt;div class=\"seo-preview-url\"&gt;&lt;?php echo home_url('\/'); ?&gt;&lt;\/div&gt;\n            &lt;div class=\"seo-preview-desc\"&gt;Preview di hasil pencarian Google&lt;\/div&gt;\n        &lt;\/div&gt;\n    &lt;\/div&gt;\n    \n    &lt;script&gt;\n    jQuery(document).ready(function($) {\n        var titleInput = $('custom_meta_title');\n        var titleCounter = $('title-counter');\n        var previewTitle = $('preview-title');\n        \n        function updateTitleCounter() {\n            var length = titleInput.val().length;\n            titleCounter.html(length + ' karakter (ideal: 50-60 karakter)');\n            \n            if (length &gt; 70) {\n                titleCounter.css('color', 'd63638');\n            } else if (length &gt;= 50 && length &lt;= 60) {\n                titleCounter.css('color', '00a32a');\n            } else {\n                titleCounter.css('color', '666');\n            }\n            \n            if (titleInput.val()) {\n                previewTitle.text(titleInput.val());\n            } else {\n                previewTitle.text($('title').val());\n            }\n        }\n        \n        $('input[name=\"use_auto_title\"]').on('change', function() {\n            if ($(this).is(':checked')) {\n                $('custom-title-field').css('opacity', '0.5');\n                titleInput.prop('disabled', true);\n                previewTitle.text($('title').val());\n            } else {\n                $('custom-title-field').css('opacity', '1');\n                titleInput.prop('disabled', false);\n                updateTitleCounter();\n            }\n        });\n        \n        titleInput.on('input', updateTitleCounter);\n        $('title').on('input', function() {\n            if (!titleInput.val() && !$('input[name=\"use_auto_title\"]').is(':checked')) {\n                previewTitle.text($(this).val());\n            }\n        });\n        \n        updateTitleCounter();\n    });\n    &lt;\/script&gt;\n    &lt;?php\n}\n\n\/\n * 3. META DESCRIPTION CALLBACK (di editor)\n *\/\nfunction custom_meta_desc_callback($post) {\n    $meta_desc = get_post_meta($post-&gt;ID, '_custom_meta_description', true);\n    $use_excerpt = get_post_meta($post-&gt;ID, '_use_excerpt_as_metadesc', true);\n    \n    ?&gt;\n    &lt;div class=\"seo-meta-box\"&gt;\n        &lt;div class=\"seo-toggle\"&gt;\n            &lt;label&gt;\n                &lt;input type=\"checkbox\" name=\"use_excerpt_as_metadesc\" value=\"1\" &lt;?php checked($use_excerpt, '1'); ?&gt;&gt;\n                Gunakan Excerpt sebagai Meta Description\n            &lt;\/label&gt;\n            &lt;p style=\"margin: 5px 0 0 25px; font-size: 12px; color: 666;\"&gt;\n                \ud83d\udca1 Rekomendasi: &lt;strong&gt;Buat custom&lt;\/strong&gt; untuk hasil SEO maksimal\n            &lt;\/p&gt;\n        &lt;\/div&gt;\n        \n        &lt;div id=\"custom-desc-field\" style=\"margin-top: 15px; &lt;?php echo ($use_excerpt == '1') ? 'opacity:0.5;' : ''; ?&gt;\"&gt;\n            &lt;label style=\"font-weight: 600;\"&gt;Custom Meta Description (khusus SEO):&lt;\/label&gt;\n            &lt;textarea name=\"custom_meta_description\" id=\"custom_meta_description\" \n                      rows=\"3\" style=\"margin-top: 5px;\"\n                      placeholder=\"Contoh: Temukan 5 cara ampuh merawat wajah berminyak dengan bahan alami. Panduan lengkap skincare untuk kulit sehat bebas minyak berlebih.\"\n                      &lt;?php echo ($use_excerpt == '1') ? 'disabled' : ''; ?&gt;&gt;&lt;?php echo esc_textarea($meta_desc); ?&gt;&lt;\/textarea&gt;\n            &lt;div class=\"seo-counter\" id=\"desc-counter\"&gt;\n                &lt;span id=\"desc-chars\"&gt;0&lt;\/span&gt; karakter | \n                &lt;span id=\"desc-status\" style=\"font-weight: 500;\"&gt;&lt;\/span&gt;\n            &lt;\/div&gt;\n        &lt;\/div&gt;\n        \n        &lt;div class=\"seo-preview\"&gt;\n            &lt;div class=\"seo-preview-title\"&gt;&lt;?php echo get_the_title(); ?&gt;&lt;\/div&gt;\n            &lt;div class=\"seo-preview-url\"&gt;&lt;?php echo home_url('\/'); ?&gt;&lt;\/div&gt;\n            &lt;div class=\"seo-preview-desc\" id=\"preview-desc\"&gt;\n                &lt;?php \n                if (!empty($meta_desc)) {\n                    echo esc_html(wp_trim_words($meta_desc, 25));\n                } else {\n                    echo 'Meta description akan tampil di sini...';\n                }\n                ?&gt;\n            &lt;\/div&gt;\n        &lt;\/div&gt;\n        \n        &lt;div style=\"background: fff9e6; padding: 10px; margin-top: 10px; border-left: 4px solid f0b429; font-size: 12px;\"&gt;\n            &lt;strong&gt;\ud83d\udca1 Tips SEO Meta Description:&lt;\/strong&gt;\n            &lt;ul style=\"margin: 5px 0 0 20px;\"&gt;\n                &lt;li&gt;Panjang ideal: &lt;strong&gt;150-160 karakter&lt;\/strong&gt;&lt;\/li&gt;\n                &lt;li&gt;Masukkan keyword utama di awal&lt;\/li&gt;\n                &lt;li&gt;Gunakan Call to Action: \"Pelajari\", \"Dapatkan\", \"Temukan\"&lt;\/li&gt;\n                &lt;li&gt;Buat unik untuk setiap halaman&lt;\/li&gt;\n            &lt;\/ul&gt;\n        &lt;\/div&gt;\n    &lt;\/div&gt;\n    \n    &lt;script&gt;\n    jQuery(document).ready(function($) {\n        var descTextarea = $('custom_meta_description');\n        var descChars = $('desc-chars');\n        var descStatus = $('desc-status');\n        var previewDesc = $('preview-desc');\n        \n        function updateDescCounter() {\n            var text = descTextarea.val();\n            var length = text.length;\n            descChars.text(length);\n            \n            if (length &lt; 120) {\n                descStatus.html('\u274c Terlalu pendek (min 120)').css('color', 'd63638');\n            } else if (length &gt;= 120 && length &lt;= 160) {\n                descStatus.html('\u2705 Ideal untuk SEO!').css('color', '00a32a');\n            } else if (length &gt; 160 && length &lt;= 200) {\n                descStatus.html('\u26a0\ufe0f Agak panjang, bisa dipotong Google').css('color', 'f0b429');\n            } else if (length &gt; 200) {\n                descStatus.html('\u274c Terlalu panjang! Akan dipotong').css('color', 'd63638');\n            }\n            \n            \/\/ Update preview\n            if (text.length &gt; 0) {\n                var previewText = text.length &gt; 160 ? text.substring(0, 157) + '...' : text;\n                previewDesc.text(previewText);\n            } else if ($('input[name=\"use_excerpt_as_metadesc\"]').is(':checked')) {\n                previewDesc.html('&lt;em&gt;Menggunakan excerpt...&lt;\/em&gt;');\n            } else {\n                previewDesc.html('&lt;em style=\"color:999;\"&gt;Belum diisi&lt;\/em&gt;');\n            }\n        }\n        \n        $('input[name=\"use_excerpt_as_metadesc\"]').on('change', function() {\n            if ($(this).is(':checked')) {\n                $('custom-desc-field').css('opacity', '0.5');\n                descTextarea.prop('disabled', true);\n                previewDesc.html('&lt;em&gt;Menggunakan excerpt...&lt;\/em&gt;');\n            } else {\n                $('custom-desc-field').css('opacity', '1');\n                descTextarea.prop('disabled', false);\n                updateDescCounter();\n            }\n        });\n        \n        descTextarea.on('input', updateDescCounter);\n        updateDescCounter();\n    });\n    &lt;\/script&gt;\n    &lt;?php\n}\n\n\/\n * 4. SAVE CUSTOM SEO FIELDS\n *\/\nfunction save_custom_seo_fields($post_id) {\n    if (!isset($_POST['custom_seo_nonce_field']) || \n        !wp_verify_nonce($_POST['custom_seo_nonce_field'], 'custom_seo_nonce')) {\n        return;\n    }\n    \n    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {\n        return;\n    }\n    \n    if (!current_user_can('edit_post', $post_id)) {\n        return;\n    }\n    \n    \/\/ Save Meta Title\n    $use_auto_title = isset($_POST['use_auto_title']) ? '1' : '0';\n    update_post_meta($post_id, '_use_auto_title', $use_auto_title);\n    \n    if (isset($_POST['custom_meta_title']) && $use_auto_title != '1') {\n        update_post_meta($post_id, '_custom_meta_title', sanitize_text_field($_POST['custom_meta_title']));\n    } else {\n        delete_post_meta($post_id, '_custom_meta_title');\n    }\n    \n    \/\/ Save Meta Description\n    $use_excerpt = isset($_POST['use_excerpt_as_metadesc']) ? '1' : '0';\n    update_post_meta($post_id, '_use_excerpt_as_metadesc', $use_excerpt);\n    \n    if (isset($_POST['custom_meta_description']) && $use_excerpt != '1') {\n        update_post_meta($post_id, '_custom_meta_description', sanitize_textarea_field($_POST['custom_meta_description']));\n    } else {\n        delete_post_meta($post_id, '_custom_meta_description');\n    }\n}\nadd_action('save_post', 'save_custom_seo_fields');\n\n\/\n * 5. FUNGSI UNTUK MENDAPATKAN META TITLE (update dari fungsi lama)\n *\/\nfunction get_optimized_meta_title() {\n    global $post;\n    \n    if (is_single() || is_page()) {\n        $custom_title = get_post_meta($post-&gt;ID, '_custom_meta_title', true);\n        $use_auto = get_post_meta($post-&gt;ID, '_use_auto_title', true);\n        \n        if ($use_auto != '1' && !empty($custom_title)) {\n            return $custom_title;\n        }\n        return get_the_title() . ' | ' . get_bloginfo('name');\n    }\n    \n    if (is_front_page() || is_home()) {\n        $title = get_bloginfo('name');\n        $tagline = get_bloginfo('description');\n        return !empty($tagline) ? $title . ' | ' . $tagline : $title;\n    }\n    \n    if (is_category()) {\n        return single_cat_title('', false) . ' | ' . get_bloginfo('name');\n    }\n    \n    if (is_tag()) {\n        return single_tag_title('', false) . ' | ' . get_bloginfo('name');\n    }\n    \n    if (is_author()) {\n        return get_the_author() . ' | ' . get_bloginfo('name');\n    }\n    \n    if (is_search()) {\n        return 'Hasil pencarian: ' . get_search_query() . ' | ' . get_bloginfo('name');\n    }\n    \n    if (is_404()) {\n        return 'Halaman Tidak Ditemukan | ' . get_bloginfo('name');\n    }\n    \n    return get_bloginfo('name');\n}\n\n\/\n * 6. FUNGSI UNTUK MENDAPATKAN META DESCRIPTION (UPDATE)\n *\/\nfunction get_optimized_meta_description() {\n    global $post;\n    \n    if (is_single() || is_page()) {\n        $use_excerpt = get_post_meta($post-&gt;ID, '_use_excerpt_as_metadesc', true);\n        $custom_desc = get_post_meta($post-&gt;ID, '_custom_meta_description', true);\n        \n        \/\/ Priority: Custom Meta Description &gt; Excerpt (if selected) &gt; Auto from content\n        if ($use_excerpt == '1') {\n            \/\/ Gunakan excerpt (tapi excerpt tetap untuk display, ini hanya untuk meta)\n            if (has_excerpt()) {\n                return wp_trim_words(get_the_excerpt(), 25);\n            }\n        } elseif (!empty($custom_desc)) {\n            return $custom_desc;\n        }\n        \n        \/\/ Fallback: ambil dari konten\n        $content = get_the_content();\n        $content = strip_shortcodes($content);\n        $content = wp_strip_all_tags($content);\n        return wp_trim_words($content, 25, '...');\n    }\n    \n    if (is_front_page() || is_home()) {\n        $desc = get_bloginfo('description');\n        return !empty($desc) ? $desc : 'Website ' . get_bloginfo('name') . ' - ' . get_bloginfo('description');\n    }\n    \n    if (is_category()) {\n        $desc = strip_tags(category_description());\n        return !empty($desc) ? $desc : 'Kategori ' . single_cat_title('', false) . ' - ' . get_bloginfo('name');\n    }\n    \n    if (is_tag()) {\n        return 'Artikel dengan tag ' . single_tag_title('', false) . ' - ' . get_bloginfo('name');\n    }\n    \n    if (is_author()) {\n        return 'Artikel oleh ' . get_the_author() . ' - ' . get_bloginfo('name');\n    }\n    \n    return get_bloginfo('description');\n}\n\n\/\n * 7. MODIFIKASI FUNGSI tambah_meta_tags_dinamis() YANG SUDAH ADA\n * \n * NOTE: Anda harus MANUAL mengedit fungsi tambah_meta_tags_dinamis() yang sudah ada\n * \n * CARI baris:\n * $judul = get_the_title(); \/\/ Improved title format\n * \n * GANTI dengan:\n * $judul = get_optimized_meta_title();\n * \n * CARI baris:\n * $deskripsi = has_excerpt() ? get_the_excerpt() : wp_trim_words(get_the_content(), 30);\n * \n * GANTI dengan:\n * $deskripsi = get_optimized_meta_description();\n *\/\n\n\/\/ Optional: Tampilkan notifikasi admin bahwa perlu update manual\nfunction seo_fields_admin_notice() {\n    $screen = get_current_screen();\n    if ($screen-&gt;base == 'themes' && $screen-&gt;id == 'theme-editor') {\n        ?&gt;\n        &lt;div class=\"notice notice-warning\"&gt;\n            &lt;p&gt;\u26a0\ufe0f &lt;strong&gt;SEO Custom Fields telah ditambahkan!&lt;\/strong&gt; Jangan lupa untuk mengedit fungsi &lt;code&gt;tambah_meta_tags_dinamis()&lt;\/code&gt; di file functions.php Anda:&lt;\/p&gt;\n            &lt;ol&gt;\n                &lt;li&gt;Cari baris: &lt;code&gt;$judul = get_the_title();&lt;\/code&gt; \u2192 Ganti dengan &lt;code&gt;$judul = get_optimized_meta_title();&lt;\/code&gt;&lt;\/li&gt;\n                &lt;li&gt;Cari baris: &lt;code&gt;$deskripsi = has_excerpt() ? get_the_excerpt() : wp_trim_words(get_the_content(), 30);&lt;\/code&gt; \u2192 Ganti dengan &lt;code&gt;$deskripsi = get_optimized_meta_description();&lt;\/code&gt;&lt;\/li&gt;\n            &lt;\/ol&gt;\n        &lt;\/div&gt;\n        &lt;?php\n    }\n}\nadd_action('admin_notices', 'seo_fields_admin_notice');\n\n\/\/ END SEO CUSTOM FIELDS\n```\n\n---\n\n CARA TARUH KODE DI FUNCTIONS.PHP\n\nPosisi yang tepat: Taruh kode di atas SETELAH fungsi `tambah_meta_tags_dinamis()` dan SEBELUM kode lainnya.\n\n```php\n\/\/ ... KODE FUNGSI tambah_meta_tags_dinamis() ANDA ...\nadd_action('wp_head', 'tambah_meta_tags_dinamis', 1);\n\/\/ END Meta Tag Function\n\n\/\/ =====================================================\n\/\/ TARUH KODE BARU DI SINI (COPY PASTE SEMUA KODE DI ATAS)\n\/\/ =====================================================\n\n\/\/ Agar Page ada Excerpt Meta Deskripsi\nadd_post_type_support('page', 'excerpt');\n\/\/ END Page Excerpt\n\n\/\/ ... LANJUTAN KODE FUNGSI.PHP ANDA YANG LAIN ...\n```\n\n---\n\n LANGKAH MODIFIKASI MANUAL (PENTING!)\n\nAnda harus mengedit fungsi `tambah_meta_tags_dinamis()` yang sudah ada:\n\nCari baris ini (sekitar baris 12-15):\n```php\nif (is_single() || is_page()) {\n    $judul = get_the_title(); \/\/ Improved title format\n    $deskripsi = has_excerpt() ? get_the_excerpt() : wp_trim_words(get_the_content(), 30);\n```\n\nGanti menjadi:\n```php\nif (is_single() || is_page()) {\n    $judul = get_optimized_meta_title();\n    $deskripsi = get_optimized_meta_description();\n```\n\n---\n\n HASIL AKHIR\n\nSetelah menambahkan kode:\n\n1. \u2705 Meta Title CUSTOM - Bisa diisi manual di editor\n2. \u2705 Meta Description CUSTOM - Bisa diisi manual di editor  \n3. \u2705 Excerpt KEMBALI ke fungsi semula - Untuk tampilan blog\/archive\n4. \u2705 Preview Google SERP - Lihat tampilan di hasil pencarian\n5. \u2705 SEO Tips & Character Counter - Membantu optimasi\n\nExcerpt sekarang kembali ke fungsi aslinya: untuk tampilan di homepage, archive, dan blogroll. Tidak lagi dipaksa untuk meta description.\n\n---\n\n TESTING\n\nSetelah implementasi:\n1. Edit salah satu post\/page\n2. Scroll ke bawah, lihat 2 box baru: \"SEO Meta Title\" dan \"SEO Meta Description\"\n3. Isi custom meta title & description\n4. Simpan, lalu lihat source code halaman (Ctrl+U), cari `&lt;title&gt;` dan `&lt;meta name=\"description\"&gt;`\n\nApakah ada yang perlu dijelaskan lebih detail?\n---\nQ: \/\/ Agar Page ada Excerpt Meta Deskripsi\nadd_post_type_support('page', 'excerpt');\n\/\/ END Page Excerpt dan iniif (is_single() || is_page()) {\n        $judul = get_the_title(); \/\/ Improved title format\n        $deskripsi = has_excerpt() ? get_the_excerpt() : wp_trim_words(get_the_content(), 30);\n        $url = get_permalink(); bagaimana? di hapus atau di rubah?\n\nA:  Jawaban: JANGAN DIHAPUS, TAPI DI MODIFIKASI\n\nSaya akan jelaskan perubahan yang perlu dilakukan:\n\n1. Kode `add_post_type_support('page', 'excerpt');`\nTETAP PERTAHANKAN, jangan dihapus!\n\nKode ini berguna untuk:\n- Menampilkan excerpt di halaman (page) pada archive\/blogroll\n- Excerpt tetap dipakai untuk tampilan internal website\n- TAPI tidak lagi dipaksa untuk meta description (karena kita pakai custom)\n\n2. Kode di dalam fungsi `tambah_meta_tags_dinamis()`\nRUBah seperti di bawah ini:\n\n```php\n\/\/ ============ SEBELUM (kode lama Anda) ============\nif (is_single() || is_page()) {\n    $judul = get_the_title(); \/\/ Improved title format\n    $deskripsi = has_excerpt() ? get_the_excerpt() : wp_trim_words(get_the_content(), 30);\n    $url = get_permalink();\n    \/\/ ... kode lainnya\n}\n\n\/\/ ============ SESUDAH (kode baru) ============\nif (is_single() || is_page()) {\n    \/\/ Gunakan fungsi baru untuk meta title\n    $judul = get_optimized_meta_title();\n    \n    \/\/ Gunakan fungsi baru untuk meta description (prioritas: custom &gt; excerpt &gt; auto)\n    $deskripsi = get_optimized_meta_description();\n    \n    $url = get_permalink();\n    \/\/ ... kode lainnya tetap sama\n}\n```\n\n---\n\n PENJELASAN PERUBAHAN\n\n| Kode | Aksi | Alasan |\n|------|------|--------|\n| `add_post_type_support('page', 'excerpt');` | TETAP | Excerpt tetap dipakai untuk tampilan di homepage\/archive |\n| `$judul = get_the_title();` | GANTI | Sekarang pakai `get_optimized_meta_title()` untuk ambil custom meta title |\n| `$deskripsi = has_excerpt() ? get_the_excerpt() : ...` | GANTI | Sekarang pakai `get_optimized_meta_description()` untuk ambil custom meta desc |\n\n---\n\n KODE LENGKAP MODIFIKASI FUNGSI ANDA\n\nIni penampakan fungsi `tambah_meta_tags_dinamis()` Anda SETELAH dimodifikasi:\n\n```php\nfunction tambah_meta_tags_dinamis()\n{\n    global $post;\n\n    \/\/ Default values\n    $judul = get_bloginfo('name');\n    $deskripsi = get_bloginfo('description');\n    $url = home_url('\/');\n    $canonical_url = $url;\n    $gambar = 'https:\/\/dwiyanti.com\/wp-content\/themes\/lifestyle\/assets\/images\/DwiYanti.jpeg';\n\n    \/\/ If in Single Post\/Page (INI YANG DIUBAH)\n    if (is_single() || is_page()) {\n        \/\/ ========== BARU ==========\n        $judul = get_optimized_meta_title();           \/\/ Ambil custom meta title\n        $deskripsi = get_optimized_meta_description(); \/\/ Ambil custom meta description\n        \/\/ =========================\n        \n        $url = get_permalink();\n\n        \/\/ Prioritize featured image, then first content image, then default\n        if (has_post_thumbnail()) {\n            $gambar = get_the_post_thumbnail_url(null, 'large');\n        } else {\n            $first_img = '';\n            ob_start();\n            ob_end_clean();\n            $output = preg_match_all('\/&lt;img.+src=[\\'\"]([^\\'\"]+)[\\'\"].*&gt;\/i', $post-&gt;post_content, $matches);\n            $first_img = isset($matches[1][0]) ? $matches[1][0] : $gambar;\n            $gambar = $first_img;\n        }\n    }\n    \/\/ If in Homepage\n    elseif (is_front_page() || is_home()) {\n        $judul = get_bloginfo('name');\n        $deskripsi = get_bloginfo('description');\n        $canonical_url = home_url('\/');\n        $gambar = get_theme_mod('custom_logo')\n            ? wp_get_attachment_image_url(get_theme_mod('custom_logo'), 'full')\n            : $gambar;\n    }\n    \n    \/\/ Output Meta Tags (SISANYA TETAP SAMA)\n    echo '&lt;title&gt;' . esc_html($judul) . '&lt;\/title&gt;';\n    echo '&lt;meta name=\"description\" content=\"' . esc_attr(wp_strip_all_tags($deskripsi)) . '\" \/&gt;';\n    \/\/ ... dan seterusnya, semua kode di bawah tetap sama\n}\n```\n\n---\n\n KESIMPULAN SINGKAT\n\n| Pertanyaan | Jawaban |\n|------------|---------|\n| `add_post_type_support('page', 'excerpt');` dihapus? | \u274c TIDAK, tetap pertahankan |\n| `$judul = get_the_title();` dihapus? | \u2705 YA, ganti dengan `$judul = get_optimized_meta_title();` |\n| `$deskripsi = has_excerpt()...` dihapus? | \u2705 YA, ganti dengan `$deskripsi = get_optimized_meta_description();` |\n\nIntinya: Excerpt tetap ada untuk tampilan website, tapi untuk meta description kita pakai custom field yang baru dibuat.\n\nApakah sudah jelas? Saya siap membantu jika ada yang masih kurang dipahami.\n----\n\n Penjelasan Detail: Perbedaan H1, Meta Title, dan Meta Description\n\nAnda benar sekali! Saya akan jelaskan secara DETAIL karena ini penting untuk SEO.\n\n---\n\n1. PERBEDAAN H1 vs META TITLE (Title Tag)\n\n| Elemen | Lokasi | Fungsi | Boleh Sama dengan H1? |\n|--------|--------|--------|----------------------|\n| H1 | Di dalam halaman (body) | Memberi tahu pembaca judul artikel | - |\n| Meta Title | Di `&lt;head&gt;` (tab browser) | Memberi tahu Google judul untuk SERP | TIDAK DISARANKAN |\n\nKenapa tidak boleh sama persis?\n\n```html\n&lt;!-- \u274c SALAH: H1 dan Meta Title sama persis --&gt;\n&lt;h1&gt;5 Cara Merawat Wajah Berminyak&lt;\/h1&gt;\n&lt;title&gt;5 Cara Merawat Wajah Berminyak&lt;\/title&gt;\n\n&lt;!-- \u2705 BENAR: Berbeda tapi tetap relevan --&gt;\n&lt;h1&gt;5 Cara Merawat Wajah Berminyak&lt;\/h1&gt;\n&lt;title&gt;5 Cara Merawat Wajah Berminyak | Tips Skincare Ampuh 2026&lt;\/title&gt;\n```\n\nAlasan SEO:\n1. Meta Title bisa lebih panjang (50-60 karakter) dan bisa ditambah brand name, tahun, atau CTA\n2. H1 lebih pendek, fokus pada user yang sudah di halaman\n3. Google menganggap ini kesempatan double keyword (bisa ranking untuk 2 variasi keyword)\n\nContoh ideal untuk website Anda:\n\n```\nH1: 5 Cara Merawat Wajah Berminyak\nMeta Title: 5 Cara Merawat Wajah Berminyak | Skincare Routine untuk Kulit Sehat\n\nATAU\n\nH1: Review Samsung Galaxy S25 Ultra\nMeta Title: Review Samsung Galaxy S25 Ultra: Kamera 200MP, Baterai Tahan Lama\n```\n\n---\n\n 2. PENJELASAN `$deskripsi = get_optimized_meta_description();`\n\nFungsi ini mengambil meta description dengan prioritas:\n\n```php\nfunction get_optimized_meta_description() {\n    \/\/ Prioritas 1: Custom Meta Description (yang Anda isi di editor)\n    if (!empty($custom_desc)) {\n        return $custom_desc;\n    }\n    \n    \/\/ Prioritas 2: Excerpt (jika user memilih opsi \"gunakan excerpt\")\n    if ($use_excerpt == '1' && has_excerpt()) {\n        return get_the_excerpt();\n    }\n    \n    \/\/ Prioritas 3: Auto-generate dari konten (fallback)\n    return wp_trim_words(get_the_content(), 25);\n}\n```\n\nIni BUKAN mengambil H1 atau Title!\n\n`get_optimized_meta_description()` \u2192 untuk meta description (150-160 karakter, tampil di Google)\n\n`get_optimized_meta_title()` \u2192 untuk meta title (50-60 karakter, tampil di tab browser)\n\n---\n\n 3. PERBANDINGAN LENGKAP SEO ELEMENTS\n\n```html\n&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n&lt;head&gt;\n    &lt;!-- META TITLE (di tab browser, hasil pencarian Google) --&gt;\n    &lt;title&gt;5 Cara Merawat Wajah Berminyak | DwiYanti.com&lt;\/title&gt;\n    \n    &lt;!-- META DESCRIPTION (snippet di Google) --&gt;\n    &lt;meta name=\"description\" content=\"Temukan 5 cara ampuh merawat wajah berminyak dengan bahan alami. Skincare routine pagi & malam untuk kulit sehat bebas minyak.\"&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n    &lt;!-- H1 (judul utama di halaman) --&gt;\n    &lt;h1&gt;5 Cara Merawat Wajah Berminyak&lt;\/h1&gt;\n    \n    &lt;!-- Konten artikel --&gt;\n    &lt;p&gt;...&lt;\/p&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;\n```\n\nVisual di Google Search:\n\n```\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 5 Cara Merawat Wajah Berminyak | DwiYanti.com               \u2502 \u2190 META TITLE\n\u2502 https:\/\/dwiyanti.com\/cara-merawat-wajah-berminyak\/          \u2502\n\u2502 Temukan 5 cara ampuh merawat wajah berminyak dengan bahan   \u2502 \u2190 META DESCRIPTION\n\u2502 alami. Skincare routine pagi & malam untuk kulit sehat...   \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\nVisual di Halaman Website:\n\n```\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502                                                            \u2502\n\u2502    5 Cara Merawat Wajah Berminyak  \u2190 H1                    \u2502\n\u2502                                                            \u2502\n\u2502    Ditulis oleh Dwi Yanti | 10 Januari 2026               \u2502\n\u2502                                                            \u2502\n\u2502    [isi artikel...]                                        \u2502\n\u2502                                                            \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n---\n\n 4. REKOMENDASI UNTUK WEBSITE ANDA\n\nBoleh Sama? TIDAK, lebih baik berbeda:\n\n| Skenario | H1 | Meta Title | Keterangan |\n|----------|-----|------------|-------------|\n| Terlalu Sama | Cara Merawat Wajah | Cara Merawat Wajah | \u274c Buang-buang kesempatan |\n| Ideal | Cara Merawat Wajah | Cara Merawat Wajah Berminyak | \u2705 Tambah keyword varian |\n| Lebih Baik | Cara Merawat Wajah | Cara Merawat Wajah | + Tips Skincare 2026 | \u2705 Tambah info tambahan |\n| Optimal | Cara Merawat Wajah | Cara Merawat Wajah: 5 Langkah Mudah | \u2705 Tambah CTA\/angka |\n\nContoh untuk artikel properti Anda:\n\n```php\n\/\/ Halaman Properti dijual\nH1: Rumah Minimalis Dijual di Pemalang\nMeta Title: Rumah Minimalis Dijual di Pemalang | Harga Mulai 500jt | SHM\n\n\/\/ Artikel blog\nH1: 10 Rekomendasi Skincare untuk Remaja\nMeta Title: 10 Rekomendasi Skincare untuk Remaja | Dari BPOM & Halal\n```\n\n---\n\n 5. APAKAH KODE SAYA SUDAH BENAR?\n\nYa, kode yang saya berikan sudah benar! Karena:\n\n1. Meta Title diambil dari custom field (bisa diisi berbeda dengan H1)\n2. Meta Description diambil dari custom field (bisa diisi sendiri)\n3. H1 tetap menggunakan judul postingan (tidak berubah)\n4. Excerpt tetap untuk tampilan blog (tidak berubah)\n\nStruktur akhir:\n\n| Elemen | Sumber | Bisa diedit? |\n|--------|--------|--------------|\n| H1 | Judul Post\/Page | Ya, di field judul |\n| Meta Title | Custom Field SEO | Ya, di box \"SEO Meta Title\" |\n| Meta Description | Custom Field SEO | Ya, di box \"SEO Meta Description\" |\n| Excerpt | Field excerpt | Ya, di box excerpt (biasa) |\n\n---\n\n 6. KESIMPULAN\n\n- `get_optimized_meta_title()` \u2192 Mengambil custom meta title (BUKAN H1)\n- `get_optimized_meta_description()` \u2192 Mengambil custom meta description (BUKAN excerpt untuk display)\n- Tidak ada konflik antara H1 dan Meta Title karena berasal dari 2 tempat berbeda\n- Excerpt tetap berfungsi normal untuk tampilan di homepage\/archive\n\n---\n\nQ: Kode ini untuk apa: $judul = get_bloginfo('name');\n    $deskripsi = get_bloginfo('description');\n    $url = home_url('\/');\n\nA:  Penjelasan Bagian Ini\n\nKode tersebut adalah DEFAULT VALUES untuk halaman yang BUKAN single post\/page (seperti homepage, archive, category, dll).\n\n```php\n$judul = get_bloginfo('name');           \/\/ Nama website: \"DwiYanti\"\n$deskripsi = get_bloginfo('description'); \/\/ Tagline website: \"Blog Lifestyle & Properti\"\n$url = home_url('\/');                     \/\/ URL homepage: \"https:\/\/dwiyanti.com\"\n```\n\n---\n\n KAPAN KODE INI DIGUNAKAN?\n\nKode ini akan dipakai jika kondisi BUKAN single post\/page:\n\n| Jenis Halaman | Pakai default values? |\n|---------------|----------------------|\n| Homepage \/ Front Page | \u2705 YA |\n| Category Archive | \u2705 YA |\n| Tag Archive | \u2705 YA |\n| Author Archive | \u2705 YA |\n| Date Archive | \u2705 YA |\n| Search Results | \u2705 YA |\n| 404 Page | \u2705 YA |\n\n---\n\n APAKAH PERLU DIUBAH?\n\nTIDAK PERLU diubah untuk meta title & description custom, karena:\n\n1. Fungsi `get_optimized_meta_title()` dan `get_optimized_meta_description()` yang kita buat sebelumnya hanya untuk single post\/page.\n\n2. Untuk homepage dan archive, Anda BISA juga membuat custom, tapi tidak wajib. Biarkan menggunakan default dari `get_bloginfo()`.\n\n---\n\n TAPI, ANDA BISA JUGA OPTIMASI HOMEPAGE\n\nJika ingin homepage juga punya meta title & description custom, tambahkan kode ini:\n\n```php\n\/\/ Di dalam fungsi tambah_meta_tags_dinamis(), cari bagian:\nelseif (is_front_page() || is_home()) {\n    $judul = get_bloginfo('name');\n    $deskripsi = get_bloginfo('description');\n    \/\/ ... kode lainnya\n}\n\n\/\/ Ganti menjadi:\nelseif (is_front_page() || is_home()) {\n    \/\/ Cek apakah ada custom untuk homepage\n    $home_meta_title = get_option('home_meta_title');\n    $home_meta_desc = get_option('home_meta_description');\n    \n    $judul = !empty($home_meta_title) ? $home_meta_title : get_bloginfo('name');\n    $deskripsi = !empty($home_meta_desc) ? $home_meta_desc : get_bloginfo('description');\n    \/\/ ... kode lainnya tetap sama\n}\n```\n\nLalu tambahkan menu setting di admin panel untuk mengisi meta title & description homepage.\n\n---\n\n KESIMPULAN UNTUK ANDA\n\n| Kode | Aksi | Keterangan |\n|------|------|-------------|\n| `$judul = get_bloginfo('name');` | BIARKAN | Sudah bagus untuk default homepage\/archive |\n| `$deskripsi = get_bloginfo('description');` | BIARKAN | Sudah bagus untuk default |\n| `$url = home_url('\/');` | BIARKAN | Ini untuk canonical URL |\n\nYang perlu diubah hanya bagian `if (is_single() || is_page())` seperti yang sudah dijelaskan sebelumnya.\n\nApakah sudah jelas?\n\nApakah sudah jelas?\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>PERBEDAAN META TITLE, H1, META DESCRIPTION, DAN EXPERT DI EDITOR WORDPRESS &#8212;&#8211; Solusi: Buat Meta Description Custom Field + Kembalikan Excerpt ke Fungsi Semula Baik, saya akan berikan kode lengkapnya. Anda ingin: 1. \u2705 Meta description CUSTOM (seperti meta title) 2. \u2705 Excerpt kembali ke fungsi semula (untuk tampilan di blog, bukan untuk meta) Berikut [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-276","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/tools.dwiyanti.com\/blog\/wp-json\/wp\/v2\/posts\/276","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tools.dwiyanti.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tools.dwiyanti.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tools.dwiyanti.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tools.dwiyanti.com\/blog\/wp-json\/wp\/v2\/comments?post=276"}],"version-history":[{"count":2,"href":"https:\/\/tools.dwiyanti.com\/blog\/wp-json\/wp\/v2\/posts\/276\/revisions"}],"predecessor-version":[{"id":278,"href":"https:\/\/tools.dwiyanti.com\/blog\/wp-json\/wp\/v2\/posts\/276\/revisions\/278"}],"wp:attachment":[{"href":"https:\/\/tools.dwiyanti.com\/blog\/wp-json\/wp\/v2\/media?parent=276"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tools.dwiyanti.com\/blog\/wp-json\/wp\/v2\/categories?post=276"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tools.dwiyanti.com\/blog\/wp-json\/wp\/v2\/tags?post=276"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}