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

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

前回はココナラヘルパからタイトルと本文を編集する機能を実装しました。

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

そろそろ大詰めですね。公開画面を開き、カテゴリとハッシュを入力していきましょう!

公開画面の編集

まず公開画面を開く実装です。
以前作成した画面遷移する機能を使用すれば簡単ですね😏

// 公開画面を編集する

// 画面表示
if($this->moveAndWait('document.querySelector("button.button.c-blogPost_triggerPublish").click();', waitTime:10000)) {
                        
}

次に苦労したカテゴリとハッシュの編集です。
今回はカテゴリやハッシュは固定値のまま進めようと思います。
下手にアレンジして動かなくなるのが怖いので😅

// 公開画面を編集する

// 画面表示
if($this->moveAndWait('document.querySelector("button.button.c-blogPost_triggerPublish").click();', waitTime:10000)) {

    // カテゴリとハッシュタグを指定
    $categoryAndHashTagQuery = 
    '(() => {
        // カテゴリの選択
        document.querySelector("div.c-blogPublishing_category select option[value=\"9\"").selected = true;
        document.querySelector("div.c-blogPublishing_category select").dispatchEvent(new Event("change"));
  
        // ハッシュタグの指定
        obj = document.querySelector("[data-v-46ae5ace]");
        obj.__vue__.blogTagNames.push(" IT");
        obj.__vue__.blogTagNames.push(" WordPress");

    })()';

    // 処理実行
    $this->execute($categoryAndHashTagQuery);
}

投稿!

ついにここまで来ました。

それでは「投稿する」をココナラヘルパに実装します。

っといっても流れは同じ。画面遷移機能を利用するだけなのです。

// 投稿!
if($this->moveAndWait('document.querySelector("button[data-v-6c22d71e].button.is-primary").click();', waitTime:10000)) {
    $result = true;
} else {
    $result = false;
}

確認

それではいよいよ確認ですよ!

http://localhost:8099/index.php にアクセス!

・・・・成功です!

 

あれ?でも投稿時刻が変な気がしますね。いいんでしょうかね(笑

まとめ

コード整理を行い、ココナラヘルパを作成しました。

投稿機能の全容をまとめておきます。

/**
 * 投稿する
 * @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;
                })()';

                // 処理実行
                $this->execute($titleAndContentsQuery);


                // 公開画面を編集し投稿する

                // 画面表示
                if($this->moveAndWait('document.querySelector("button.button.c-blogPost_triggerPublish").click();', waitTime:10000)) {

                    // カテゴリとハッシュタグを指定
                    $categoryAndHashTagQuery = 
                    '(() => {
                        // カテゴリの選択
                        document.querySelector("div.c-blogPublishing_category select option[value=\"9\"").selected = true;
                        document.querySelector("div.c-blogPublishing_category select").dispatchEvent(new Event("change"));
                  
                        // ハッシュタグの指定
                        obj = document.querySelector("[data-v-46ae5ace]");
                        obj.__vue__.blogTagNames.push(" IT");
                        obj.__vue__.blogTagNames.push(" WordPress");
                
                    })()';

                    // 処理実行
                    $this->execute($categoryAndHashTagQuery);


                    // 投稿!
                    if($this->moveAndWait('document.querySelector("button[data-v-6c22d71e].button.is-primary").click();', waitTime:10000)) {
                        $result = true;
                    } else {
                        $result = false;
                    }
                } else {
                    $result = false;
                }
        } else {
            $result = false;
        }
    } else {
        $result = false;
    }

    if($this->debug) {
        // screenshot(10秒待機)
        $this->page->screenshot()->saveToFile('/var/www/html/post.png', 10000);
    }
    return $result;
}

これでindex.phpは軽くなりましたね!
しかしココナラヘルパはまだまだ改良が必要です。
ネストが深すぎたり投稿機能が大きすぎたりと(´・ω・`)
そしてココナラ特有の外部リンク禁止ルールや画像をどうするのかといったことも考えなればいけません。

なんにしてもココナラヘルパの作成編は一区切りです。

改良も随時行いたいと思っています。

今日はここまで!