WordPressの記事内にある、imgのaltの中身が空の場合にエラーを表示するようにしてみた

技術情報
本ページは広告およびアフィリエイトプログラムによる収益を得ています。

記事内に画像を挿入した後、うっかりaltの中身を空(alt=””)にして投稿してしまうことがあると思います。

ある記事を見て出来そうだったので、altの中が空の場合に投稿画面でエラーを表示するようにしてみました。

functions.php

下記の記述を子テーマのfunctions.phpに記述します。

add_action('admin_head-post-new.php', 'my_publish_admin_hook');
add_action('admin_head-post.php', 'my_publish_admin_hook');
function my_publish_admin_hook(){

    global $post;

    if (is_admin() && $post->post_type == 'post'){
    ?>
    <script language="javascript" type="text/javascript">
        jQuery(document).ready(function() {
            jQuery('#publish').click(function() {
                if(jQuery(this).data("valid")) {
                    return true;
                }
                var form_data = jQuery('#post').serializeArray();
                var data = {
                    action: 'my_pre_submit_validation',
                    security: '<?php echo wp_create_nonce( 'pre_publish_validation' ); ?>',
                    form_data: jQuery.param(form_data),
                };
                jQuery.post(ajaxurl, data, function(response) {
                    if (response.indexOf('true') > -1 || response == true) {
                        jQuery('#publish').data("valid", true).trigger('click');
                    } else {
                        alert("エラー: " + response);
                        jQuery("#publish").data("valid", false);
                    }
                    jQuery('#ajax-loading').hide();
                    jQuery('#publish').removeClass('button-primary-disabled');
                    jQuery('#save-post').removeClass('button-disabled');
                });
                return false;
            });
        });
    </script>
    <?php
    }
}

add_action('wp_ajax_my_pre_submit_validation', 'pre_submit_validation');
function pre_submit_validation(){

    check_ajax_referer( 'pre_publish_validation', 'security' );

    parse_str( $_POST['form_data'], $vars );

    //imgの「alt=""」を正規表現で「$pattern」に代入
    $pattern = '/<img(?![^>]*alt="[^"])[^>]*>/i';

    //記事内のimgに「alt=""」があった場合にエラーを表示する
    if( preg_match($pattern, $vars['content']) ){
        echo '空のaltがあります。';
        die();
    }

    echo 'true';
    die();
}

上記は公開や更新ボタンをクリックした時に動作するAjaxを定義し、そこから呼ばれたPHP側の処理で投稿された記事のバリデーションを行っています。

以下のサイトを参考にさせてもらいました。

WordPressで投稿時にバリデーションを行う方法
WordPressで投稿時に、投稿した記事の中に特定の文字が入っているか確認し、入っていればそのまま保存し、入っていなければ警告を表示して保存を中断するというバリデーションの処理方法を紹介したいと思います。 save_p ...

正規表現での検索や、エラーを表示する記述部分は以下になります。

解説1

$pattern = '/<img(?![^>]*alt="[^"])[^>]*>/i';

imgの「alt=””」を正規表現で「$pattern」に代入しています。

解説2

if( preg_match($pattern, $vars['content']) ){
    echo '空のaltがあります。';
    die();
}

「$pattern」に代入された結果(「alt=””」)を「preg_match」で記事内を検索して、マッチングした場合に「空のaltがあります。」という文言を表示します。

エラー表示

記事内のimgに「alt=””」があった場合、下記のようなエラーが表示されます。

altが空のエラー
エラー表示(Chromeブラウザ)

正規表現チェッカー

作成した正規表現の動作チェックを行う場合、「正規表現チェッカー PHP: preg_match() / JavaScript: match()」を利用すると楽になります。

正規表現チェッカー 入力

  1. 前後にデリミタをつけ、正規表現を入力。
  2. マッチング対象の文字列を入力。
  3. 「チェック!」ボタンをクリック。

上記の操作を行うと入力した正規表現の結果が表示されます。

正規表現チェッカー 結果
正規表現チェックの結果

まとめ

  • 子テーマのfunctions.phpにコードを記述する。
  • 正規表現を使ってマッチングさせる。
  • 「正規表現チェッカー」を使うと動作チェックが楽。

今回のaltバリデーションと、以前ご紹介したChrome拡張機能の「Alt & Meta viewer」を併用すると、かなりいい感じになりそうです。

今回の方法を応用すれば、何か他にもいろいろと出来そうな気がします。少し様子を見て、試していきたいと思います。

スポンサーリンク
技術情報
スポンサーリンク
シェアする
ボヘミアンをフォローする
この記事が気に入ったら
フォローしよう
最新情報をお届けします。
スポンサーリンク

コメント