<?php /** * Plugin Name: NDH SEO Meta Helper * Description: REST endpoints for RankMath, Yoast, WP options, LiteSpeed, Elementor * Version: 1.5 */ add_filter('pre_get_document_title',function($t){if(function_exists('is_shop')&&is_shop())return'Activewear & Sportswear Products | OEM & Private Label | New Dong Huang';return $t;},99); add_action('wp_head',function(){if(function_exists('is_shop')&&is_shop())echo'<meta name="description" content="Browse New Dong Huang activewear and sportswear range. OEM, ODM and private label production with low MOQ for startup brands." />'." ";},1); add_action('rest_api_init',function(){ register_rest_route('ndh/v1','/seo',['methods'=>'POST','callback'=>'ndh_update_seo_meta','permission_callback'=>function(){return current_user_can('edit_posts');}]); register_rest_route('ndh/v1','/option',['methods'=>'POST','callback'=>'ndh_update_option','permission_callback'=>function(){return current_user_can('manage_options');}]); register_rest_route('ndh/v1','/option',['methods'=>'GET','callback'=>'ndh_get_option','permission_callback'=>function(){return current_user_can('manage_options');}]); register_rest_route('ndh/v1','/options-search',['methods'=>'GET','callback'=>'ndh_search_options','permission_callback'=>function(){return current_user_can('manage_options');}]); register_rest_route('ndh/v1','/elementor-text',['methods'=>'POST','callback'=>'ndh_update_elementor_text','permission_callback'=>function(){return current_user_can('edit_posts');}]); register_rest_route('ndh/v1','/image-alt',['methods'=>'POST','callback'=>'ndh_update_image_alt','permission_callback'=>function(){return current_user_can('upload_files');}]); register_rest_route('ndh/v1','/litespeed-save',['methods'=>'POST','callback'=>'ndh_litespeed_save','permission_callback'=>function(){return current_user_can('manage_options');}]); }); // 告知 HCDN/CDN 代理缓存 1 小时(对浏览器仍发 max-age=0) add_action('send_headers', function() { if (!is_admin() && !is_user_logged_in()) { header('Surrogate-Control: max-age=3600, stale-while-revalidate=86400'); header('CDN-Cache-Control: max-age=3600'); } }, 99); function ndh_update_seo_meta(WP_REST_Request $r){$pid=intval($r->get_param('post_id'));$t=sanitize_text_field($r->get_param('rank_math_title'));$d=sanitize_text_field($r->get_param('rank_math_description'));$k=sanitize_text_field($r->get_param('rank_math_focus_keyword'));if(!$pid)return new WP_Error('no_id','Missing post_id',['status'=>400]);$res=[];if($t){$res['title']=update_post_meta($pid,'rank_math_title',$t);$res['yoast_title']=update_post_meta($pid,'_yoast_wpseo_title',$t);}if($d){$res['desc']=update_post_meta($pid,'rank_math_description',$d);$res['yoast_desc']=update_post_meta($pid,'_yoast_wpseo_metadesc',$d);}if($k){$res['focus_kw']=update_post_meta($pid,'rank_math_focus_keyword',$k);$res['yoast_focus_kw']=update_post_meta($pid,'_yoast_wpseo_focuskw',$k);}return['post_id'=>$pid,'updated'=>$res];} function ndh_get_option(WP_REST_Request $r){$n=sanitize_key($r->get_param('name'));if(!$n)return new WP_Error('no_name','Missing',['status'=>400]);return['name'=>$n,'value'=>get_option($n)];} function ndh_update_option(WP_REST_Request $r){$n=sanitize_key($r->get_param('name'));$k=sanitize_text_field($r->get_param('key'));$v=$r->get_param('value');if(!$n)return new WP_Error('no_name','Missing',['status'=>400]);$opt=get_option($n,[]);if($k){$opt[$k]=$v;$ok=update_option($n,$opt);}else{$ok=update_option($n,$v);}return['name'=>$n,'key'=>$k,'ok'=>$ok,'new_value'=>get_option($n)];} function ndh_search_options(WP_REST_Request $r){global $wpdb;$p=sanitize_text_field($r->get_param('prefix'));$l=sanitize_text_field($r->get_param('like'));if(!$p&&!$l)return new WP_Error('no_param','Need prefix or like',['status'=>400]);if($p){$rows=$wpdb->get_results($wpdb->prepare("SELECT option_name,LEFT(option_value,300) as val FROM {$wpdb->options} WHERE option_name LIKE %s LIMIT 50",$p.'%'));}else{$rows=$wpdb->get_results($wpdb->prepare("SELECT option_name,LEFT(option_value,300) as val FROM {$wpdb->options} WHERE option_name LIKE %s LIMIT 50",'%'.$l.'%'));}return $rows;} function ndh_update_elementor_text(WP_REST_Request $r){$pid=intval($r->get_param('post_id'));$find=$r->get_param('find');$replace=$r->get_param('replace');if(!$pid||!$find||$replace===null)return new WP_Error('missing','Need post_id,find,replace',['status'=>400]);$data=get_post_meta($pid,'_elementor_data',true);if(!$data)return new WP_Error('no_data','No elementor data',['status'=>404]);$new=str_replace($find,$replace,$data);$changed=($new!==$data);if($changed){update_post_meta($pid,'_elementor_data',$new);delete_post_meta($pid,'_elementor_element_cache');}return['post_id'=>$pid,'changed'=>$changed,'occurrences'=>substr_count($data,$find)];} function ndh_update_image_alt(WP_REST_Request $r){$id=intval($r->get_param('image_id'));$alt=sanitize_text_field($r->get_param('alt_text'));if(!$id)return new WP_Error('no_id','Missing',['status'=>400]);return['image_id'=>$id,'ok'=>update_post_meta($id,'_wp_attachment_image_alt',$alt)];} // LiteSpeed save: directly write config and reload function ndh_litespeed_save(WP_REST_Request $request) { $settings = $request->get_param('settings'); if (!is_array($settings)) return new WP_Error('bad_settings', 'Need settings array', ['status' => 400]); $results = []; foreach ($settings as $key => $value) { $opt_name = 'litespeed.conf.' . sanitize_text_field($key); $results[$key] = update_option($opt_name, $value); } // Flush object cache to force LiteSpeed to re-read config if (function_exists('wp_cache_flush')) wp_cache_flush(); // Try to trigger LiteSpeed config reload do_action('litespeed_flush_all'); do_action('litespeed_purge_all'); // Clear LiteSpeed internal config cache delete_option('litespeed.conf._summary'); delete_transient('litespeed_conf'); return ['updated' => $results, 'flushed' => true]; } https://newdonghuang.com/post-sitemap.xml 2026-05-30T08:19:30+00:00 https://newdonghuang.com/page-sitemap.xml 2026-05-31T09:44:34+00:00 https://newdonghuang.com/product-sitemap.xml 2026-05-31T10:28:03+00:00 https://newdonghuang.com/activity-sitemap.xml 2026-05-31T10:28:03+00:00 https://newdonghuang.com/gender-sitemap.xml 2026-05-31T10:28:03+00:00 https://newdonghuang.com/video-sitemap.xml 2026-04-08T10:11:30+00:00