{"id":385,"date":"2026-07-20T12:31:53","date_gmt":"2026-07-20T12:31:53","guid":{"rendered":"https:\/\/tools.dwiyanti.com\/blog\/?p=385"},"modified":"2026-07-20T12:31:54","modified_gmt":"2026-07-20T12:31:54","slug":"keyword-di-schema-website","status":"publish","type":"post","link":"https:\/\/tools.dwiyanti.com\/blog\/keyword-di-schema-website","title":{"rendered":"Keyword di Schema Website"},"content":{"rendered":"<pre style=\"white-space:pre-wrap;\">\n\u2705 JAWABAN: IYA, KEYWORD METABOX ADA DI PAGE HOME\n\nKarena frontpage Anda diset statis ke halaman Home, maka:\n\n---\n\n\ud83d\udccd LOKASI KEYWORDS MANUAL:\n\n| Halaman | Status | Metabox Keywords |\n|---------|--------|------------------|\n| Frontpage (Home) | Halaman statis | \u2705 Ada di Page Home |\n| Halaman Lain | Page biasa | \u2705 Ada di masing-masing page |\n\nJadi Anda bisa mengisi keywords manual di halaman Home melalui metabox yang sudah kita buat sebelumnya.\n\n---\n\n\ud83d\udd27 YANG PERLU DIMODIFIKASI:\n\nSchema Website Anda saat ini masih menggunakan fungsi keyword otomatis (ambil dari ID, tag, kategori). \n\nSaya akan sesuaikan agar:\n\n1. \u2705 Prioritas utama: Keywords manual dari metabox\n2. \u2705 Fallback: Jika kosong, pakai tag\/kategori\n3. \u2705 Tidak ambil ID dari konten (sesuai permintaan sebelumnya)\n\n---\n\n\ud83d\udcdd KODE SCHEMA WEBSITE YANG SUDAH DIMODIFIKASI:\n\n```php\n<?php\n\/\/ ========== SCHEMA WEBSITE KHUSUS FRONTPAGE ==========\nadd_action('wp_head', 'add_homepage_website_itemlist_schema');\nfunction add_homepage_website_itemlist_schema() {\n\n    \/\/ HANYA tampil di frontpage\n    if (!is_home() &#038;&#038; !is_front_page()) {\n        return;\n    }\n\n    global $post;\n\n    $url = home_url();\n    $site_name = get_optimized_meta_title();\n    $description = get_optimized_meta_description();\n\n    \/\/ === KUMPULKAN GAMBAR DARI FRONTPAGE ===\n    $images = [];\n    $content = isset($post->post_content) ? $post->post_content : '';\n\n    \/\/ 1. Ambil dari tag <img>\n    preg_match_all('\/<img[^>]+src=[\"\\']([^\"\\']+)[\"\\']\/i', $content, $matches);\n    if (!empty($matches[1])) {\n        foreach ($matches[1] as $img_url) {\n            $images[] = [\n                \"@type\" => \"ImageObject\",\n                \"url\" => $img_url,\n                \"width\" => 1200,\n                \"height\" => 630\n            ];\n        }\n    }\n\n    \/\/ 2. Ambil dari background-image CSS\n    preg_match_all('\/background-image:\\s*url\\([\\'\"]?([^\\'\"]+)[\\'\"]?\\)\/i', $content, $bg_matches);\n    if (!empty($bg_matches[1])) {\n        foreach ($bg_matches[1] as $img_url) {\n            $images[] = [\n                \"@type\" => \"ImageObject\",\n                \"url\" => $img_url,\n                \"width\" => 1200,\n                \"height\" => 630\n            ];\n        }\n    }\n\n    \/\/ 3. Featured image (jika homepage punya)\n    if (has_post_thumbnail()) {\n        $images[] = [\n            \"@type\" => \"ImageObject\",\n            \"url\" => wp_get_attachment_image_url(get_post_thumbnail_id(), 'full'),\n            \"width\" => 1200,\n            \"height\" => 630\n        ];\n    }\n\n    \/\/ 4. Fallback: Site icon atau logo\n    if (empty($images)) {\n        $site_icon = get_site_icon_url();\n        if ($site_icon) {\n            $images[] = [\n                \"@type\" => \"ImageObject\",\n                \"url\" => $site_icon,\n                \"width\" => 512,\n                \"height\" => 512\n            ];\n        } else {\n            $images[] = [\n                \"@type\" => \"ImageObject\",\n                \"url\" => \"https:\/\/dwiyanti.com\/wp-content\/themes\/lifestyle\/assets\/images\/DwiYanti.jpeg\",\n                \"width\" => 1200,\n                \"height\" => 630\n            ];\n        }\n    }\n\n    \/\/ Batasi maksimal 10 gambar\n    $images = array_slice($images, 0, 10);\n\n    \/\/ Ambil 6 postingan terbaru\n    $recent_posts = get_posts(array(\n        'numberposts' => 6,\n        'post_status' => 'publish',\n        'post_type'   => 'post'\n    ));\n\n    \/\/ Siapkan array itemListElement untuk blog posts\n    $item_list = array();\n    $position = 1;\n\n    foreach ($recent_posts as $post) {\n        setup_postdata($post);\n\n        $post_image = '';\n        $content = get_post_field('post_content', $post->ID);\n\n        \/\/ Cari gambar pertama dari konten\n        preg_match('\/<img.+src=[\\'\"]([^\\'\"]+)[\\'\"].*>\/i', $content, $matches);\n        if (! empty($matches[1])) {\n            $post_image = $matches[1];\n        }\n\n        \/\/ Fallback 1: Thumbnail\n        if (empty($post_image)) {\n            $thumbnail_id = get_post_thumbnail_id($post->ID);\n            if ($thumbnail_id) {\n                $thumbnail_url = wp_get_attachment_image_url($thumbnail_id, 'full');\n                if ($thumbnail_url) {\n                    $post_image = $thumbnail_url;\n                }\n            }\n        }\n\n        \/\/ Fallback 2: Default\n        if (empty($post_image)) {\n            $post_image = $site_url . '\/wp-content\/themes\/lifestyle\/assets\/images\/DwiYanti.jpeg';\n        }\n\n        $image_object = array(\n            '@type' => 'ImageObject',\n            'url' => $post_image,\n            'width' => 800,\n            'height' => 600\n        );\n\n        \/\/ Coba dapatkan dimensi gambar sebenarnya\n        if (strpos($post_image, home_url()) !== false) {\n            $attachment_id = attachment_url_to_postid($post_image);\n            if ($attachment_id) {\n                $metadata = wp_get_attachment_metadata($attachment_id);\n                if ($metadata && isset($metadata['width']) && isset($metadata['height'])) {\n                    $image_object['width'] = $metadata['width'];\n                    $image_object['height'] = $metadata['height'];\n                }\n            }\n        }\n\n        $item_list[] = array(\n            '@type' => 'ListItem',\n            'position' => $position,\n            'url' => get_permalink($post->ID),\n            'name' => get_the_title($post->ID),\n            'description' => wp_trim_words(get_the_excerpt($post), 20),\n            'image' => $image_object\n        );\n        $position++;\n    }\n    wp_reset_postdata();\n\n    \/\/ ====================================================\n    \/\/ ========== FUNGSI KEYWORDS (MODIFIED) ==========\n    \/\/ ====================================================\n    \n    \/\/ Fungsi utama untuk mengambil keywords\n    function get_schema_keywords($post_id = null) {\n        $keywords = [];\n\n        \/\/ ===== PRIORITAS 1: MANUAL DARI METABOX =====\n        \/\/ Ambil dari halaman frontpage (jika ada)\n        $frontpage_id = get_option('page_on_front');\n        if ($frontpage_id) {\n            $manual_keywords = get_post_meta($frontpage_id, '_schema_keywords_manual', true);\n            if (!empty($manual_keywords)) {\n                return $manual_keywords; \/\/ \u2705 Langsung return jika ada manual\n            }\n        }\n\n        \/\/ ===== PRIORITAS 2: AMBIL DARI TAG =====\n        \/\/ Ambil tags dari semua post\n        $all_tags = get_terms(array(\n            'taxonomy' => 'post_tag',\n            'hide_empty' => false,\n            'number' => 20\n        ));\n        \n        if (!empty($all_tags) && !is_wp_error($all_tags)) {\n            foreach ($all_tags as $tag) {\n                $keywords[] = $tag->name;\n            }\n        }\n\n        \/\/ ===== PRIORITAS 3: AMBIL DARI KATEGORI =====\n        if (empty($keywords)) {\n            $categories = get_terms(array(\n                'taxonomy' => 'category',\n                'hide_empty' => false,\n                'number' => 10\n            ));\n            \n            if (!empty($categories) && !is_wp_error($categories)) {\n                foreach ($categories as $category) {\n                    $keywords[] = $category->name;\n                }\n            }\n        }\n\n        \/\/ ===== PRIORITAS 4: AMBIL DARI JUDUL POST TERBARU =====\n        if (empty($keywords)) {\n            $recent_posts = get_posts(array(\n                'numberposts' => 10,\n                'post_status' => 'publish'\n            ));\n            \n            foreach ($recent_posts as $post) {\n                $keywords[] = get_the_title($post->ID);\n            }\n        }\n\n        \/\/ Hapus duplikat dan kosong\n        $keywords = array_filter(array_unique($keywords));\n\n        \/\/ Batasi maksimal 10 keywords\n        $keywords = array_slice($keywords, 0, 10);\n\n        return implode(', ', $keywords);\n    }\n\n    \/\/ ====================================================\n    \/\/ ========== BUILD SCHEMA ==========\n    \/\/ ====================================================\n    \n    $schema_website = array(\n        \"@context\"         => \"https:\/\/schema.org\",\n        \"@type\"            => \"WebSite\",\n        \"@id\"              => $url . \"#website\",\n        \"url\"              => $url,\n        \"name\"             => $site_name,\n        \"alternateName\"    => [\"DwiYanti\", \"dwynti\", \"dwee\", \"Dwi Yanti\"],\n        \"description\"      => $description,\n        \"inLanguage\"       => \"id-ID\",\n        \"image\"            => $images,\n        \n        \/\/ ===== KEYWORDS: MANUAL + FALLBACK =====\n        \"keywords\"         => get_schema_keywords(),\n        \n        \"publisher\"        => [\n            \"@type\"         => \"Organization\",\n            \"@id\"           => $url . \"#organization\",\n            \"name\"          => \"Dwi Yanti SEO\",\n            \"alternateName\" => \"Dwi Yanti SEO Specialist and Technical SEO Strategist\",\n            \"url\"           => $url,\n            \"logo\"          => [\n                \"@type\"  => \"ImageObject\",\n                \"url\"    => get_site_icon_url() ?: \"https:\/\/dwiyanti.com\/wp-content\/themes\/lifestyle\/assets\/images\/DwiYanti.jpeg\",\n                \"width\"  => 512,\n                \"height\" => 512\n            ]\n        ],\n        \"potentialAction\" => [\n            \"@type\"        => \"SearchAction\",\n            \"target\"       => $url . \"\/?s={search_term_string}\",\n            \"query-input\"  => \"required name=search_term_string\"\n        ],\n        \"author\"  => [\n            \"@id\" => \"https:\/\/me.dwiyanti.com\/#dwi-yanti\"\n        ],\n        \"creator\" => [\n            \"@id\" => \"https:\/\/me.dwiyanti.com\/#dwi-yanti\"\n        ],\n        'mainEntity' => array(\n            '@type' => 'ItemList',\n            'itemListElement' => $item_list,\n            'numberOfItems' => count($recent_posts)\n        ),\n        \"about\" => [\n            [\n                \"@type\"  => \"Thing\",\n                \"name\"   => \"Search Engine Optimization\",\n                \"sameAs\" => \"https:\/\/en.wikipedia.org\/wiki\/Search_engine_optimization\"\n            ],\n            [\n                \"@type\"  => \"Thing\",\n                \"name\"   => \"SEO Specialist\",\n                \"sameAs\" => \"https:\/\/en.wikipedia.org\/wiki\/SEO_Specialist\"\n            ],\n            [\n                \"@type\"  => \"Thing\",\n                \"name\"   => \"Technical SEO\",\n                \"sameAs\" => \"https:\/\/en.wikipedia.org\/wiki\/Technical_SEO\"\n            ]\n        ]\n    );\n\n    echo '<script type=\"application\/ld+json\">' . \"\\n\";\n    echo json_encode($schema_website, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);\n    echo \"\\n\" . '<\/script>' . \"\\n\";\n}\n?>\n```\n\n---\n\n\ud83d\udd04 PERUBAHAN YANG SAYA LAKUKAN:\n\n| Sebelum | Sesudah |\n|---------|---------|\n| \u2705 Ambil ID dari konten | \u274c DIHAPUS |\n| \u2705 Ambil tag & kategori | \u26a0\ufe0f FALLBACK (jika manual kosong) |\n| \u274c Tidak ada metabox | \u2705 PRIORITAS UTAMA dari metabox |\n\n---\n\n\ud83d\udccb PRIORITAS KEYWORDS:\n\n```\n1. Manual dari Metabox (Halaman Home)\n   \u2193 (jika kosong)\n2. Tags dari semua post\n   \u2193 (jika kosong)\n3. Kategori\n   \u2193 (jika kosong)\n4. Judul post terbaru\n```\n\n---\n\n\u2705 CARA MENGGUNAKAN:\n\n1. Buka halaman Home di admin WordPress\n2. Scroll ke bawah cari metabox \"Schema Keywords Manual\"\n3. Isi keywords (pisahkan dengan koma)\n4. Update halaman\n\nHasil: Keywords akan muncul di schema Website Anda! \ud83c\udfaf\n\n---\n\nApakah ini yang Anda maksud? \ud83d\ude0a\n<\/pre>","protected":false},"excerpt":{"rendered":"\u2705 JAWABAN: IYA, KEYWORD METABOX ADA DI PAGE HOME Karena frontpage Anda diset statis ke halaman Home, maka: &#8212; \ud83d\udccd LOKASI KEYWORDS MANUAL: | Halaman | Status | Metabox Keywords | |&#8212;&#8212;&#8212;|&#8212;&#8212;&#8211;|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;| | Frontpage (Home) | Halaman statis | \u2705 Ada di Page Home | | Halaman Lain | Page biasa | \u2705 Ada di [&hellip;]","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-385","post","type-post","status-publish","format-standard","hentry","category-schema"],"_links":{"self":[{"href":"https:\/\/tools.dwiyanti.com\/blog\/wp-json\/wp\/v2\/posts\/385","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=385"}],"version-history":[{"count":1,"href":"https:\/\/tools.dwiyanti.com\/blog\/wp-json\/wp\/v2\/posts\/385\/revisions"}],"predecessor-version":[{"id":386,"href":"https:\/\/tools.dwiyanti.com\/blog\/wp-json\/wp\/v2\/posts\/385\/revisions\/386"}],"wp:attachment":[{"href":"https:\/\/tools.dwiyanti.com\/blog\/wp-json\/wp\/v2\/media?parent=385"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tools.dwiyanti.com\/blog\/wp-json\/wp\/v2\/categories?post=385"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tools.dwiyanti.com\/blog\/wp-json\/wp\/v2\/tags?post=385"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}