投稿者: Taro Anzai

  • WordPressサイトエディターで「更新に失敗しました」エラーが発生する原因と解決方法

    問題の症状

    WordPress 6.7以降のサイトエディター(Site Editor)で、フロントページなどのテンプレートを編集・保存しようとすると、以下のエラーが発生することがあります:

    更新に失敗しました。 返答が正しい JSON レスポンスではありません。
    

    ブラウザのDevToolsで確認すると、以下のような 403 Forbidden エラーが表示されます:

    POST /wp-json/wp/v2/templates/テーマ名/front-page 403 (Forbidden)
    

    原因の調査と特定

    1. 一般的な原因ではない

    最初に疑われがちな以下の原因は、今回のケースでは該当しませんでした:

    • プラグインの競合
    • ユーザー権限の問題
    • メモリ不足
    • サーバーの権限設定
    • WordPress本体の不具合

    2. 真の原因:WAFによる誤検知

    実際の原因は、レンタルサーバーのWAF(Web Application Firewall)による誤検知でした。

    具体的な検知内容

    サーバーのWAFログには以下のような記録が残されていました:

    クロスサイトスクリプティングの試みの可能性11({x:window.onunload=alert})
    

    なぜ誤検知されるのか

    WordPressのブロックエディターは、スタイル情報を以下のようなJSON形式で送信します:

    {
      "style": {
        "spacing": {
          "padding": {
            "top": "var:preset|spacing|50",
            "bottom": "var:preset|spacing|50"
          },
          "margin": {
            "top": "0",
            "bottom": "0"
          }
        }
      }
    }
    

    WAFは、この正当なJSON構造を XSS攻撃パターン {x:window.onunload=alert} と誤認識してブロックしてしまいます。

    問題の再現と検証方法

    1. 段階的なテスト

    以下の手順で問題を再現できます:

    1. 空のフロントページを作成成功
    2. 簡単なコンテンツを追加成功
    3. スタイル設定(余白など)を追加403エラー発生

    2. ブラウザのDevToolsで確認

    1. F12キーでDevToolsを開く
    2. Networkタブを選択
    3. サイトエディターで保存を実行
    4. 失敗したリクエストの詳細を確認

    Request Headers で以下を確認:

    x-wp-nonce: [数字]
    content-type: application/json
    

    Response Headers で以下を確認:

    content-type: text/html; charset=UTF-8  ← 本来はapplication/jsonであるべき
    

    3. WAFログの確認

    レンタルサーバーの管理画面でWAFログを確認すると、クロスサイトスクリプティングの検知履歴が見つかります。

    解決方法

    Option 1: WAFの除外設定(推奨)

    対象URL:

    /wp-json/wp/v2/templates/*
    

    除外理由:

    WordPress Site Editor の正当なリクエスト
    

    セキュリティ上の考慮事項

    低リスクの環境(推奨):

    • 管理者が1人のみ
    • 小〜中規模サイト(1000PV/日以下)
    • 高価値ターゲットではない

    高リスクの環境(慎重に検討):

    • 複数の管理者がいる
    • 大規模サイト
    • 企業サイトなど重要なサイト

    Option 2: 代替手段

    除外設定が困難な場合は、以下の代替手段を検討:

    1. クラシックエディターの使用
    2. テーマファイルの直接編集
    3. WordPress更新待ち

    対策後の確認

    WAFの除外設定を行った後、以下を確認してください:

    1. サイトエディターで正常に保存できるか
    2. 他のWordPress機能に影響がないか
    3. セキュリティログに異常がないか

    予防策

    1. 定期的な更新

    • WordPressコアの更新
    • テーマの更新
    • プラグインの更新

    2. セキュリティ対策の維持

    • 強力なパスワードの使用
    • 定期的なバックアップ
    • ログイン試行制限の確認

    3. 情報収集

    • WordPress公式フォーラムの確認
    • レンタルサーバーのお知らせ確認
    • セキュリティ情報の収集

    まとめ

    この問題は、WordPressの正当な機能とサーバーセキュリティ機能の互換性問題が原因です。

    重要なポイント:

    1. エラーメッセージだけでは原因特定困難
    2. ブラウザのDevToolsでの詳細調査が必要
    3. WAFログの確認が決定的な証拠
    4. 適切な除外設定で解決可能

    同様の問題に遭遇した場合は、まずサーバーのWAFログを確認することをお勧めします。


    参考情報:

    • WordPress Version: 6.7+
    • Twenty Twenty-Five テーマ使用時に特に発生しやすい
    • レンタルサーバーの種類によって検知パターンが異なる場合あり
      今回はOnameのレンタルサーバーでした。

    この記事が同じ問題で困っている方のお役に立てれば幸いです。

  • 麻雀の点数集計WEBアプリ


    麻雀大会のスコアをスマホで簡単集計!自作Webアプリを作成しました。

    麻雀アプリリンク

    最近、仲間内で開く麻雀大会が増えてきたのですが、スコアの管理に毎回苦労していました。
    「紙で管理するのは面倒」「換算点を後から手計算するのが大変」などの課題を感じたことがある方、多いのではないでしょうか?

    そこで今回、自分で 麻雀大会のスコアを集計・管理できるWebシステム を作ってみました。スマホでの利用を前提としたUIで、ログイン不要、URL共有型のシンプルな仕組みです。


    🖼️ 画面イメージ


    🎯 システムの目的

    • 麻雀大会をリアルタイムで集計できる
    • スマホで誰でもすぐ使える
    • 過去の大会結果も後から見直せる
    • チップ計算や換算点計算も自動化

    ⚙️ 主な機能

    • 大会の作成・編集
      • 大会名、説明、開始日などを入力
    • グループ単位のプレイヤー管理
      • 各グループにプレイヤーを登録し、大会ごとに参加者を選出
    • 対局(卓)の作成
      • 半荘ごとにスコア入力(合計が±0になるように制御)
      • 「チップ」にも対応
    • スコア集計
      • 各プレイヤーの合計得点、換算点を自動集計
      • チップは別枠で集計され、合算も可能(オプション)
    • アクセス制限付きURL共有
      • 関係者だけに共有できるセキュアな構成
      • スマホで簡単に共有(ラインやQRコード)
    • スマホ対応UI
      • React + Tailwind CSS を用いたレスポンシブなデザイン

    🛠️ 技術スタック

    項目内容
    フロントエンドReact(Vite構成) + Tailwind CSS
    バックエンドFlask(RESTful API構成)
    データベースMySQL(SQLAlchemy管理)
    デプロイVPS上にNginx + Gunicorn構成
    認証・セキュリティセッションベース認証、編集キーURL化


    👋 最後に

    「こういう機能が欲しい」「自分の団体で使ってみたい」など、ご意見・ご質問があればぜひお気軽にご連絡ください!


  • Git コマンド


    Gitの基本操作チートシート

    Gitはバージョン管理システムで、コードの変更履歴を記録したり、複数人で共同作業を行う際に役立ちます。ここでは、よく使う基本的なコマンドをまとめました。

    1. リポジトリをコピーする: git clone

    既存のGitリポジトリをローカル環境にコピー(複製)します。これによって、リポジトリの全履歴とファイルがダウンロードされ、作業を開始できます。

    Bash

    git clone <リポジトリのURL>
    

    例: GitHubにあるリポジトリをクローンする場合

    Bash

    git clone https://github.com/ユーザー名/リポジトリ名.git
    

    2. 変更をステージングする: git add

    ファイルに加えた変更を、次のコミットの対象として「ステージングエリア」に追加します。コミットしたい変更だけを選ぶことができます。

    • すべての変更をステージングする:
      git add . 
    • 特定のファイルをステージングする:
      add <ファイル名>
      例: index.html の変更をステージングする場合Bashgit add index.html

    3. 変更を確定する: git commit

    ステージングエリアに追加された変更を、1つのまとまりとしてリポジトリの履歴に記録します。コミット時には、その変更内容を説明するメッセージを必ず含めます。

    Bash

    git commit -m "コミットメッセージ"
    

    例: ユーザー登録機能を追加した際のコミット

    Bash

    git commit -m "Add user registration feature"
    

    4. ブランチを切り替える: git checkout / git switch

    作業するブランチを切り替える際に使用します。Git 2.23以降では git switch が推奨されていますが、git checkout も引き続き利用できます。

    • 既存のブランチに切り替える:
      git checkout <ブランチ名> # または git switch <ブランチ名> 例: develop ブランチに切り替える場合
      git checkout develop
    • 新しいブランチを作成して切り替える:
      git checkout -b <新しいブランチ名> # または git switch -c <新しいブランチ名>
      例: feature/new-design という新しいブランチを作成して切り替える場合
      git checkout -b feature/new-design
    • ローカルブランチとリモート追跡ブランチをすべて表示する:
      git branch -a または git branch --all コマンドを使用することです。このコマンドは、ローカルに存在するすべてのブランチと、リモートリポジトリが持っているブランチのローカル追跡(トラッキング)参照を表示します。

    5. ブランチをリモートにプッシュする: git push

    ローカルリポジトリでのコミット履歴を、リモートリポジトリ(GitHubなど)にアップロードします。新しいブランチを初めてプッシュする際には、通常 -u オプションを使って上流ブランチを設定します。

    • 現在のブランチをリモートにプッシュする:
      git push
    • 新しいブランチを初めてプッシュし、上流ブランチを設定する:
      git push -u origin <ブランチ名>
      例: ローカルの feature/login ブランチをリモートにプッシュし、追跡設定をする場合
      git push -u origin feature/login

    その他の便利なコマンド

    • 現在のリポジトリの状態を確認する:
      git status
    • コミット履歴を確認する:
      git log
    • リモートリポジトリの変更をローカルに取り込む:
      git pull

    これらのコマンドを覚えておけば、Gitを使った基本的なバージョン管理はスムーズに行えるはずです。

  • Linux開発環境

    docker

    状況コマンド例説明
    起動(バックグラウンド)docker compose up -d初回または再起動用
    停止(再起動しやすい)docker compose stop状態を維持したまま停止
    再起動docker compose startstop後の再開
    完全に削除(消える)docker compose down -vデータ・ボリュームも削除

    systemサービス

    操作コマンド例
    起動sudo systemctl start xxx.service
    停止sudo systemctl stop xxx.service
    有効化(起動時)sudo systemctl enable xxx.service
    無効化sudo systemctl disable xxx.service
    状態確認sudo systemctl status xxx.service
    ログ確認journalctl -u xxx.service -e

    sudo systemctl start redis
    sudo systemctl start cerely
    sudo systemctl start mailanalisys

    🔁 node.js + vite の再開手順

    ① プロジェクトフォルダに移動

    bashコピーする編集するcd your-project-name
    

    ② 依存パッケージのインストール(node_modules がない場合)

    bashコピーする編集するnpm install
    # または
    pnpm install
    

    ③ 開発サーバー起動

    bashコピーする編集するnpm run dev
    # または
    pnpm dev
    

    これで、ブラウザで http://localhost:5173 にアクセスすると、Viteで構築されたReact/Vue/Svelteなどのアプリが起動します。

  • MSYS2

    MSYS2をインストールすると、複数の異なるシェル(ターミナル)が登録されます。それぞれの役割を説明します。


    1. MSYS2 MSYS

    • 用途: UNIXライクな環境を提供
    • コンパイラ: なし(基本的なPOSIX互換環境)
    • パス: /usr/bin
    • 適用例: bashtar などのPOSIXコマンドを実行
    • 主な使用場面:
      • MSYS2自体のメンテナンス(pacman によるパッケージ管理)
      • POSIX互換環境が必要な作業

    2. MSYS2 MINGW64

    • 用途: 64bit のWindowsネイティブアプリ(MinGW-w64)開発環境
    • コンパイラ: mingw-w64-x86_64-gcc
    • パス: /mingw64/bin
    • 適用例: g++gcc を使用して64bit Windowsアプリをコンパイル
    • 主な使用場面:
      • 64bit Windowsネイティブアプリの開発
      • cmake を使ったビルド
      • Visual Studio Code(VSC)との連携で使用推奨

    3. MSYS2 UCRT64

    • 用途: 64bit Windowsネイティブアプリ(UCRTベース)の開発環境
    • コンパイラ: mingw-w64-ucrt-x86_64-gcc
    • パス: /ucrt64/bin
    • 適用例: g++gcc を使用してUCRTを利用した64bit Windowsアプリをコンパイル
    • 主な使用場面:
      • Universal C Runtime(UCRT)を使ったプログラム開発
      • Windowsの標準CRT(MSVCRT)よりも最新のUCRTを使用したい場合

    4. MSYS2 CLANG64

    • 用途: 64bit Windowsネイティブアプリ(Clangベース)の開発環境
    • コンパイラ: clang
    • パス: /clang64/bin
    • 適用例: clang++clang を使用してWindows向けのアプリをコンパイル
    • 主な使用場面:
      • Clangベースのコンパイラを利用したい場合
      • Clangを使ったパフォーマンス最適化

    5. MSYS2 CLANGARM64

    • 用途: ARM64(AArch64)向けのWindowsアプリを開発
    • コンパイラ: clang(ARM64向け)
    • パス: /clangarm64/bin
    • 適用例: clang++clang を使ってARM64 Windows向けアプリを開発
    • 主な使用場面:
      • ARM64アーキテクチャ向けのソフトウェア開発(例: Windows on ARM)
      • Clangを利用したクロスコンパイル

    どれを使えばよいか?

    • C++(GCC)開発ならMINGW64(64bit開発)
    • UCRT(新しいランタイム)を使いたいならUCRT64
    • Clangを使うならCLANG64
    • ARM64向け開発ならCLANGARM64
    • MSYS2のパッケージ管理を行うならMSYS2 MSYS

    おすすめの使い方(VSCでの開発)

    Visual Studio CodeでC++開発を行うなら MSYS2 MINGW64 を使うのが一般的です。

    • MINGW64の環境を開き、以下のコマンドでC++ツールをインストール: pacman -S mingw-w64-x86_64-toolchain
    • その後、VS Codeの「ターミナル」→「デフォルトプロファイル」を MSYS2 MINGW64 に設定。

    まとめ

    シェル用途コンパイラ
    MSYS2 MSYSMSYS2環境のメンテナンスなし
    MSYS2 MINGW6464bit Windowsアプリ開発mingw-w64-x86_64-gcc
    MSYS2 UCRT64UCRTベースの64bitアプリ開発mingw-w64-ucrt-x86_64-gcc
    MSYS2 CLANG64Clangを使った64bitアプリ開発clang
    MSYS2 CLANGARM64ARM64 Windows向け開発clang

    この情報を参考に、自分の開発用途に合ったものを選んでください!

  • WordPressのURL変更

    WordPressのURL変更

    WordPressで投稿や固定ページのURLに「wp」や「?p=」と表示されないようにするには、パーマリンク設定を変更する必要があります。具体的な手順は以下の通りです:

    手順

    1. WordPressのダッシュボードにログイン
      • WordPressにログイン後、管理画面に移動します。
    2. パーマリンク設定の変更
      • 左側のメニューから「設定」→「パーマリンク設定」を選択します。
    3. 希望のURL構造を選択
      • パーマリンク設定画面で、「投稿名」や「カスタム構造」などを選択できます。例えば、「投稿名」を選択すると、URLがhttps://example.com/投稿名/という形になります。
      • カスタム構造を使いたい場合は、以下のように設定することもできます: /%category%/%postname%/
      これにより、投稿ごとにカテゴリーや投稿名を反映させたURLになります。
    4. 変更を保存
      • 設定を変更したら、「変更を保存」ボタンをクリックして、設定を反映させます。

    注意点

    • もし「?p=」のようなURLが表示されている場合、それは「デフォルト」設定になっているため、「投稿名」や「カスタム構造」を選択することで、そのようなURLを回避できます。
    • 上記の設定を変更しても、すでに公開されているページや投稿に変更が必要な場合があります。場合によってはリダイレクト設定が必要になることもあります。

    これで、WordPressの投稿や固定ページのURLがより分かりやすい形で表示されるようになります。

    「パーマリンク設定でwpが必ず表示される」という場合、いくつかの原因が考えられます。通常、WordPressの標準パーマリンク設定ではwpがURLに表示されることはありません。ですが、以下の原因や解決方法が考えられます。

    1. WordPressインストール場所がサブディレクトリの場合

    • 原因: WordPressをサブディレクトリ(例えばexample.com/wp/)にインストールしている場合、wpがURLに含まれることがあります。この場合、WordPressのURLとサイトのURLが異なることが原因です。
    • 解決方法:
      1. WordPressのインストール先を確認: 管理画面の「設定」→「一般」で「WordPress アドレス (URL)」と「サイトアドレス (URL)」が正しく設定されているか確認します。
      2. 「サイトアドレス (URL)」をhttps://example.com/に設定し、「WordPress アドレス (URL)」をhttps://example.com/wpのように、wpディレクトリに合わせる場合があります。

    2. .htaccessファイルの設定

    • 原因: サーバーの.htaccessファイルが正しく設定されていない場合、パーマリンクの設定が正しく反映されないことがあります。
    • 解決方法:
      1. 管理画面の「設定」→「パーマリンク設定」に移動し、設定を再保存します。これにより、.htaccessが自動的に更新されます。
      2. もし手動でwpディレクトリにインストールされている場合、.htaccessファイル内でパーマリンク設定が正しく反映されるように記述を確認してください。例えば、次のような記述です: RewriteEngine On RewriteBase /wp/ RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /wp/index.php [L]

    3. プラグインの影響

    • 原因: 一部のプラグインがURLにwpを追加することがあります。特に、キャッシュやSEO関連のプラグインが影響を与えていることがあります。
    • 解決方法:
      1. プラグインを無効にして、URLが変更されるか確認します。特に、キャッシュプラグイン(例: W3 Total Cache、WP Super Cache)や、SEOプラグイン(例: Yoast SEO)が影響を与えることがあります。
      2. 1つずつプラグインを再有効化して、どのプラグインが原因か特定します。

    4. テーマやカスタム設定

    • 原因: 使用しているテーマやカスタムコードがwpをURLに追加している可能性があります。
    • 解決方法: 使用中のテーマやカスタムコードを確認し、URL設定に関わる部分を見直してください。wpを強制的に含めるコードが記述されていないかチェックします。

    まとめ

    まずは、インストール先や.htaccessファイルの設定を確認し、次にプラグインやテーマが影響しているかどうかを確認するのが良いでしょう。それでも問題が解決しない場合は、サーバー側の設定やWordPressの再インストールを考慮することも必要かもしれません。

  • JavaScriptの基本文法

    JavaScriptの基本文法

    JavaScriptの基本的な文法について簡単に紹介します。

    1. 変数の宣言

    変数は、varletconstを使って宣言できます。

    let name = "太郎";  // 再代入可能
    const age = 30;     // 再代入不可
    var city = "東京";  // 古い方法(letやconstが推奨されます)
    

    2. データ型

    JavaScriptには、いくつかの基本的なデータ型があります。

    • 数値 (Number)
    • 文字列 (String)
    • 論理値 (Boolean)
    • 配列 (Array)
    • オブジェクト (Object)
    • nullundefined
    let number = 100;           // 数値
    let name = "太郎";           // 文字列
    let isTrue = true;           // 論理値
    let numbers = [1, 2, 3];    // 配列
    let person = { name: "太郎", age: 30 }; // オブジェクト
    

    3. 関数

    関数は、functionキーワードを使って定義します。

    function greet(name) {
      console.log("こんにちは、" + name + "さん!");
    }
    
    greet("太郎"); // 実行結果: こんにちは、太郎さん!
    

    アロー関数(ES6以降)

    アロー関数は簡潔に関数を定義できます。

    const greet = (name) => {
      console.log("こんにちは、" + name + "さん!");
    };
    
    greet("太郎"); // 実行結果: こんにちは、太郎さん!
    

    4. 条件分岐

    if文やswitch文を使って条件を分岐できます。

    let age = 20;
    
    if (age >= 18) {
      console.log("成人です");
    } else {
      console.log("未成年です");
    }
    

    5. 繰り返し処理

    forループやwhileループで繰り返し処理を行えます。

    // forループ
    for (let i = 0; i < 5; i++) {
      console.log(i);  // 0, 1, 2, 3, 4
    }
    
    // whileループ
    let i = 0;
    while (i < 5) {
      console.log(i);  // 0, 1, 2, 3, 4
      i++;
    }
    

    6. オブジェクト

    オブジェクトはキーと値のペアを持つデータ型です。

    let person = {
      name: "太郎",
      age: 30,
      greet: function() {
        console.log("こんにちは、" + this.name + "です");
      }
    };
    
    console.log(person.name);  // 太郎
    person.greet();            // こんにちは、太郎です
    

    7. 配列

    配列は複数の値を格納できるデータ型です。

    let fruits = ["りんご", "バナナ", "みかん"];
    
    console.log(fruits[0]); // りんご
    fruits.push("ぶどう");  // 配列の末尾に追加
    console.log(fruits);    // ["りんご", "バナナ", "みかん", "ぶどう"]
    

    8. 非同期処理 (Promise)

    JavaScriptでは非同期処理をPromiseasync/awaitを使って扱います。

    // Promiseの例
    let promise = new Promise((resolve, reject) => {
      let success = true;
      if (success) {
        resolve("成功!");
      } else {
        reject("失敗");
      }
    });
    
    promise.then(result => {
      console.log(result); // "成功!"
    }).catch(error => {
      console.log(error); // "失敗"
    });
    

    これがJavaScriptの基本的な文法の概要です。興味のあるトピックがあれば、もっと詳しく説明できますので、気軽に聞いてください!

  • PHP基本文法

    PHP基本文法

    PHPはサーバーサイドで動作するスクリプト言語で、主にウェブ開発に使用されます。以下にPHPの基本文法を紹介します。

    1. PHPタグ

    PHPのコードは <?php?> で囲む必要があります。

    <?php
      // PHPのコードがここに入ります
    ?>
    

    2. 変数

    変数は $ で始まり、文字列や数値などのデータを格納できます。

    <?php
    $variable = "Hello, PHP!";
    echo $variable;  // 出力: Hello, PHP!
    ?>
    

    3. コメント

    PHPでは2種類のコメント形式が使用できます。

    • 単一行コメント: // または #
    • 複数行コメント: /* コメント */
    <?php
    // これは単一行コメント
    # これも単一行コメント
    
    /* これは
       複数行コメントです */
    ?>
    

    4. 配列

    PHPでは、array() 関数を使って配列を作成できます。また、PHP 5.4以降、短縮構文 [] も使用できます。

    <?php
    // 通常の配列
    $fruits = array("Apple", "Banana", "Orange");
    
    // 短縮配列
    $colors = ["Red", "Green", "Blue"];
    ?>
    

    5. 条件分岐 (if, else)

    PHPでは、if 文や else 文で条件分岐が可能です。

    <?php
    $age = 20;
    
    if ($age >= 18) {
        echo "成人です";
    } else {
        echo "未成年です";
    }
    ?>
    

    6. ループ (for, while, foreach)

    PHPにはいくつかのループ構文があります。

    forループ

    <?php
    for ($i = 0; $i < 5; $i++) {
        echo $i . "<br>";
    }
    ?>
    

    whileループ

    <?php
    $i = 0;
    while ($i < 5) {
        echo $i . "<br>";
        $i++;
    }
    ?>
    

    foreachループ(配列やオブジェクトに便利)

    <?php
    $fruits = ["Apple", "Banana", "Orange"];
    
    foreach ($fruits as $fruit) {
        echo $fruit . "<br>";
    }
    ?>
    

    7. 関数

    関数を定義するには function キーワードを使います。

    <?php
    function greet($name) {
        return "Hello, " . $name . "!";
    }
    
    echo greet("Taro");  // 出力: Hello, Taro!
    ?>
    

    8. 連想配列

    連想配列ではキーと値をセットで格納します。

    <?php
    $user = [
        "name" => "Taro",
        "age" => 25,
        "city" => "Tokyo"
    ];
    
    echo $user["name"];  // 出力: Taro
    ?>
    

    9. 定数

    定数を定義するには define() 関数を使います。

    <?php
    define("PI", 3.14159);
    echo PI;  // 出力: 3.14159
    ?>
    

    10. クラスとオブジェクト

    PHPではオブジェクト指向プログラミングが可能で、クラスを定義できます。

    <?php
    class Person {
        public $name;
        public $age;
    
        function __construct($name, $age) {
            $this->name = $name;
            $this->age = $age;
        }
    
        function greet() {
            return "Hello, " . $this->name . "!";
        }
    }
    
    $person = new Person("Taro", 25);
    echo $person->greet();  // 出力: Hello, Taro!
    ?>
    

    これらはPHPの基本的な文法です。PHPは非常に強力で、柔軟な言語であり、ウェブ開発で広く使用されています。

  • python基本文法

    python基本文法

    Pythonの基本的な文法について簡単に紹介します。

    1. 変数とデータ型

    Pythonでは変数の宣言時に型を指定する必要はありません。値を代入するだけで変数が作成されます。

    # 数値
    x = 10
    
    # 文字列
    name = "Taro"
    
    # リスト
    fruits = ["apple", "banana", "cherry"]
    
    # 論理値
    is_active = True
    

    2. コメント

    コードにコメントを追加するには、#を使います。

    # これはコメントです
    print("Hello, World!")  # この行もコメント
    

    3. 演算子

    基本的な演算子は以下の通りです。

    # 算術演算子
    a = 5
    b = 3
    print(a + b)  # 加算
    print(a - b)  # 減算
    print(a * b)  # 乗算
    print(a / b)  # 除算
    print(a // b) # 整数除算
    print(a % b)  # 剰余
    print(a ** b) # 累乗
    

    4. 条件分岐

    Pythonではif文を使って条件分岐を行います。

    age = 20
    
    if age >= 18:
        print("成人です")
    else:
        print("未成年です")
    

    5. ループ

    forループやwhileループを使って繰り返し処理を行います。

    # forループ
    for i in range(5):  # 0から4まで繰り返す
        print(i)
    
    # whileループ
    counter = 0
    while counter < 5:
        print(counter)
        counter += 1
    

    6. 関数

    Pythonではdefを使って関数を定義します。

    def greet(name):
        return "Hello, " + name
    
    print(greet("Taro"))
    

    7. リストとタプル

    • リストは変更可能なデータ構造です。
    • タプルは変更不可能なデータ構造です。
    # リスト
    fruits = ["apple", "banana", "cherry"]
    fruits.append("orange")  # 新しい要素の追加
    print(fruits)
    
    # タプル
    colors = ("red", "green", "blue")
    # colors[0] = "yellow"  # エラー: タプルは変更できない
    

    8. 辞書

    辞書はキーと値のペアでデータを管理します。

    person = {"name": "Taro", "age": 20}
    print(person["name"])  # Taro
    person["age"] = 21  # 値の更新
    

    9. クラスとオブジェクト

    Pythonはオブジェクト指向言語でもあります。クラスを定義してオブジェクトを作成します。

    class Dog:
        def __init__(self, name, age):
            self.name = name
            self.age = age
        
        def bark(self):
            return "Woof!"
    
    dog1 = Dog("Rex", 5)
    print(dog1.name)  # Rex
    print(dog1.bark())  # Woof!
    

    10. 例外処理

    エラーが発生する可能性があるコードをtryブロックで囲み、エラーをexceptで処理します。

    try:
        x = 10 / 0
    except ZeroDivisionError:
        print("ゼロで割ることはできません")
    

    これらがPythonの基本的な文法です。慣れることで、さらに高度な機能を使いこなすことができるようになります。

  • Claudeが優秀

    Claudeが優秀

    プログラムとかワードプレスなどで、わからない時やエラーがあるとChatGPTやClaudeなどなどのAIで確認するが、Claudeが一番適格な答えをしてくれる。プロンプトの問題もあるかもしれないが、プロンプト作成にそんなに時間を取られたくないので、簡単なプロンプトでもちゃんと答えてくれるのがClaudeだった。

    ChatGPT

    files-list.js に関連する読み込み設定は、親テーマの functions.php や他のスクリプトファイルに記述されている可能性がありますが、先程検索した結果では特に親テーマで直接 files-list.js を読み込んでいるコードが見当たりませんでした。

    したがって、次のように確認する方法を提案します:

    1. 親テーマの functions.php の全コードを確認 親テーマで files-list.js を読み込む設定がされているかもしれません。親テーマの functions.php ファイルを確認し、wp_enqueue_script() を使用している部分を探してみてください。
    2. テーマファイル内での wp_enqueue_script をチェック 親テーマのどこかで wp_enqueue_script() を使用して files-list.js を読み込むような記述があるかもしれません。wp_enqueue_script('files-list', ...) のようなコードが見つかるはずです。
    3. プラグインや外部コードの影響 もしプラグインやカスタムコードが files-list.js を親テーマの js フォルダから読み込もうとしている場合もあるため、そのようなプラグインがないかも確認してみてください。

    もし親テーマのコードを確認した結果、それに関する部分が見つかれば、そのコードを削除するか修正することで問題を解決できます。

    Claude

    問題を発見しました!page-custom-files.php ファイルの中に、親テーマのディレクトリを参照しているコードがあります。

    問題のコード部分:

    // スクリプトとスタイルを登録する
    function enqueue_files_list_scripts() {
        // ファイル一覧表示用のスクリプトを登録
        wp_enqueue_script(
            'custom-files-list', 
            get_template_directory_uri() . '/js/files-list.js', 
            array('jquery'), 
            '1.0.0', 
            true
        );
        
        // AJAX URL と nonce をスクリプトに渡す
        wp_localize_script(
            'custom-files-list',
            'custom_files_ajax',
            array(
                'ajax_url' => admin_url('admin-ajax.php'),
                'nonce' => wp_create_nonce('custom_files_nonce')
            )
        );
    }
    add_action('wp_enqueue_scripts', 'enqueue_files_list_scripts');
    

    ここでの問題点:

    1. get_template_directory_uri() は親テーマのディレクトリを参照します。これが http://www.anzai-home.com/wp/wp-content/themes/twentytwentyfive/js/files-list.js として読み込まれている原因です。
    2. さらに、ハンドル名も custom-files-listfiles-list で異なるため、両方のファイルが読み込まれようとしています。

    解決方法:

    1. page-custom-files.php 内のスクリプト読み込み部分を修正します。
    2. get_template_directory_uri()get_stylesheet_directory_uri() に変更して、子テーマのディレクトリを参照するようにします。
    3. もしくは、このスクリプト登録部分を削除して、すでに enqueue-scripts.php にある登録だけを使うようにします。

    以下のいずれかの対応を行ってください:

    1. page-custom-files.phpenqueue_files_list_scripts 関数を修正する:
    function enqueue_files_list_scripts() {
        // ファイル一覧表示用のスクリプトを登録
        wp_enqueue_script(
            'files-list', // 既存のハンドル名と合わせる
            get_stylesheet_directory_uri() . '/js/files-list.js', // 子テーマのディレクトリを参照
            array('jquery'), 
            '1.0.0', 
            true
        );
        
        // AJAX URL と nonce をスクリプトに渡す
        wp_localize_script(
            'files-list', // ハンドル名を合わせる
            'custom_files_ajax',
            array(
                'ajax_url' => admin_url('admin-ajax.php'),
                'nonce' => wp_create_nonce('custom_files_nonce')
            )
        );
    }
    
    1. もしくは、page-custom-files.php からスクリプト登録部分を削除し、enqueue-scripts.phpenqueue_files_list_script 関数に nonce 部分を追加:
    function enqueue_files_list_script() {
        // ファイルパスを指定
        $script_path = get_stylesheet_directory() . '/js/files-list.js';
        // ファイルが存在するか確認し、更新時刻を取得
        if (file_exists($script_path)) {
            $script_version = filemtime($script_path);
        } else {
            $script_version = '1.0.0'; // ファイルが存在しない場合のデフォルトバージョン
            error_log($script_path);
        }
        // ファイルがテーマの js フォルダにある場合のパスを指定
        wp_enqueue_script(
            'files-list', // スクリプトのハンドル名
            get_stylesheet_directory_uri() . '/js/files-list.js', // スクリプトのパス
            array('jquery'), // jQueryに依存している場合、依存関係を指定
            $script_version, // バージョン番号
            true // フッターで読み込む
        );
        
        // AJAX URL と nonce をスクリプトに渡す
        wp_localize_script(
            'files-list',
            'custom_files_ajax',
            array(
                'ajax_url' => admin_url('admin-ajax.php'),
                'nonce' => wp_create_nonce('custom_files_nonce')
            )
        );
    }
    

    これで問題が解決するはずです。親テーマからのファイル読み込みがなくなり、エラーが表示されなくなります。