• 解決済 yousan

    (@hogetan)


    開発環境と本番環境がある場合での固定ページの取り扱いについての質問です。

    よくあるWordPressでの開発案件で、開発環境と本番環境がある場合、固定ページはどのように取り扱っていますか?

    現在私は

    1. page-hoge.phpを作成
    2. 開発鯖でhogeというページをhogeテンプレートで作成
    3. page-hoge.phpを転送
    4. 本番鯖でhogeという固定ページを作成
    5. page-hoge.phpをテンプレートに指定。
    6. 以後、page-hoge.phpの修正とアップロードを繰り返す

    という手順を踏んでいます。

    このうち、

    開発鯖でhogeというページをhogeテンプレートで作成

    本番鯖でhogeという固定ページを作成

    の部分について作業が億劫で、なんとか自動化できないかと思っています。

    具体的には

    add_page('hoge');

    みたいな関数がないかなーと思っていまして、これをfunctions.phpに含めておけばpage-hoge.phpを追加するだけで
    http://www.example.com/hoge/
    が作成されたりしないか、と妄想しています。

    デメリットとしては
    「固定ページ一覧にないページが存在してしまうので知らない人が見ると管理不能に陥る」
    「rewriteが崩れる可能性がある(slugとかpost_nameが変に重複して管理できなくなる)」
    あたりを考えています。

    この辺りのテクニックについてご存知の方、お持ちの方のご意見をいただければ幸いです。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • wp_insert_postを使えばページ追加できます。
    http://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wp_insert_post

    一回だけ投稿させようとすると、
    「すでにhogeというページがあるかチェックする => なければ投稿処理する」
    といったチェックが必要ですね。

    固定ページ数が多ければ、自動化する価値はあるかもしれません。

    トピック投稿者 yousan

    (@hogetan)

    MIZUNOさん
    返信ありがとうございます。
    実際の固定ページとして登録してしまう、という方法ですね。

    やはりその方法しかないですかね〜。
    できればDB側はスッキリさせたい気も…してたりします…!

    feed の出力は、実際の固定ページが無くても表示されているので、
    feed 周りを参考にすれば、rewrite で作れるかもしれません。
    この場合は、hogetanさんの懸念されている、スラッグ重複が怖いですが。

    昔テーマのディレクトリのHTMLをチェックして、

    • ファイル名と同名の固定ページが無ければ登録
    • 存在し、タイムスタンプが新しければ更新

    みたいなのはやってみたことはあります。サイト内検索などもあったので。

    Class PageContents {
        private $dir;
        private $separator = "_";
        private $content_dir = "page-contents";
        private $ext = "html";
        public function __construct() {
            $this->dir = get_stylesheet_directory()."/".$this->content_dir;
        }
        private function getContentFiles() {
            return array_map(function($fileName){
                return $fileName;
            }, glob($this->dir.'/{*.'.$this->ext.'}',GLOB_BRACE));
        }
        public function sync() {
            foreach ($this->getContentFiles() as $key => $fileName) {
                $pageName = $this->getPageNameFromFile($fileName);
                $post = get_page_by_path($pageName);
                if($post) {
                    if( (strtotime($post->post_modified_gmt)  < intval(filemtime($fileName)))  ) {
                        $newpost = $this->getPostFromFile($fileName);
                        if($newpost->post_title) {
                            $post->post_title = $newpost->post_title;
                        }
                        $post->post_content = $newpost->post_content;
                        wp_update_post($post);
                    }
                }
                else {
                    $newpost = $this->getPostFromFile($fileName);
                    $postData = [
                        'post_status' => 'publish',
                        'post_type' => 'page',
                        'post_parent' => $newpost->post_parent,
                        'post_title' => $newpost->post_title,
                        'post_content' => $newpost->post_content,
                        'post_name' => $newpost->post_name
                    ];
                    wp_insert_post($postData);
                }
            }
        }
        private function getPostFromFile($fileName) {
            $content = file_get_contents($fileName);
            $post = new \stdClass();
            $post->post_title = "";
            $post->post_parent = 0;
            if( preg_match( '|Content Name:(.*)$|mi', $content, $header ) ){
                $post->post_title = $header[1];
            }
            $pageSlug = $this->getPageNameFromFile($fileName);
            $slugs = explode("/", $pageSlug);
            $postName = array_pop($slugs);
            $post->post_name = $postName;
            if(count($slugs) > 0) {
                $page = get_page_by_path(implode("/", $slugs));
                if($page) {
                    $post->post_parent = $page->ID;
                }
            }
            // remove Comment.
            $post->post_content = preg_replace('/\<!--(.|\n)*?--\>(\s)*?/i', "", $content);
            return $post;
        }
        private function getPageNameFromFile($fileName) {
                $pageName = str_replace(['.'.$this->ext, $this->dir."/"], "", $fileName);
                $pageName = str_replace([$this->separator], "/", $pageName);
                return $pageName;
        }
    }

    あとは、宮内さんのブログの以下の記事が参考になるかもです。

    * WordPressプラグインで好き勝手な内容を好き勝手なURLで表示する。
    * WordPressに独自のURLを追加する。2014年版

    トピック投稿者 yousan

    (@hogetan)

    MIZUNO さん

    feed の出力は、実際の固定ページが無くても表示されているので、
    feed 周りを参考にすれば、rewrite で作れるかもしれません。

    なるほど〜、feedの出力周りでそういうことやってたのですね。
    情報ありがとうございます〜。ちょっと見てみたいと思います!

    Toro_Unit さん
    お返事おそくなってすみません (>_<
    コードありがとうございます。これは特定のディレクトリにあるhtmlをページとして登録、ですね。参考になります!

    また宮内さんの記事面白そうですね。この記事周辺やお二方お情報を組み合わせると表題の件をうまくできそうな気がしますね!
    ありがとうございます〜。

    トピック投稿者 yousan

    (@hogetan)

    Toro_Unitさん MIZUNOさん

    その後おかげさまでプラグインとして作成することができました。
    認識してすぐに固定ページとして登録してしまうと後に響きそうなので、rewriteを利用してendpointを設定するようにしました。

    また今後のアップデートで固定ページとして登録する事も考えています。

    https://github.com/yousan/add-page-from-template

    教えて頂いてありがとうございました。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「テーマ開発時の固定ページ追加について」には新たに返信することはできません。