WordPressを3.4にしたらAuto Post Thumbnailが動かなくなったので修正してみた

wplogo-stacked-cmyk

WordPressのバージョンを3.4にあげたらAuto Post Thumbnailfix_thumbnail.phpで作っていたサムネイル画像(アイキャッチ画像)が表示されなくなってしまいました。

autopostthumbnail

これは何事?っと思ってプラグインのサポートページを見てみたら、上記のようなことに……。サポートフォーラムを見てみたら、どうやらプラグインのバグに起因しているようで、いままではなんとなく動作してたけど、Wordpress3.4になったらこのあたりの動作が変わってバグが顕在化したという感じのようです。

修正箇所としては、

$thumb_id = wp_insert_attachment($attachment, $file, $post_id);

の$fileの部分を$new_fileに書き換えます。

$thumb_id = wp_insert_attachment($attachment, $new_file, $post_id);

これだけで新規投稿についてはサムネイルが作成されるようになりますが、問題は過去分。サポートフォーラムでは、

  1. メディアライブラリから画像を削除してAuto Post Thumbnailで新規にサムネイルを生成する
  2. MySQLのwp_postmetaテーブルから「meta_key」が「_thumbnail_id」のレコードを削除し、Auto Post Thumbnailで新規にサムネイルを生成する

という2つの方法が提案されていました。ですが1は面倒だし、2についてはDB上にゴミレコードが残ってしまいそうだったので他に方法がないかちょっと調べてみました。

そうしたところ、どうやらサムネイルが表示されないのはプラグインのバグでwp_postmetaに「meta_key」が「_wp_attached_file」のレコードが生成されていなかったのが原因のようでした。なので、このレコードを補ってあげればファイルやレコードを削除することなくサムネイルを復活できるはず。ということで適当なプラグインを作ってみました。

シェルが使えればプラグインにしなくてもphpスクリプトで簡単に修正できそうだったのですが、SIXCOREではシェルが使えないので仕方がないです。とりあえず作ったプラグインは下記。

<?php
/*
Plugin Name: fix thumbnail
Plugin URI: https://www.dream-seed.com/weblog/
Description: auto post thumbnailの修正用適当プラグイン
Version: 0.01
Author: dreamseed
Author URI: https://www.dream-seed.com/weblog/
*/

add_action('admin_menu', 'admin_menu_example'); 

function admin_menu_example() {
    add_options_page('fix thumbnail', 'fix thumbnail', 'manage_options', 'fix_thumbnail.php', 'example');
}

function example() {
    global $wpdb;
?>

<div class="wrap genpostthumbs">
    <h2>fix thumbnail</h2>

<?php 
    // If the button was clicked
        if ( !empty($_POST['action']) ) {

            $query="SELECT * FROM {$wpdb->posts} p where p.ID IN (select meta_value from {$wpdb->postmeta} where meta_key like '_thumbnail_id') and p.ID NOT IN (select post_id from {$wpdb->postmeta} where meta_key like '_wp_attached_file') ORDER BY  `ID` DESC ";

            $posts = $wpdb->get_results($query);
            if (empty($posts)) {
                        echo '<p>error</p>';
                    } else {

                foreach ( $posts as $post ){
                        preg_match("@https://www.dream-seed.com/weblog/wp-content/uploads/(.+)@i",$post->guid,$matches);
                        update_attached_file( $post->ID, $matches[1]); 
                        /*echo "<p>$post->post_parent  $post->ID   $matches[1]</p>";*/
                }
            }
        }
        else {
?>
 <form method="post" action="<?php $_SERVER['PHP_SELF']; ?>">
<input type="hidden" name="action" value="update" />
            <p class="submit">
                <input type="submit" class="button-primary" value="<?php _e('Save Changes') ?>" />
            </p>
        </form>
<?php
        }
}
?>

これをfix_thumbnail.phpという名前でプラグインフォルダにアップロードしてください(ここにも置いておきます)。スクリプト中にファイルのアップロードパスがベタ書きされているところがあるのでそこだけ環境にあわせて書き換えて下さい。

preg_match("@https://www.dream-seed.com/weblog/wp-content/uploads/(.+)@i",$post->guid,$matches);

多分便利な変数があるのだろうけど、調べるのもめんどくさかったので……。

プラグインを有効にした後、設定メニューでfix thumbnailを選ぶとボタンが1個だけの手抜き画面が表示されるので、ボタンを押せば完了です。記事数やサーバスペックにもよりますが、しばらく応答がなくなったようになります。手抜きのため、プログレスバーも何もありません。ちなみに完了しても何もありません。ブラウザの表示を見て読込中かどうかを判断して下さい。

とりあえずうちの環境では約30秒で完了し、サムネイル表示が復活しました。たぶん悪さはしないと思いますが試される方は自己責任でお願いします。

タイトルとURLをコピーしました