PHP 初心者が WordPress の プラグイン 作成 ! part52 ( コードを整理 08 )

この記事では PHP 初心者 が WordPress プラグイン を 作成 します。 part52 では引き続き今までのコードを少し整理してみます。

前回はココナラヘルパにブログ編集機能の本文生成について検討していました。
ココナラブログの本文は私にとって難しい仕様となっており生成には一工夫必要なのでした。

PHP 初心者が WordPress の プラグイン 作成 ! part51 ( コードを整理 07 )

手動かパターンマッチング置換か

現在2つの方法を考えています。

  1. 本文の解析を改行区切りで分割し本文を生成する
  2. 正規表現のパターンマッチングによる置換で本文を生成する

    いろいろ考えたのですが1にすることにします。

    本文の生成にはほかにも「リンクの無効化」や「画像埋め込み」の処理を追加しようとしています。
    1で進めていたほうがこれらの処理を行うときに進めやすいと考えました😎

    以下を採用することにしました。

    // 本文を分解する
    $fixedRetuenCodeContents = str_replace(array("\r\n", "\r", "\n"), "\n", $contents);
    $contentArray = explode("\n", $fixedRetuenCodeContents);

    実装再開

    分解ができたのでbodyとbodyText用の値を生成します。

    // 値の生成
    $contentForBody = "";
    $contentForBodyText = "";
    foreach ($contentArray as $item) {
        // body用の値
        $contentForBody += "<div data-v-22617325=\"\" class=\"c-blogBody_text\">".$item."</div>";
    
        // bodyText用の値
        $contentForBodyText += $item."\n";
    }

    分解した本文をforeachのループで繰り返しbodyとbodyTextの値を生成しています。
    PHPのforeachはループ変数が後ろに来るんですね。
    +=演算子使ってみましたが・・・あっているのでしょうかね😅

    ヘッドレスブラウザに渡すクエリを作成

    あとは事前に用意したヘッドレスブラウザが使用するクエリに適用するだけです。

    
    // ヘッドレスブラウザに渡すクエリの作成
    $titleAndContentsQuery = 
    '(() => {
        obj = document.querySelector("[data-v-46ae5ace]");
        obj.__vue__.title = '.$title.';
        obj.__vue__.body = '.$contentForBody.';
        obj.__vue__.bodyText = '.$contentForBodyText.';
        obj.__vue__.blogEmpty = false;
    })()';

    全体像

    クエリが作成できたら前回用意した実行機能を呼び出すだけです。

    ここで投稿機能の全体像を公開します。

       /**
         * 投稿する
         * @param string $title タイトル
         * @param string $contents コンテンツ
         * @return bool 投稿成功・失敗
         */
        public function post(string $title, string $contents) : bool {
            $result = false;
    
            // ログイン
            if($this->login()) {
                // ブログ画面に遷移(ブログを投稿する→記事の種類選択で編集画面に遷移)
                if($this->moveAndWait('document.querySelector("a.c-subLink_item-blog").click()')
                    && $this->moveAndWait('document.querySelector("button.button.is-primary").click()', waitTime:10000)) {
    
    
                        // ブログを編集する
    
                        // 本文を分解する
                        $fixedRetuenCodeContents = str_replace(array("\r\n", "\r", "\n"), "\n", $contents);
                        $contentArray = explode("\n", $fixedRetuenCodeContents);
                        
                        // 値の生成
                        $contentForBody = "";
                        $contentForBodyText = "";
                        foreach ($contentArray as $item) {
                            // body用の値
                            $contentForBody += "<div data-v-22617325=\"\" class=\"c-blogBody_text\">".$item."</div>";
    
                            // bodyText用の値
                            $contentForBodyText += $item."\n";
                        }
                         
                        // ヘッドレスブラウザに渡すクエリの作成
                        $titleAndContentsQuery = 
                        '(() => {
                            obj = document.querySelector("[data-v-46ae5ace]");
                            obj.__vue__.title = '.$title.';
                            obj.__vue__.body = '.$contentForBody.';
                            obj.__vue__.bodyText = '.$contentForBodyText.';
                            obj.__vue__.blogEmpty = false;
                        })()';
    
                        // 処理実行
                        execute($titleAndContentsQuery);
    
                        $result = true;
                } else {
                    $result = false;
                }
            } else {
                $result = false;
            }
    
            if($this->debug) {
                // screenshot(10秒待機)
                $this->page->screenshot()->saveToFile('/var/www/html/post.png', 10000);
            }
            return $result;
        }

    だいぶ禍々しい感じになってきましたね(笑

    まとめ

    ブログの編集機能は実装できました。
    次回は一度実行してみようかなと思います。

    投稿メソッドが複雑になってきているのでもう少しなんとかしたい所存です。

    今日はここまで!