ProPeler
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
var
/
www
/
html
/
wp-content
/
themes
/
bayisihat-jurnal
/
inc
/
Filename :
seo.php
back
Copy
<?php if (!defined('ABSPATH')) exit; /* ============ Bayi Sihat — SEO engine ============ */ function bs_current_url(){ if (is_singular()) return get_permalink(); if (is_front_page()) return home_url('/'); if (is_category()||is_tag()||is_tax()){ $t=get_queried_object(); if($t && !is_wp_error($t)) return get_term_link($t); } if (is_home()){ $p=get_option('page_for_posts'); if($p) return get_permalink($p); } return home_url('/'); } function bs_meta_description($id=null){ $id = $id ?: get_the_ID(); if (is_singular()){ $d = get_post_meta($id,'bs_seo_desc',true); if ($d) return $d; if (has_excerpt($id)) return get_the_excerpt($id); return wp_trim_words(wp_strip_all_tags(get_post_field('post_content',$id)), 30, '…'); } if (is_category()||is_tag()||is_tax()){ $d=term_description(); if($d) return wp_strip_all_tags($d); } return get_bloginfo('description'); } // custom SEO title add_filter('pre_get_document_title', function($t){ if (is_singular()){ $c=get_post_meta(get_the_ID(),'bs_seo_title',true); if($c) return $c.' · Bayi Sihat'; } return $t; }, 20); add_filter('document_title_separator', function(){ return '·'; }); function bs_faq($id=null){ $id = $id ?: get_the_ID(); $raw = get_post_meta($id,'bs_faq',true); if (!$raw) return array(); $f = json_decode($raw, true); return is_array($f) ? $f : array(); } function bs_breadcrumbs(){ $items = array(array('name'=>'Utama','url'=>home_url('/'))); if (is_singular('post')){ $c = bs_post_primary_cat(); if ($c) $items[] = array('name'=>$c->name,'url'=>get_category_link($c->term_id)); $items[] = array('name'=>get_the_title(),'url'=>get_permalink()); } elseif (is_category()||is_tag()||is_tax()){ $items[] = array('name'=>single_term_title('',false),'url'=>''); } elseif (is_page()){ $items[] = array('name'=>get_the_title(),'url'=>''); } return $items; } function bs_breadcrumbs_html(){ $items = bs_breadcrumbs(); if (count($items) < 2) return ''; $out = '<nav class="crumbs" aria-label="Breadcrumb"><ol>'; $last = count($items)-1; foreach ($items as $i=>$it){ if ($i < $last && $it['url']) $out .= '<li><a href="'.esc_url($it['url']).'">'.esc_html($it['name']).'</a></li>'; else $out .= '<li aria-current="page">'.esc_html($it['name']).'</li>'; } return $out.'</ol></nav>'; } // meta description + Open Graph + Twitter add_action('wp_head', function(){ $desc = wp_strip_all_tags(bs_meta_description()); $url = bs_current_url(); $title = wp_get_document_title(); $img = (is_singular() && has_post_thumbnail()) ? get_the_post_thumbnail_url(get_the_ID(),'large') : get_template_directory_uri().'/assets/hero.jpg'; echo "\n<meta name=\"description\" content=\"".esc_attr($desc)."\">\n"; echo '<meta property="og:type" content="'.(is_singular('post')?'article':'website').'">'."\n"; echo '<meta property="og:site_name" content="Bayi Sihat">'."\n"; echo '<meta property="og:locale" content="ms_MY">'."\n"; echo '<meta property="og:title" content="'.esc_attr($title).'">'."\n"; echo '<meta property="og:description" content="'.esc_attr($desc)."\">\n"; echo '<meta property="og:url" content="'.esc_url($url).'">'."\n"; echo '<meta property="og:image" content="'.esc_url($img).'">'."\n"; echo '<meta name="twitter:card" content="summary_large_image">'."\n"; echo '<meta name="twitter:title" content="'.esc_attr($title).'">'."\n"; echo '<meta name="twitter:description" content="'.esc_attr($desc).'">'."\n"; echo '<meta name="twitter:image" content="'.esc_url($img)."\">\n"; }, 5); // JSON-LD structured data add_action('wp_head', function(){ $home = home_url('/'); $logo = get_template_directory_uri().'/assets/logo.png'; $org = array('@type'=>'Organization','@id'=>$home.'#org','name'=>'Bayi Sihat','url'=>$home, 'logo'=>array('@type'=>'ImageObject','url'=>$logo,'width'=>512,'height'=>512), 'description'=>'Rujukan kehamilan & penjagaan bayi untuk ibu bapa Malaysia.'); $graph = array($org, array('@type'=>'WebSite','@id'=>$home.'#website','url'=>$home,'name'=>'Bayi Sihat', 'publisher'=>array('@id'=>$home.'#org'),'inLanguage'=>'ms-MY', 'potentialAction'=>array('@type'=>'SearchAction','target'=>array('@type'=>'EntryPoint','urlTemplate'=>$home.'?s={search_term_string}'),'query-input'=>'required name=search_term_string'))); if (is_singular('post')){ $img = has_post_thumbnail() ? get_the_post_thumbnail_url(get_the_ID(),'large') : get_template_directory_uri().'/assets/hero.jpg'; $cat = bs_post_primary_cat(); $graph[] = array('@type'=>'Article','@id'=>get_permalink().'#article', 'headline'=>get_the_title(), 'description'=>wp_strip_all_tags(bs_meta_description()), 'image'=>array($img), 'datePublished'=>get_the_date('c'), 'dateModified'=>get_the_modified_date('c'), 'author'=>array('@type'=>'Organization','name'=>'Sidang Editorial Bayi Sihat','url'=>$home), 'publisher'=>array('@id'=>$home.'#org'), 'mainEntityOfPage'=>array('@type'=>'WebPage','@id'=>get_permalink()), 'articleSection'=> $cat ? $cat->name : '', 'inLanguage'=>'ms-MY'); $faq = bs_faq(); if ($faq){ $q = array(); foreach ($faq as $f){ if(!empty($f['q'])&&!empty($f['a'])) $q[] = array('@type'=>'Question','name'=>$f['q'],'acceptedAnswer'=>array('@type'=>'Answer','text'=>$f['a'])); } if ($q) $graph[] = array('@type'=>'FAQPage','@id'=>get_permalink().'#faq','mainEntity'=>$q); } } // FAQPage schema untuk PAGE (alat/kalkulator) yang ada bs_faq if (is_page()){ $pfaq = bs_faq(); if ($pfaq){ $pq = array(); foreach ($pfaq as $f){ if(!empty($f['q'])&&!empty($f['a'])) $pq[] = array('@type'=>'Question','name'=>$f['q'],'acceptedAnswer'=>array('@type'=>'Answer','text'=>$f['a'])); } if ($pq) $graph[] = array('@type'=>'FAQPage','@id'=>get_permalink().'#faq','mainEntity'=>$pq); } } // Extra schema (Recipe/HowTo etc) dari post meta bs_schema_extra (JSON) if (is_singular()){ $extra_raw = get_post_meta(get_the_ID(), 'bs_schema_extra', true); if ($extra_raw){ $extra = json_decode($extra_raw, true); if (is_array($extra)){ if (isset($extra['@type'])) { $graph[] = $extra; } else { foreach ($extra as $g){ if (is_array($g) && isset($g['@type'])) $graph[] = $g; } } } } } $bc = bs_breadcrumbs(); if (count($bc) >= 2){ $el = array(); $pos = 1; foreach ($bc as $b){ $item = array('@type'=>'ListItem','position'=>$pos,'name'=>$b['name']); if($b['url']) $item['item']=$b['url']; $el[]=$item; $pos++; } $graph[] = array('@type'=>'BreadcrumbList','itemListElement'=>$el); } echo "\n".'<script type="application/ld+json">'.wp_json_encode(array('@context'=>'https://schema.org','@graph'=>$graph), JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE).'</script>'."\n"; }, 20); // sitemap in robots.txt add_filter('robots_txt', function($o){ return $o."\nSitemap: ".home_url('/wp-sitemap.xml')."\n"; }, 20); // inline CSS for SEO UI elements add_action('wp_enqueue_scripts', function(){ $css = '.crumbs{max-width:960px;margin:0 auto;padding:1.3rem clamp(1.1rem,3.5vw,2rem) 0;font-family:var(--font-ui);font-size:.82rem}' .'.crumbs ol{list-style:none;display:flex;flex-wrap:wrap;gap:.5rem;padding:0;margin:0;color:var(--muted)}' .'.crumbs li{display:flex;align-items:center;gap:.5rem}.crumbs li:not(:last-child)::after{content:"\\203A";color:var(--hairline)}' .'.crumbs a{color:var(--muted)}.crumbs a:hover{color:var(--forest)}.crumbs [aria-current]{color:var(--ink);font-weight:500}' .'.article__takeaway{background:var(--highlight);border:1px solid var(--hairline);border-left:4px solid var(--clay-deep);border-radius:var(--radius);padding:1.1rem 1.3rem;margin-bottom:2rem;font-size:1.04rem;color:var(--ink)}' .'.article__takeaway strong{font-family:var(--font-ui);font-size:.7rem;letter-spacing:.12em;text-transform:uppercase;color:var(--clay-deep);display:block;margin-bottom:.35rem}' .'.faq{margin-top:3rem}.faq h2{font-size:1.7rem;margin-bottom:1.2rem}' .'.faq__item{border:1px solid var(--hairline);border-radius:12px;margin-bottom:.7rem;background:var(--surface);overflow:hidden}' .'.faq__item summary{cursor:pointer;padding:1.05rem 1.3rem;font-family:var(--font-display);font-weight:600;font-size:1.12rem;color:var(--ink);list-style:none;display:flex;justify-content:space-between;align-items:center;gap:1rem}' .'.faq__item summary::-webkit-details-marker{display:none}' .'.faq__item summary::after{content:"+";font-family:var(--font-ui);color:var(--forest);font-size:1.5rem;line-height:1;flex:none}' .'.faq__item[open] summary::after{content:"\\2013"}' .'.faq__item .faq__a{padding:0 1.3rem 1.15rem;color:var(--muted)}' .'.share{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;margin:2.4rem 0;padding:1.05rem 1.3rem;background:var(--surface);border:1px solid var(--hairline);border-radius:var(--radius)}' .'.share__label{display:inline-flex;align-items:center;gap:.4rem;font-family:var(--font-ui);font-weight:700;font-size:.9rem;color:var(--ink);margin-right:.25rem}' .'.share__label svg{width:18px;height:18px}' .'.share__btn{display:inline-flex;align-items:center;gap:.45rem;font-family:var(--font-ui);font-weight:600;font-size:.85rem;padding:.55rem .85rem;border-radius:100px;border:none;color:#fff;cursor:pointer;transition:transform .15s,filter .15s;text-decoration:none;background:var(--sc,#555);line-height:1}' .'.share__btn:hover{transform:translateY(-2px);color:#fff;filter:brightness(1.07)}' .'.share__btn svg{width:18px;height:18px;fill:currentColor}' .'.share__btn--wa{--sc:#25D366}.share__btn--fb{--sc:#1877F2}.share__btn--tg{--sc:#229ED9}.share__btn--x{--sc:#14171A}.share__btn--copy{--sc:var(--forest)}.share__btn--copy.copied{--sc:var(--clay-deep)}' .'.article__header .share{justify-content:center;max-width:640px;margin:1.8rem auto 0}' .'@media(max-width:560px){.share__label{width:100%;margin-bottom:.1rem}}'; wp_add_inline_style('bs-style', $css); }, 20); // SEO meta box add_action('add_meta_boxes', function(){ add_meta_box('bs_seo','SEO — Bayi Sihat', function($post){ wp_nonce_field('bs_seo_save','bs_seo_nonce'); $g = function($k) use ($post){ return esc_attr(get_post_meta($post->ID,$k,true)); }; $ta = function($k) use ($post){ return esc_textarea(get_post_meta($post->ID,$k,true)); }; $faqlines=''; $raw=get_post_meta($post->ID,'bs_faq',true); if ($raw){ $f=json_decode($raw,true); if(is_array($f)) foreach($f as $x){ $faqlines .= ($x['q']??'').' :: '.($x['a']??'')."\n"; } } echo '<p><label><strong>Kata kunci fokus</strong></label><br><input type="text" name="bs_focus_kw" value="'.$g('bs_focus_kw').'" style="width:100%"></p>'; echo '<p><label><strong>Tajuk SEO</strong> (≤60 aksara)</label><br><input type="text" name="bs_seo_title" value="'.$g('bs_seo_title').'" style="width:100%"></p>'; echo '<p><label><strong>Meta description</strong> (≤155 aksara)</label><br><textarea name="bs_seo_desc" rows="3" style="width:100%">'.$ta('bs_seo_desc').'</textarea></p>'; echo '<p><label><strong>Ringkasan pantas (TL;DR)</strong></label><br><textarea name="bs_takeaway" rows="2" style="width:100%">'.$ta('bs_takeaway').'</textarea></p>'; echo '<p><label><strong>Soalan Lazim</strong> — satu baris satu soalan, format <code>Soalan :: Jawapan</code></label><br><textarea name="bs_faq_lines" rows="7" style="width:100%">'.esc_textarea(trim($faqlines)).'</textarea></p>'; }, array('post','page'), 'normal', 'high'); }); add_action('save_post', function($id){ if (!isset($_POST['bs_seo_nonce']) || !wp_verify_nonce($_POST['bs_seo_nonce'],'bs_seo_save')) return; if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; if (!current_user_can('edit_post',$id)) return; foreach (array('bs_seo_title','bs_seo_desc','bs_focus_kw','bs_takeaway') as $f){ if (isset($_POST[$f])) update_post_meta($id,$f,sanitize_text_field(wp_unslash($_POST[$f]))); } if (isset($_POST['bs_faq_lines'])){ $lines = preg_split('/\r?\n/', trim(wp_unslash($_POST['bs_faq_lines']))); $faq = array(); foreach ($lines as $ln){ if(strpos($ln,'::')!==false){ list($q,$a)=array_map('trim',explode('::',$ln,2)); if($q&&$a) $faq[]=array('q'=>sanitize_text_field($q),'a'=>sanitize_text_field($a)); } } update_post_meta($id,'bs_faq',wp_json_encode($faq,JSON_UNESCAPED_UNICODE)); } });