カテゴリー: WordPress

  • WordPressのTracにチケットを投げたら採用されました。

    コードを書くのに疲れたので、何となく縁のなさそうなコードを読んでいたら、バグを見つけました。用意はしてあるけど使われてない関数だったっぽいです。

    調べたら特にチケットも切られてなかったので、パッチ作ってTracに突撃してきました。

    #33254 (Access undefined $current_user in update_option_new_admin_email().) – WordPress Trac

    そしたらなんか採用されたようです。

    VVVを使って宮内さんの言うとおりにやるのがとにかく簡単でした。VVVの起動にどえらい時間がかかるので飯でも食いながら待ってればいいと思いました。

    VVVを使ってWordPress本体のパッチを送る方法

    VVVが起動する時点でgruntは動くのでやらなくても良いですが、仮想マシン内で実行されるので、仮想マシンの外から作業をするなら、node_modulesを削除して作業する環境で

    $ npm install

    してあげないとビルドタスクがこけます。面倒なので仮想マシンの中で全部作業しました。

    あとちゃんとテストはしましょうね。テストだいじ。

    Tracへの突撃方法

    https://make.wordpress.org/core/reports/ へアクセスして Create a Ticket すればまぁ良いんです。難しいことは正直ほとんどないですが、注意点とか。

    類似のチケットがないかちゃんと調べる

    まぁ、どこでもある奴ですね。右上のSearchからGoogleのサイト内検索が出来るので調べる。関数やメソッド名で調べるのが一番手っ取り早いかも。

    知ってる人がどんな感じでチケット書いたのか読む

    とりあえず、Kiteさんとか宮内さんとかがコアにチケット投げてたのでそれを読んで参考に。

    英語が得意じゃなくてもパッチ投げれば意外に何とかなる

    コードレビューしてくれるコアチームの人とかは当然コード読めるので、この規模ならほぼコードで会話出来そうな感じでした。

    正直営業の人にプログラムの説明するよりは1000倍くらい楽だった気がします。

    提案が入ったようなチケットや、かなり議論が必要なものだとちょっと厳しい気はします。

    というざっくりな感じです。

     

    とりあえずこれで4.4が出るまでの間は、クレジットされたでー!って自慢しようかと思います。

    あと、wp-admin/includesの中とか自分に縁のなさそうなところを読んでみると、といろいろ勉強になること多いです。miscって雑多なって意味だってのを初めて知りました。

    確かにレガシーコードも多いけど、それはそれで勉強になること多いんでたまには、みんな読んでみると良いんじゃないですかね。そのついでにパッチを送ればいいなーとか思いました。

  • WordMoveでMySQL5.1なサーバーにデプロイするとなぜかDBがアップロードされない問題

    こないだ発見した問題ですが、WordPress4.2以降、特定のサーバー条件が揃うと、WordMoveデータベースをpushしてもデータベースがインポートされないという状況が発生しました。特にエラーなどは発生しませんでした。

    、WordPress4.2以降、DBの文字コードがutf8mb4に変更されました。ただし、これ全てのWordPressって訳では無くて、動作しているサーバーのMySQLが5.1系等の場合(正確には5.5.3未満)の場合はutf8mb4に対応してないので、utf8のままなんですよね。

    その場合、ローカルで作った環境がMySQL5.5.3以上の場合、データベースのインポートに失敗します。

    解決法

    ローカルのDBの文字コードを片っ端からutf8に戻せば解決します。面倒くさかったので、SQLダンプでエクスポートしてから utf8mb4 から utf8 に一括置換しました。SQLで一発で戻せる方法あれば誰か教えて下さい。WordPressのコアを見れば utf8 から utf8mb4 はやってるはずなのでわかりそうなものだけど。

    ちょっと・・・みたいなサーバーを扱うときはいろいろ要注意ですね。

  • Amimotoに移行しました。

    Amimotoに移行しました。

    やろうやろうと思い続けて早一年。

    ようやく重い腰を上げてAMIMOTOを使いAmazon EC2に移行しました。

    この間のCIのハンズオンでデプロイ用のサーバーを立てていろいろ弄りまくっていたので、そこまでやったならついでにやってしまおうかと。

    とにかく速いですね。正直アクセスもそこまで無いのでHHVMであるコトのメリットはよくわかってませんけど、とりあえず速いです。

    VCCWを使って移行しましたが、ちょっとデータベースの移行が上手いこと行きませんでした。DBの容量が問題だったのかよくわかってないので、ここらへんをしっかり調査できたら、そのうち移行手順まとめたいと思ってます。

    とりあえず、サーバーのユーザー周りを弄ったりする必要はありますね。

    参考:ec2-user ユーザーで網元で作成したインスタンスに(S)FTPクライアントソフトで接続するには? | 超高速 WordPress AMI 網元

    これでおいらも網元機動隊!

  • WordPressのマルチサイトでも手元でPHPUnitを動かす。

    マルチサイト専用のプラグインを作る機会があったのですが、そのときに手元でPHPUnitするときのメモです。

    とりあえず、wp-cliでプラグインのひな形を作ります。

    $wp scaffold plugin hoge

    このままphpunitを実行してもマルチサイトにならないので、以下のようなテストコードを書くと失敗します。

    class SampleMultisiteTest extends WP_UnitTestCase {
        public function test_is_multisite() {
            $this->assertTrue( is_multisite() );
        }
    }

    その場合、phpunit.xmlを以下のように改変します。

    <phpunit
        bootstrap="tests/bootstrap.php"
        backupGlobals="false"
        colors="true"
        convertErrorsToExceptions="true"
        convertNoticesToExceptions="true"
        convertWarningsToExceptions="true"
        >
        <php>
            <const name="WP_TESTS_MULTISITE" value="1" />
        </php>
        <testsuites>
            <testsuite>
                <directory prefix="test-" suffix=".php">./tests/</directory>
            </testsuite>
        </testsuites>
    </phpunit>

    WP_TEST_MULTISITEという値を渡してあげるとマルチサイトとしてテスト用のWordPressがインストールされて動作します。

    https://github.com/torounit/multisite-sample-plugin

    Travis CIだとtravis.yml弄るだけで大丈夫です。Travisすげー。

    追記

    宮内さん

    $ WP_MULTISITE=1 phpunit

    でいけるだろ、と指摘されました。そりゃそうだ。

    シングルサイトでもしっかりテストしなきゃ行けないときはコマンドラインで変数を渡して上げる方が良いですね。

  • WordPress等のCMSがjQuery等を出力するとき、browserifyで上手いことやる。

    最近、jsでrequireが無いと生きれない身体になってしまいました。

    CoffeeScriptから卒業して、ES6でコードを書くようにもしています。ES6のClass構文とかアロー関数が無いと人生辛くなってきました。

    そんなわけで自分はbrowserifyを使ってコードを書いてます。requireを良い感じにコンパイルして1つのファイルにまとめてくれる奴です。

    そんなときに結構困るのがwp_head()や、wp_footer()からscriptタグでjQueryunderscore.jsBackbone.js等の有名処のライブラリが出力される場合があることです。

    functions.phpで無理矢理消しても良いのですがそれは筋が悪そうなので、browserify-shimを使って指定されたライブラリはグローバル変数のものを使うようにします。

    そのコードがこんな感じ。

    gist: https://gist.github.com/torounit/0da591b62d03187b4641

    package.json

    {
      "browserify-shim": {
        "jquery": "global:jQuery",
        "underscore": "global:_",
        "backbone": "global:Backbone"
      },
      "devDependencies": {
        "babelify": "^6.1.3",
        "browserify": "^11.0.0",
        "browserify-shim": "^3.8.10",
        "debowerify": "^1.3.1",
        "gulp": "^3.9.0",
        "gulp-notify": "^2.2.0",
        "vinyl-buffer": "^1.0.0",
        "vinyl-source-stream": "^1.1.0",
        "watchify": "^3.3.0"
      },
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "Toro_Unit",
      "license": "ISC"
    }
    

    gulpfile.js

    'use strict';
    
    // ==================================
    //
    // Config.
    //
    // ==================================
    
    var config = {
        browserify: {
            bundleOption: {
                cache: {}, packageCache: {}, fullPaths: false, //for watchfy.
                debug: true,
                entries: './src/scripts/app.js',
                extensions: ['js', 'jsx'],
            },
            dest: './dist/scripts/',
            filename: 'app.js'
    
        }
    }
    
    // ==================================
    //
    // Load modules.
    //
    // ==================================
    
    var source = require('vinyl-source-stream');
    var browserify = require('browserify');
    var watchify = require('watchify');
    var gulp = require('gulp');
    var notify = require("gulp-notify");
    
    var handleErrors = function() {
        var args = Array.prototype.slice.call(arguments);
        notify.onError({
            title: "Compile Error",
            message: "<%= error.message %>"
        }).apply(this, args);
        this.emit('end');
    };
    
    // ==================================
    //
    // Compile JavaScripts.
    //
    // ==================================
    
    gulp.task('setWatch', function () {
        global.isWatching = true;
    });
    
    gulp.task('browserify', function () {
    
        var b = browserify(config.browserify.bundleOption)
            .transform('babelify')
            .transform("browserify-shim")
            .transform("debowerify");
    
        var bundle = function () {
            b.bundle().on('error', handleErrors)
                .pipe(source(config.browserify.filename))
                .pipe(gulp.dest(config.browserify.dest));
        };
        if (global.isWatching) {
            var bundler = watchify(b);
            bundler.on('update', bundle);
        }
        bundle();
    });
    
    gulp.task('watchify', ['setWatch', 'browserify']);
    

    タスク

    $ gulp browserify //コンパイル
    $ gulp watchify //ファイルの変更を監視して自動コンパイル

    といった格好になります。

    browserify-shim

    browserifyには、transformというAPIがありまして、ここにプラグインを突っ込むことが出来ます。

    アプリケーションコード上のJSから呼び出せるのは通常、node_modulesにインストールされているものか、ファイル名で指定されたJSのみですが、require(‘jquery’) のようなコードを書いたときに、node_modulesではなく、グローバル変数のjQueryを呼んでくることが出来るようになります。

    package.jsonにbrowserify-shimという項目を作ってこんな感じで指定すれば動作します。

    {
      "browserify-shim": {
        "jquery": "global:jQuery",
        "underscore": "global:_",
        "backbone": "global:Backbone"
      }
    }

    debowerify

    debowerifyは、bowerでインストールしたライブラリをrequireやimportできるようにするプラグインです。

    最近オワコンと言われているbowerですが、jQueryプラグインなどをnpmでインストールして持ってくると、そこからnode_modules内のjqueryを取ってきてしまうと言う問題があります。shimの方の設定が悪いのかどうなのか解らないのですが、そんなわけでその手のものは仕方ないのでbowerで持ってきてrequire(import)します。

    npmだけで管理はしたいのでどうにかしたいところです。最悪、jQueryプラグインも普通にscriptタグで読み込ませるコトもたまにやります。

     

    まとめ

    とりあえずこれで、ライブラリの多重インストールを避けつつインストールが出来ます。後はテーマ側で

    $js_path = get_template_directory_uri() . 'dist/scripts/app.js';
    wp_enqueue_script( 'app', $js_path, array( 'underscore', 'jquery' ), '1.0.0', true );
    

    とかやればとりあえずは終了です。

    まぁ、WordPressのunderscore.jsとかBackbone.jsバージョンが古い問題とかもあるんですけどね。。。

     

  • WordCamp Kansai 2015 に参加してきました。

    7/25・7/26の二日間、大阪大学で開催されたWordCamp Kansai 2015に参加してきました。

    今年は宮内さんにお誘い頂いて、東京の堀家さん・長崎のキタジマさん・長野のとろゆにという何とも地方色溢れるメンバーでセッションとハンズオンをやらせて頂きました。

    ワタクシはデプロイ先のサーバーの設定と、自分のプラグインの手動テスト時代の闇を熱く語る担当でした。

    ほぼ初対面のメンバーで45分って・・・思ってたんですけど意外に短いもんですね。

    サーバー自体はあと少しの間は立てておくので、ハンズオン参加者の人は遊んでみて下さい。
    ハンズオン出てないよ!って人とか、サーバーつながらないよーって人は、

    あたりを見るといろんなサーバーでも出来るのでやってみて下さい。

    他には、2日目のリアルフォーラムの回答者をやらせて頂きました。凄い人たちばかりだったのでだいたい全部しゃべって頂いたのでほとんど回答してなかった気はしますが、仕事上の立場や規模、地域などもバラバラなのにほとんど結論が変わらないのがおもしろかったです。行き着くところはだいたい一緒なんですかね。

    その他の時間はずーっとコントリビュートスタジオに引きこもっていたのでセッション全然見てないです。後でスライドとか動画を見返したいと思います。

    関西や九州の方々はTwitterやFacebook、Githubやりとりは結構多いのですが、実は話したコト全然無い人たちがたくさん居たのでいろいろ話せたのがとにかく楽しかったです。ネットだと、Contact Form 7の三好さんとWP Multibyte Patchのてんぷらさんの滅茶苦茶濃度の濃い雑談なんて絶対聞けないですし。

    反省とか次回までのTodoとか。

    2日間朝から夜までみたいなのもスピーカーやったのも初めてだったし、いろいろ反省というか。

    飲み過ぎない。

    前日から、2日目の打ち上げまでアホみたいに飲んでました。ずーっと内臓の調子は悪かったような気がします。別に飲まなくても楽しいので、お酒はほどほどにしましょう。

    キタジマさんいろいろごめんなさい。

    あとホテルに戻るときにiPad落として画面割りました。せつないです。

    Tシャツは多めに持っていくor現地調達

    松本市とは湿度がだいぶ違うので、体感温度の差がやばいです。ずーっとサウナに居る気分でした。午前中の時点で汗だくでTシャツが気持ち悪かったです。

    英語のリスニングを勉強する

    WooCommerceの中の人も居て懇親会などでいろいろお話させて頂いたり、プルリクします!みたいな話もさせて貰ったのですが、英語しゃべれたら絶対楽しいと思ったので、英語を聞く耳をちゃんと作ろうと思います。

    感想とか

    とりあえず、YATさんに「ずーっとにこにこしてるねー」って言ってもらえる位楽しんでいたようです。

    地元のビール祭りや学生のイベントに関わらせて頂くことも多いですが、イベントを一から作り上げるって本当にすっごいことだと思います。スタッフの皆さん本当にありがとうございます。

    またそう遠く無いうちに大阪に行くことになりそうなので、直接お礼を言わせて頂ければと思います。ありがとうございました。

     

  • Simple Post Type Permalinks 1.1.0 をリリースしました。

    Simple Post Type Permalinks 1.1.0 をリリースしました。

    Simple Post Type Permalinks をアップデートしました。

    ダウンロードはこちら。https://ja.wordpress.org/plugins/simple-post-type-permalinks/

    • get_post_type_archive_linkをサポート
    • WPMLやWooCommerceとの動作テスト
    • アクションフックやフィルターフックの追加
    • テストコードを追加

    等の変更を行っています。

    プルリクなどお待ちしてますー!

    Github Repository

     

  • RS CSV Importer Media Add-On 1.0.0 をリリースしました。

    最近はconcrete5でおなじみの菱川さんが作った、Really Simple CSV Importerというプラグインがありまして。よくお世話になってます。

    この間、画像データを投稿に紐付ける必要がありまして。

    出来れば画像はWordPressのメディアとして管理して、カスタムフィールドに画像のIDを突っ込めればなー。カスタムフィールドにURL突っ込めばダウンロードしてこれないかなーって要件がありましてた。

    ということで、Really Simple CSV Importerのアドオンプラグインを作りました。

    RS CSV Importer Media Add-Onというまんまな名前のプラグインです。

    一昨年くらいにフォークしてその機能をつけたりしてたのですが、URLをそのまま使いたいこともあったりで、アドオンにしておいた方がいろいろ便利だなと言うことで。

    使い方

    Really Simple CSV Importerをインストールして有効化した後、RS CSV Importer Media Add-Onをインストールして有効化して下さい。

    その後はReally Simple CSV Importerの使い方と一緒です。カスタムフィールドの欄に画像などWordPressのメディアとして扱えるファイルのURLが存在した場合、ダウンロードして記事のカスタムフィールドの値をメディアのIDに変更します。

    CSVのサンプルはこちらを参考にして下さい。https://github.com/torounit/rs-csv-importer-media-addon/blob/master/sample/linux.csv

    IDにして保存するので、モンキーレンチのキタジマさんSmart Custom Fieldsとも相性が良かったりします。

    インポートするファイルの拡張子の設定

    really_simple_csv_importer_media_ext2typeというフィルターフックを作りました。

    これにフックすると、インポートするファイルの拡張子を変更することが出来ます。これで、画像はダウンロードするけどPDFへのURLはそのまま、みたいなことも出来るようになってます。

    Sample Code
    add_filter('really_simple_csv_importer_media_ext2type', 'really_simple_csv_importer_media_ext2type');
    
    function really_simple_csv_importer_media_ext2type( $types ) {
        return array(
            'image'       => array( 'jpg', 'jpeg', 'jpe', 'gif', 'png' ),
            'audio'       => array( 'mp3', 'ogg', 'wav', 'wma' ),
            'video'       => array( 'mov', 'mp4', 'mpeg', 'mpg', 'ogm', 'ogv', 'wmv' ),
            'document'    => array( 'doc', 'docx', 'odt', 'pages', 'pdf', 'psd' ),
            'spreadsheet' => array( 'ods', 'xls', 'xlsx' ),
            'interactive' => array( 'swf', 'key', 'ppt', 'pptx', 'odp' ),
            'text'        => array( 'asc', 'csv', 'tsv', 'txt' ),
            'archive'     => array( 'dmg', 'gz', 'rar', 'tar', 'tgz', 'zip'),
            'code'        => array( 'css', 'htm', 'html', 'php', 'js' ),
        );
    }

    使い方wp_ext2typeへのフックと変わらないです。というか内部的にはこれ使ってます。なのでデフォルトでは、wp_ext2typeが許可しているモノを全て許可します。svgなどWordPressがアップロードを許可してないモノはまた別に設定が必要です。WordPressの管理画面からアップロード可能なモノのみ受け付けます。

    レポジトリ

    Github: https://github.com/torounit/rs-csv-importer-media-addon

    バグなどあったらプルリク下さいー。

  • Custom Post Type Permalinks 1.0.0以上で発生する、カスタム投稿へのパーマリンクが404になってしまう現象について。

    ちょっと報告が複数あったので対処法などをまとめておきます。

    wp_loaded のactionの最後のほうで、Rewrite Ruleの登録を行うように変更したことに絡んで発生した不具合です。

    flush_rewrite_rulesをregister_post_typeやregister_taxonomyの直後に動作させている場合に発生します。

    register_post_type( 'hoge', $post_type_args );
    register_taxonomy( 'piyo', 'hoge', $taxonomy_args );
    flush_rewrite_rules();

    flush_rewrite_rulesはURLをどのように分解するかというRewrite Ruleというモノを全て削除し再生成するものです。このRewrite Ruleを参照してWordPressはURLを理解しています。

    flush_rewrite_rulesはとても重いので毎回実行すべきものでは無いです。ではいつ動作するのかと言うことですが、管理画面のパーマリンク設定を更新したときに実行されます。そのときに、Rewrite Ruleはデータベースに保存されます。

    参考:

    Custom Post Type Permalinks 1.0.0からは、register_post_typeやregister_taxonomyの時点でrewrite_ruleの登録を行いません。その段階でflush_rewrite_rulesを実行してしまうと、変更されていないモノから生成してしまうので404になってしまうと言うことです。

    Codexでもflush_rewrite_rulesは毎回に動作させるのはバットプラクティスだと名言されているので、この問題についてプラグイン側で修正をする予定はありません。

    もし、flush_rewrite_rulesをregister_post_typeやregister_taxonomyの後に動作させている場合は、flush_rewrite_rulesを削除してください。

  • Custom Post Type Permalinks 1.0.0 をリリースしました。

    Custom Post Type Permalinks

    Custom Post Type Permalinks 1.0.0 をリリースしました。

    Plugin Directory: https://wordpress.org/plugins/custom-post-type-permalinks/

    変更点

    wp_loaded のactionの最後のほうで、Rewrite Ruleの生成を行うように変更しました。

    投稿タイプとタクソノミーが絡むパーマリンクの生成時の不具合の修正のための仕様変更です。

    カスタムタクソノミーのアーカイブの時に、post_typeのクエリを渡せるようにしました。

    管理画面から設定できます。これを渡すと、タクソノミーテンプレートより、カスタム投稿タイプのアーカイブテンプレートが読まれます。

    register_post_typeでパーマリンクを設定できるようにしました。

    register_post_type( 'foo',
        array(
            "public" => true,
            'has_archive' => true,
            "rewrite" => [
                "with_front" => true
            ],
            "cptp_permalink_structure" => "%post_id%"
        )
    );

    こんな感じで、設定できるようになってます。管理画面の設定より優先されます。

    バージョン番号をセマンティックバージョニングにしました。

    Plugin Directoryからアクティブなバージョンが見えるようになったというのもあったりで、セマンティックバージョニングするようにしました。なので、とりあえず、1.0.0です。

    その他、バグFix等多数です。

    Other Notes

    プルリク、バグレポート等、くださいー。

    @Toro_Unit

    Github. https://github.com/torounit/custom-post-type-permalinks

    最近プラグインリリース祭りなのですが、姉妹品のSimple Post Type Permalinksや、Powerful Posts Per Page(PPPP)等もよろしくお願いします。

     

    お酒とか下さい。

    Wish List. http://www.amazon.co.jp/registry/wishlist/COKSXS25MVQV/

     

  • Powerful Posts Per Page 0.8.0をリリースしました。

    pppp

    WordPressの1ページあたりの投稿数(Posts Per Page)を、タクソノミーやカスタム投稿タイプで個別に設定できるようにするプラグイン、Powerful Posts Per Pageの0.8.0をリリースしました。

    1年以上放置してたので、久々の更新です。というか2013年にリリースしたプラグインだったんですね。もっと最近だと思っていたのですが。

    今回のアップデートでは、4.2等でのテスト、テストコードの追加、Classをファイルごとに分割などです。

    内容はほとんど変更してないです。

    これからも細々とメンテナンスしていきます。

     

    Plugin Directory: https://wordpress.org/plugins/pppp/

    Github: https://github.com/torounit/pppp

    プルリクエストなど、お待ちしてますー。

  • WordPress のカスタム投稿タイプのパーマリンクを簡単に変更できるようになるプラグイン「Simple Post Type Permalinks」作った。

    WordPress のカスタム投稿タイプのパーマリンクを簡単に変更できるようになるプラグイン「Simple Post Type Permalinks」作った。

    Simple Post Type Permalinks というプラグインをリリースしました。

    名前通り、投稿タイプごとにパーマリンクを設定できるプラグインです。どこかで聞いたことのあるような名前のプラグインですが、それとはまた別物です。

    できること

    • カスタム投稿タイプごとにパーマリンクを設定。%post_id%%postname%が使用可能。
    • register_post_typeで、パーマリンク構造の定義。

    の2種類です。

    できないこと

    • タクソノミー(カテゴリーやタグを含む)等には対応してません。
    • 日付、著者などのタグも使えません。
    • %post_id%%postname%だけしか使えません。
    • アーカイブのパーマリンクを自動的に追加しません。

    とにかく、シングルページのパーマリンクのカスタマイズだけが可能です

    使い方

    管理画面は、こんな感じです。

    sptp

    例のプラグインと同じく「パーマリンク設定」のページの下にパーマリンク設定のセクションがあります。そこから、適当にパーマリンクを設定して下さい。投稿タイプのスラッグを入れない設定などもできますが、投稿や固定ページのパーマリンクと競合すると404になったりします。

    もしくは、register_post_typeで投稿タイプを定義する際にパーマリンクをコードで設定します。

    register_post_type( 'hoge',
        array(
            "public" => true,
            "sptp_permalink_structure" => "foo/%post_id%"
        )
    );

    開発の理由

    Custom Post Type Permalinksというプラグインをすでにリリースしてますが、その機能縮小版のようなプラグインをなぜリリースしたかってコトなんですケド。

    別に、Custom Post Type Permalinksの開発・メンテナンスは止めません。細々とこれからもやりますよー。

    Custom Post Type Permalinksには、パーマリンクの変更のほかにも、日付アーカイブ、カスタムタクソノミー、いろんな機能が入ってたりします。

    それはそれでいいんですけど、「別に日付アーカイブとか要らないし!」ってときに逆に面倒だったり。かといって設定項目追加したらそれもそれで訳わからんなぁー、ってことになり、とにかくシンプルにカスタム投稿タイプの記事のパーマリンク変更するだけのプラグインを作ったということです。

    なので、同じようなプラグインですけど方向性が違います。そのため、Simple Post Type Permalinksでは投稿タイプのスラッグを無視したパーマリンクも設定できるようになってます。

    あとは単純に、Custom Post Type Permalinksを書き直したい欲を満たすためでもあったりします。

    PHP 5.3以上でしか動作しません。PHP 5.2だと、ファイルが読まれないようにしてます。

    とりあえず、プルリクとか待ってますー!

    Github: https://github.com/torounit/simple-post-type-permalinks