[WordPress小ネタ] メディアファイルのアップロード時に自動付与されるタイトル・キャプションを空欄で登録する機能

function media_upload_default( $post_ID ) {
    $args = array( 
                    'ID'           => $post_ID, 
                    'post_title'   => '', 
                    'post_excerpt' => '', 
                    'post_content' => '', 
            );

    wp_update_post( $args );

}
add_action( 'add_attachment', 'media_upload_default' );

下記サイトを参考にしました。

How can I add a default description to uploaded files?
http://wordpress.stackexchange.com/questions/121709/how-can-i-add-a-default-description-to-uploaded-files


2016

2016

本年もどうぞよろしくお願い申し上げます。


MovableType形式のエクスポートファイルをWordPressへ正常にインポートできない事象のひとつの原因、その対策

ライブドアブログからWordPressへ記事を移行するお仕事があり、MT形式のエクスポートファイルをインポートすると、管理画面上では問題なく完了したように見えて実は複数の記事が登録されていなかった事があったので、その原因と対策をメモします。

困ったこと

ライブドアブログやTypePadなど、MovableType形式のブログから書き出した記事をWordPressへインポートすると、件数が多くても少なくても、エラー表示が無いまま完了画面が表示されるものの、特定の記事の取込みが必ず失敗する。
インポートに使用するプラグインは「Movable Type and TypePad Importer

原因

プラグイン側の設定により、1行あたりの容量が8192(-1)バイトに制限されているため、記事内の長大な行を正常に処理できない

/wp-content/plugins/movabletype-importer/movabletype-importer.php
102〜106行目

function fgets($fp, $len=8192) {
	if ( $this->has_gzip() )
		return gzgets($fp, $len);
	return fgets($fp, $len);
}

対策

  • エクスポートファイルに、改行タグなどの位置で適度な改行を加える
  • $len=8192 の数値を適度に大きくするか、またはlengthを指定しない

Twitterの投票機能付き投稿をAPIで取得してみた

そういえば@TwitterJPの最初の投票機能付き投稿API越しではどう見えるか気になったので、取得してみました。
結果、投票があったかどうかすら分からない…

Twitterとしてはサイトか公式クライアント使ってほしいだろうし、APIでは提供しないのかな。

stdClass Object
(
    [created_at] => Thu Oct 22 07:49:56 +0000 2015
    [id] => 657101565237432320
    [id_str] => 657101565237432320
     => みなさんのアカウントには新しい投票機能が入りましたでしょうか?まだの方は、数日中に追加されるはずですので、もう少々お待ちください。
投票機能はこんな風にご利用いただけます。

好きなのは…
     => <a href="http://twitter.com" rel="nofollow">Twitter Web Client</a>
    [truncated] => 
    [in_reply_to_status_id] => 
    [in_reply_to_status_id_str] => 
    [in_reply_to_user_id] => 
    [in_reply_to_user_id_str] => 
    [in_reply_to_screen_name] => 
    [user] => stdClass Object
        (
            [id] => 7080152
            [id_str] => 7080152
            [name] => TwitterJP
            [screen_name] => TwitterJP
            [location] => 東京都中央区
            [description] => 日本語版Twitter公式アカウントです。
            [url] => https://t.co/A9dNuL0CCa
            [entities] => stdClass Object
                (
                    [url] => stdClass Object
                        (
                            [urls] => Array
                                (
                                    [0] => stdClass Object
                                        (
                                            [url] => https://t.co/A9dNuL0CCa
                                            [expanded_url] => http://blog.jp.twitter.com
                                            [display_url] => blog.jp.twitter.com
                                            [indices] => Array
                                                (
                                                    [0] => 0
                                                    [1] => 23
                                                )

                                        )

                                )

                        )

                    [description] => stdClass Object
                        (
                            [urls] => Array
                                (
                                )

                        )

                )

            [protected] => 
            [followers_count] => 1972807
            [friends_count] => 70
            [listed_count] => 16500
            [created_at] => Tue Jun 26 01:54:35 +0000 2007
            [favourites_count] => 59
            [utc_offset] => 32400
            [time_zone] => Tokyo
            [geo_enabled] => 
            [verified] => 1
            [statuses_count] => 3346
            [lang] => ja
            [contributors_enabled] => 
            [is_translator] => 
            [is_translation_enabled] => 
            [profile_background_color] => C0DEED
            [profile_background_image_url] => http://pbs.twimg.com/profile_background_images/567482719571959809/WwgdnJCP.jpeg
            [profile_background_image_url_https] => https://pbs.twimg.com/profile_background_images/567482719571959809/WwgdnJCP.jpeg
            [profile_background_tile] => 1
            [profile_image_url] => http://pbs.twimg.com/profile_images/3407356865/62f0d53222361fbd2c1fe9889f4cc559_normal.png
            [profile_image_url_https] => https://pbs.twimg.com/profile_images/3407356865/62f0d53222361fbd2c1fe9889f4cc559_normal.png
            [profile_banner_url] => https://pbs.twimg.com/profile_banners/7080152/1445475230
            [profile_link_color] => 0084B4
            [profile_sidebar_border_color] => FFFFFF
            [profile_sidebar_fill_color] => DDEEF6
            [profile_text_color] => 333333
            [profile_use_background_image] => 1
            [has_extended_profile] => 1
            [default_profile] => 
            [default_profile_image] => 
            [following] => 
            [follow_request_sent] => 
            [notifications] => 
        )

    [geo] => 
    [coordinates] => 
    [place] => 
    [contributors] => 
    [is_quote_status] => 
    [retweet_count] => 8507
    [favorite_count] => 2675
    [entities] => stdClass Object
        (
            [hashtags] => Array
                (
                )

            [symbols] => Array
                (
                )

            [user_mentions] => Array
                (
                )

            [urls] => Array
                (
                )

        )

    [favorited] => 
    [retweeted] => 
    [lang] => ja
)

El Capitanでbrew updateする

El Capitanにアップグレードしたら、Homebrewのアップデートがエラーでつまずくようになったので、解消した際のメモ。

$ sudo chown $(whoami):admin /usr/local
$ sudo chown -R $(whoami):admin /usr/local

via: HomebrewはEl Capitanへアップグレードする前に入れておく : El Capitanをクリーンインストールせざるを得ない場合

$ cd $(brew --prefix)
$ git fetch origin
$ git reset --hard origin/master

via: ヾ(o゚ω゚o)ノ゙brew updateでエラーでたった[Homebrew] : brew updateできるようにした

$ brew update
Already up-to-date.

できたー


備忘録: 日本語キーワードに基づいたリンクを本文中に自動設定するWordPressプラグインを試してみる

以下の要件で、キーワードに基づいたリンク設定を本文中で自動的に行うプラグインをあれこれ使って探してみたので、結果をメモしておきます。

  • 管理画面上でキーワード・URLの設定ができる。
  • 日本語キーワードが使える。
  • 本文中に複数存在する場合、最初だけリンク設定する。
  • いつでも使用終了できるよう、投稿内容自体の書換は行わない。

WordPress公式プラグインディレクトリにて非公開(または却下)になっているもの

  • WP Keyword Link(2015.09.21現在非表示になっている)

WordPressの仕様変更による動作不全、日本語非対応などのため使用不可

  • Affiliate Link Builder
  • Auto Affiliate Links
  • Automatic SEO Links
  • SEO Content Links
  • SEO Smart Links
  • Keyword to URL
  • WP KeyLink

投稿内容の書換が必要

日本語対応だけど最初の1つに限定できない

要件を満たすもの


【解決済】さくらのレンタルサーバでPHP5.6を使用すると、file_get_contenst等でSSLエラーになることがある件と、当座の解消法

★追記:2016-04-30

さくらのレンタルサーバの「標準のPHP」が5.6になってたので、改めて確認したところ、SSLエラーは解消されていました。

さくらのレンタルサーバ・さくらのマネージドサーバにて標準のPHP[PHP5] のバージョンを変更します
http://support.sakura.ad.jp/mainte/functionaddentry.php?id=17892

−−−−−−−−−− 以下、解消前の記事 −−−−−−−−−−

スクリーンショット 2015-09-02 10.02.18

しばらく前から、さくらのレンタルサーバでPHP5.6が選べるようになって大変嬉しいのですが、PHP5.6からSSLの扱いが変更になったことと、サーバの証明書の関係で、readfilefile_get_contents などでHTTPSなURLを参照すると、下記のようなエラーになることがあります。

Warning: readfile(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in /foo/var/ssl_test.php on line 1

Warning: readfile(): Failed to enable crypto in /home/foo/bar/ssl_test.php on line 1

Warning: readfile(https://tbx.sakura.ne.jp/test.txt): failed to open stream: operation failed in /home/foo/bar/ssl_test.php on line 1

PHP5.6に設定した後から、他所のファイル読込みやPOSTが一部できなくなって、調べてみたら上記のようなエラーがありました。

root権限のないサーバではやれることに制限があるものの、HTTPSなファイルの読込みを維持したいので、ひとまずは以下のいずれかの方法で解決します。
サポートへリクエストを送ったので、いずれ解消されると思います。

  1. ピア証明書の検証を行わない。 任意の証明書を読ませるオプションを追記する

    php – file_get_contents(): SSL operation failed with code 1. And more – Stack Overflow

    (追記)
    この次の方法でエラーが解消されない場合は、ソースコードをいじることになりますがこの方法が適しています。
    検証を迂回するのはさすがにまずいですね…

  2. php.ini に新しい証明書を認識させる

    ComposerからLaravelを導入しようとしてOpenSSL周りのエラーで困った件 – Qiita

    さくらはphp.iniを編集できるので、新しい証明書を認識させてやります。

    新しい証明書を cacert.crt などにリネームし、適当なところへ配置して下記のようにフルパスを記述します。

    curl.cainfo=/home/foo/bar/cacert.crt
    openssl.cafile=/home/foo/bar/cacert.crt


編集者権限ユーザがWP-Pollsの更新を行えるようにする小ネタ

WP-Pollsは管理者のみ更新可能なので、必要に迫られて編集者でも更新できるようにした際の小ネタ。
プラグイン本体を修正するのはおっかないので、functions.php に追記する方法をとります。

参考サイト

functions.php に追記する内容

function add_wp_polls_caps(){
	$role = get_role('editor');
	if(!$role->has_cap('manage_polls')) {
		$role->add_cap('manage_polls');
	}
}
add_action('admin_init', 'add_wp_polls_caps');

MODX リソース更新時などでAPC Cache/OPcacheをクリアする

APCやOPcacheをインストールしているサーバでMODXを動かしていると、稀に更新が画面に反映されなくて難儀したので、リソースやチャンクの更新時にキャッシュをクリアする方法を検索したもののよくわからず、下記の作業をやってみたら出来たっぽいので書き留めておきます。

  • プラグインを作成
    • プラグイン名: (適当)
    • プラグインコード:
      if(function_exists('opcache_reset')) opcache_reset();
      if(function_exists('apc_clear_cache')) apc_clear_cache();
    • チェックを入れるシステムイベント:
      • OnSiteRefresh
      • OnChunkFormDelete
      • OnChunkFormSave
      • OnDocFormSave
      • OnDocUnPublished
      • OnEmptyTrash
      • OnSnipFormDelete
      • OnSnipFormSave
      • OnTVFormDelete
      • OnTVFormSave
      • OnTempFormDelete
      • OnTempFormSave

リソースやチャンクなどを更新すると、Cached Filesがぐっと減るので、たぶんキャッシュがクリアされてるはず。


livedoor blogからWordPressへ移転する際のパーマリンクに関するメモ

ライブドアブログからWordPressに記事を移転するお仕事した際、なるべくURLを変えたくないなーと思ったのでやってみた作業メモ。

  1. 下準備
  2. WordPress側の設定
    • パーマリンク設定: /archives/%postname%.html
  3. インポート
    • WordPressは、標準でMT形式のインポート機能を追加できる。[ツール > インポート]
    • 環境によっては非常に時間がかかる。
      取込み試験を行ったさくらスタンダードでは、1件につき5秒くらい。ローカル環境では、30分で300件ほど。
    • 取り込んだ後、URLが従前と同じ形式が確認してみる。
  4. ライブドアブログ側のコメントを閉じる。
  5. DNS設定を変更し、移転完了。

パーマリンクの様式をなるべく引き継いだ場合、ひとつ面倒くさくなるのがスラッグの設定。
インポート時、ライブドアブログの記事IDを post_id にできないかといろいろやってみたのですがうまくゆかず、通常通り postname に収めることになったのですが、パーマリンクを post_id ではなく postname にすると、新規投稿を登録するたびにスラッグを設定する必要が生じます。
特に何も考えないと、今まで記事IDだった短いURLが、タイトルから再構成された長ーいものになってしまいます。しかし毎回固有IDっぽいのを割り当てるのも非常にめんどい。
スラッグへIDっぽい文字列を自動で割り当てられたら便利なので、下記サイトのコードを参考にしました。

WordPress の投稿スラッグを自動的に生成する | Simple Colors
http://www.warna.info/archives/2317/

私の場合はこんな塩梅に変更して functions.php に追記しました。

function auto_post_slug( $slug, $post_ID, $post_status, $post_type ) {
	if ( $post_type == 'post' && $post_ID > 0 ) {
		$slug = 60000000 + intval($post_ID);
	}
	return $slug;
}
add_filter( 'wp_unique_post_slug', 'auto_post_slug', 10, 4  );

$post_type == ‘post’ の部分を入れておかないと、固定ページほかあらゆる投稿タイプでスラッグが自動入力されてしまいます。
投稿タイプがpostの場合、WordPressの記事IDに60000000を足した文字列をスラッグに登録します。
60000000は適当です。今現在のライブドアブログ側記事IDが52000000あたりなので、キリの言い数字でスタートすれば分かりやすいかなというふわっとした理由によるものです。
ライブドアブログ側での最終更新の記事IDにちょっと足した数値でも良いでしょう。

記事インポート時はスルーしたいため、 $post_ID > 0 も加えました。
インポート時、wp_insert_post() が動く際には記事IDが確定していないため、$post_idは 0 のままこのフィルタに渡されます。こうしておくとインポート時にはスルーされるようになります(多分)

以上、参考になれば幸いです。