/** * ------------------------------------------------------------ * 注意: * ・以下を、現在有効なテーマ(子テーマ推奨)の functions.php の「末尾」に貼り付けてください。 * ・このコードが無くても route.php の分岐A・B・D は正常動作します(分岐Cだけが働きません)。 * * 動作: * ・管理画面にアクセス(ログイン済みで管理画面を表示)すると、判定用cookieを付与する。 * ・そのcookieを持つブラウザは、route.php 側で「許可IPと同等」= サイト通常表示になる。 * ・cookieは「セッションcookie」なので、ブラウザを閉じると自動的に消える。 * ・管理画面からログアウトしたときも削除する。 * * ※ PHP 7.3 以上が必要です(setcookie の配列オプションを使用)。 * ------------------------------------------------------------ */ // ★ zzzzz/route.php の設定($admin_cookie_name / $admin_cookie_secret)と必ず同じ値にすること ★ if (!defined('ADMIN_ACCESS_COOKIE_NAME')) define('ADMIN_ACCESS_COOKIE_NAME', 'bloom_admin'); if (!defined('ADMIN_ACCESS_COOKIE_SECRET')) define('ADMIN_ACCESS_COOKIE_SECRET', 'CHANGE_THIS_SECRET_12345'); // ---- 管理画面にアクセスしたら(ログイン済みのみ)セッションcookieを付与 ---- if (!function_exists('bloom_set_admin_cookie')) { function bloom_set_admin_cookie() { if (!is_user_logged_in()) { return; // ログインしていない訪問者には付与しない(自己付与による不正防止) } // すでに正しい値で付与済みなら再送しない if (isset($_COOKIE[ADMIN_ACCESS_COOKIE_NAME]) && hash_equals(ADMIN_ACCESS_COOKIE_SECRET, (string) $_COOKIE[ADMIN_ACCESS_COOKIE_NAME])) { return; } setcookie(ADMIN_ACCESS_COOKIE_NAME, ADMIN_ACCESS_COOKIE_SECRET, [ 'expires' => 0, // 0 = セッションcookie(ブラウザを閉じると消える) 'path' => '/', // サイト全体で有効 'secure' => is_ssl(), // httpsのときだけ送信 'httponly' => true, // JavaScriptから読めない(安全) 'samesite' => 'Lax', ]); // 同一リクエスト内でもすぐ有効化しておく $_COOKIE[ADMIN_ACCESS_COOKIE_NAME] = ADMIN_ACCESS_COOKIE_SECRET; } // admin_init はログイン済みで管理画面を表示したときに実行される add_action('admin_init', 'bloom_set_admin_cookie'); } // ---- ログアウト時に削除 ---- if (!function_exists('bloom_clear_admin_cookie')) { function bloom_clear_admin_cookie() { setcookie(ADMIN_ACCESS_COOKIE_NAME, '', [ 'expires' => time() - 3600, // 過去時刻で失効させる 'path' => '/', 'secure' => is_ssl(), 'httponly' => true, 'samesite' => 'Lax', ]); unset($_COOKIE[ADMIN_ACCESS_COOKIE_NAME]); } add_action('wp_logout', 'bloom_clear_admin_cookie'); } /** * ------------------------------------------------------------ * アクセス制御(IP/リファラ判定によるリダイレクト・404)は * mu-plugin(wp-content/mu-plugins/ecpid-early-gate.php)へ移設済み。 * このファイルには「サイト表示に必要な機能」だけを残しています。 * * - ecpid_get_server_base() … SQLite等の外部ファイルパス取得(下記機能で使用) * - メタディスクリプション出力 * - 関連商品の非表示 * - [rep] ショートコード(共有SQLiteから値を読み込み) * - タイトル / パンくずでのショートコード実行 * - WooCommerce 価格の SQLite 上書き * ------------------------------------------------------------ */ if (!defined('ABSPATH')) { exit; } /** * 外部ファイル用の「サーバーのユーザー領域」を取得する。 * ABSPATH 例: /home/wfucohup/ec-pid.com/ → /home/wfucohup を返す * ※ mu-plugin 側でも同名関数を定義しているため function_exists でガード * (mu-plugin が無くても、この functions.php 単体で動作します)。 */ if (!function_exists('ecpid_get_server_base')) { function ecpid_get_server_base() { if (defined('ABSPATH') && preg_match('#^(/home/[^/]+)/#', ABSPATH, $m)) { return $m[1]; } } } /* ============================================================ * メタディスクリプション出力(商品ページのカスタムフィールド) * ============================================================ */ function add_custom_description() { if ( function_exists( 'is_product' ) && is_product() ) { global $post; if ( $post instanceof WP_Post ) { $description = get_post_meta( $post->ID, 'prd_description', true ); if ( $description ) { echo ''; } } } } add_action('wp_head', 'add_custom_description'); /* ============================================================ * 関連商品を非表示 * ============================================================ */ remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20 ); /* ============================================================ * [rep] ショートコード:共有SQLiteファイルから値を読み込む(本番用:エラー非表示版) * ============================================================ */ add_shortcode('rep', function($atts) { $key = isset($atts['k']) ? $atts['k'] : ''; $params = explode('_', $key); if (count($params) !== 3) return ''; list($site_name, $pid, $col_name) = $params; $allowed_cols = ['unit', 'lot']; if (!in_array($col_name, $allowed_cols)) return ''; $db_path = ecpid_get_server_base() . '/zzzzz/product_price.sqlite'; if (!file_exists($db_path)) return ''; try { $db = new PDO("sqlite:$db_path"); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "SELECT {$col_name} FROM common_data WHERE site = :site AND pid = :pid LIMIT 1"; $stmt = $db->prepare($sql); $stmt->execute([':site' => $site_name, ':pid' => $pid]); $result = $stmt->fetchColumn(); if ($result !== false) { // 数値であればカンマ区切り(number_format)にする if (is_numeric($result)) { $result = number_format((float)$result); } return esc_html($result); } else { return ''; } } catch (PDOException $e) { return ''; } }); /* ============================================================ * タイトル / パンくずでショートコードを実行する * ============================================================ */ //

Åö±¡¤Ï¡¢Æâ²Ê¼À´µ¡¢¤È¤¯¤Ë½Û´Ä´ï¼À´µ¡¢ÅüǢɤò¤Ï¤¸¤á¤È¤¹¤ëÀ¸³è½¬´·É¡¢¤ª¤è¤Ó¸ÆµÛ´ï¼À´µ¤òÀìÌç¤È¤¹¤ë¥¯¥ê¥Ë¥Ã¥¯¤Ç¤¹¡£¥Ë¥³¥Á¥ó°Í¸¾É¤ÎÊý¤ËÂФ¹¤ë¶Ø±ì¼£ÎŤˤâÀѶËŪ¤Ë¼è¤êÁȤó¤Ç¤¤¤Þ¤¹¡£
Åö±¡¤Ï¡¢Ãϰè¤Î³§Íͤ˿®Íꤷ¤Æ¤¤¤¿¤À¤±¤ë¥¯¥ê¥Ë¥Ã¥¯¤È¤·¤Æ¡¢½½Ê¬¤ÊÀâÌÀ¤È¸ø³«¤ÎÀº¿À¤Ë´ð¤Å¤¡¢»×¤¤¤ä¤ê¤Î¿´¤ò¹þ¤á¤Æ¡¢°å³Ø¤Î¿ÊÊâ¤Ë¨±þ¤·¤¿°åÎŤò¤´Ä󶡤·¤Þ¤¹¡£
»ä¤Ï°å³ØÉô´¶È¸å¡¢Âç³Ø¤ÈÊÆ¹ñ¤Ç¸¦µæÀ¸³è¤ò¤ª¤¯¤ë¤È¤È¤â¤Ë¡¢Âç³ØÉ±¡¤ª¤è¤Ó¤½¤Î´ØÏ¢É±¡¤Ë¤ª¤¤¤Æ°ìÈÌÆâ²Ê³Ø¡¢½Û´Ä´ïɳء¢¸ÆµÛ´ïɳؤÎÎ×¾²·Ð¸³¤ò¤Ä¤ó¤Ç¤¤Þ¤·¤¿¡£¤½¤·¤Æ¡¢¼«¤é¤Î¿ÇÎÅÍýǰ¼ÂÁ©¤Ë¸þ¤±¤Æ¡¢Ê¿À®16ǯ11·î¤ËÆ£°æ»û±ØÁ°¤ÇÆâ²Ê¥¯¥ê¥Ë¥Ã¥¯¤ò³«Àߤ·¤Þ¤·¤¿¡£»ä¤¬¤³¤ÎÃϤdz«±¡¤·¤¿¤Î¤Ï¡¢ÂçºåÉÜΩ±©±ÈÌîɱ¡¡Ê¸½ ÉÜΩÂçºå¤Ï¤Ó¤¤Î°åÎÅ¥»¥ó¥¿¡¼¡Ë¡¦½Û´Ä´ïÆâ²ÊÉôŤò10ǯ¶á¤¯¶Ð¤á¤Æ¡¢Ãϰè¤Î³§Íͤ˿¼¤¯°¦Ãå¤ò´¶¤¸¤¿¤«¤é¤Ç¤¹¡£
»ä¤Ï¡¢Åö±¡¤¬¤¹¤Ù¤Æ¤ÎÌ̤ǥȥåץì¥Ù¥ë¤ÎÆâ²Ê¡¦½Û´Ä´ïÆâ²Ê¡¦¸ÆµÛ´ïÆâ²Ê¥¯¥ê¥Ë¥Ã¥¯¤Ç¤¢¤ê¤¿¤¤¡¢Ãϰè¤Î³§Íͤ«¤é¹â¤¤É¾²Á¤È¿®Íê¤ò¤¤¤¿¤À¤±¤ë¥¯¥ê¥Ë¥Ã¥¯¤Ç¤¢¤ê¤¿¤¤¤Èǰ¤¸¤Æ¤¤¤Þ¤¹¡£¤½¤ÎÌÜŪ¤òãÀ®¤¹¤ë¤¿¤á¡¢»ä¤ò´Þ¤á¤¿¿¦°÷°ìƱ¤¬Æü¡¹¿ÊÊ⤹¤ë°å³Ø¤Ë¸å¤ì¤ò¤È¤é¤Ê¤¤¤è¤¦Àº¿Ê¤·¤Æ¤Þ¤¤¤ê¤Þ¤¹¡£¤Þ¤¿¡¢·ò¹¯¤Ë¤Ä¤¤¤Æµ¤·Ú¤Ë¤´ÁêÃ̤¤¤¿¤À¤±¤ë¤è¤¦¤Ê´Ä¶À°È÷¤ËÅØ¤á¤Æ¤Þ¤¤¤ê¤Þ¤¹¡£
¡ü ¤«¤«¤ê¤Ä¤±°åµ¡Ç½¤Ë¤Ä¤¤¤Æ
Åö±¡¤Ç¤Ï¡¢Ãϰè¤Ë¤ª¤±¤ë¤«¤«¤ê¤Ä¤±°å¤È¤·¤Æ°Ê²¼¤ÎÂбþ¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£
1. ¾°åÎŵ¡´Ø¤Î½èÊý°åÌôÉʤò´Þ¤á¤¿ÉþÌô´ÉÍý
2. ·ò¹¯¿ÇÃǤηë²ÌÅù¤Î·ò¹¯´ÉÍý¤Ë·¸¤ëÁêÃÌ
3. Êݸ±¡¦Ê¡»ã¥µ¡¼¥Ó¥¹¤Ë´Ø¤¹¤ëÁêÃÌ
4. ɬÍפ˱þ¤¸¤¿ÀìÌç°å¤äÀìÌç°åÎŵ¡´Ø¤Ø¤Î¾Ò²ð
5. ͽËÉÀܼï¤Ë´Ø¤¹¤ëÁêÃ̤ÈÀܼï
6. ²ð¸î»Ù±çÀìÌç°÷¤ª¤è¤ÓÁêÃ̻ٱçÀìÌç°÷¤«¤é¤ÎÁêÃÌ
7. ɾõ¤Ë±þ¤¸¤¿28Æü°Ê¾å¤ÎĹ´ü½èÊý¡Ê°å»Õ¤ÎȽÃǤˤè¤ê¤Þ¤¹¡Ë
¡ü °åÎÅDX¤Ø¤ÎÂбþ¤Ë¤Ä¤¤¤Æ
Åö±¡¤Ç¤Ï¡¢°åÎÅDX¤ËÂбþ¤¹¤ëÂÎÀ©¤ò³ÎÊݤ·¤Æ½½Ê¬¤Ê°åΞðÊó¤ò¼èÆÀ¤·¡¢¼Á¤Î¹â¤¤¿ÇÎŤò¹Ô¤¦¤è¤¦ÅØ¤á¤Æ¤¤¤Þ¤¹¡£¥Þ¥¤¥Ê¥ó¥Ð¡¼¥«¡¼¥É¤Ë¤è¤ë¥ª¥ó¥é¥¤¥ó»ñ³Ê³Îǧ¤«¤é¼èÆÀ¤·¤¿°åΞðÊó¤ò³èÍѤ·¤Æ¿ÇÎŤ·¤Æ¤¤¤Þ¤¹¡£¥Þ¥¤¥Ê¥ó¥Ð¡¼¥«¡¼¥É¤Î¤´ÍøÍѤˤ´¶¨ÎϤò¤ª´ê¤¤¤·¤Þ¤¹¡£
¡ü °ìÈÌ̾½èÊý¤Ë¤Ä¤¤¤Æ
Åö±¡¤Ç¤Ï¡¢°ìÈÌ̾½èÊý¡ÊÌô¤Î͸úÀ®Ê¬¤òÌôºÞ̾¤È¤·¤Æ½èÊý¤¹¤ë¡Ë¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£°ìÈÌ̾½èÊý¤Ë¤è¤ê¡¢Àèȯ°åÌôÉʤޤ¿¤Ï¸åȯ°åÌôÉʡʥ¸¥§¥Í¥ê¥Ã¥¯°åÌôÉʡˤò¤´¼«Ê¬¤ÇÁª¤Ö¤³¤È¤¬¤Ç¤¡¢Ìô¤Î¶¡µëÉÔ¤ˤâÂбþ¤Ç¤¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£¤Ê¤ª¡¢°ìÈÌ̾½èÊý¤ò´õ˾¤µ¤ì¤Ê¤¤´µ¼ÔÍͤϤ½¤Î»Ý¤ò°å»Õ¤Ë¤ªÅÁ¤¨¤¯¤À¤µ¤¤¡£
¡ü ¸åȯ°åÌôÉʡʥ¸¥§¥Í¥ê¥Ã¥¯°åÌôÉʡˤλÈÍÑ¿ä¿Ê¤Ë¤Ä¤¤¤Æ
Åö±¡¤Ç¤Ï¡¢¸åȯ°åÌôÉʡʥ¸¥§¥Í¥ê¥Ã¥¯°åÌôÉʡˤλÈÍÑ¿ä¿Ê¤ËÀѶËŪ¤Ë¼è¤êÁȤó¤Ç¤¤¤Þ¤¹¡£¸åȯ°åÌôÉʤλÈÍѤˤĤ¤¤Æ¡¢¤´Íý²ò¤È¤´¶¨ÎϤò¤ª´ê¤¤¤·¤Þ¤¹¡£
¡ü ´¶À÷¾ÉÂкö¤Ë¤Ä¤¤¤Æ
Åö±¡¤Ç¤Ï¡¢´¶À÷¾ÉÂкö¼Â»Ü°åÎŵ¡´Ø¤È¤·¤Æ¿··¿¥³¥í¥Ê¥¦¥¤¥ë¥¹´¶À÷¾ÉÂкö¥Á¥§¥Ã¥¯¥ê¥¹¥È¤Ë±è¤Ã¤¿Âкö¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£