投稿する時にチェックしてメッセージを出すプラグインを作るーその3 完成

この記事は約36分で読めます。

2回に分けて投稿する時にスラッグやmoreやカテゴリーの指定が抜けていないかのチェックや公開するときにポップアップで確認する機能を持つプラグインを作ってきました。今回でいよいよプラグインを完成させます。

投稿する時にチェックしてメッセージを出すプラグインを作るーその1投稿する時にチェックしてメッセージを出すプラグインを作るーその2の続きとなります。

スポンサーリンク

スラッグの入力チェックをするコードを追加

前回作った warn-when-you-post というフォルダの warn-when-you-post.phpスラッグの入力チェックをする部分を追加します。

スラッグが未入力だったり、他のスラッグと重複していたら教えてくれるようなコードとなっています。

function wwyp_slug_check_message() {
    global $pagenow;
    global $post;
    global $wpdb;
    
    $slug_post = get_option('wwyp_slug_post');
    $slug_page = get_option('wwyp_slug_page');
        
    $statusName = array();
    $statusName['publish'] = '公開済み';
    $statusName['pending'] = 'レビュー待ち';
    $statusName['draft'] = '下書き';
    $statusName['future'] = 'スケジュール済み';
    $statusName['private'] = '非公開';

    if ($pagenow == 'post.php'){
        if ($post->post_type == 'post') {
            if ($slug_post != '1') {
                return;
            }
        } elseif ($post->post_type == 'page') {
            if ($slug_page != '1'){
                return;
            }
        } else {
            return;
        }

        $slug = wwyp_get_post_name($post->ID);
        if($slug != ''){
            // 同じslugが存在しているかチェックする
            $sql = "SELECT * FROM $wpdb->posts WHERE (post_type = 'post' OR post_type = 'page') AND ID != ".$post->ID. " AND post_status != 'trash' AND post_name = '%s'";
            $duplicatePosts = array();
            $results = $wpdb->get_results(sprintf($sql, $slug));
            $link = '<a href="'.site_url().'/post.php?p=%s&preview=true" target="_blank">%s(%s)</a>';
            foreach ($results as $value) {
                if($value->post_title == ''){
                    $value->post_title = '(タイトル無し)';
                }
                $duplicatePosts[] = sprintf($link, $value->ID, $value->post_title, $statusName[$value->post_status]);
            }
            if (count($duplicatePosts) > 0){
                $message = implode('<br />', $duplicatePosts);
                echo '<div class="message error"><p>スラッグ「'.$slug.'」が重複しています</p><p>'.$message.'</p></div>';
            }
        } else {
            echo '<div class="message error"><p>スラッグが入っていません!</p></div>';
        }
    }
}
function wwyp_get_post_name($id){
    // ページIDからslugを取得
    $page = get_page($id);
    return $page->post_name;
}

add_action( 'admin_notices','wwyp_slug_check_message' );

wwyp_slug_check_message という関数でチェックをします。functions.phpからプラグインに移動したときに追加した行ですが、

    $slug_post = get_option('wwyp_slug_post');
    $slug_page = get_option('wwyp_slug_page');

ここで、管理画面でスラッグチェックをするかどうかを指定してある値を取得します。

    if ($pagenow == 'post.php'){
        if ($post->post_type == 'post') {
            if ($slug_post != '1') {
                return;
            }
        } elseif ($post->post_type == 'page') {
            if ($slug_page != '1'){
                return;
            }
        } else {
            return;
        }

投稿、固定ページそれぞれスラッグチェックが指示されているかどうかをチェックして指示がないか、投稿でも固定ページでもないときは終了します。

その他のロジックについては、

投稿や固定ページのスラッグに関するメッセージを投稿画面に表示する

で書いてあるものと同じロジックとなっています。

管理画面で、

このように指定してあれば、

投稿

固定ページ

こんな感じにチェックしてメッセージを出してくれるようになります。

未分類チェック、moreチェックをするコードを追加

カテゴリーの未分類チェックをしようとして「固定ページにはカテゴリーがない」ということに気づきました(^_^;。画面から項目を外しました。

カテゴリーの未分類チェックは「未分類」というカテゴリーではダメでそれ以外のカテゴリーを選択しないとエラーになるというチェックになります。

コードは、

function wwyp_category_check_message() {
    // 投稿(post_type='post')のとき カテゴリー が入ってないor未分類カテゴリーが指定されているときにメッセージを出す
    global $pagenow;
    global $post;
    
    $category1_post = get_option('wwyp_category1_post');
    
    if ($category1_post != '1') {
        return;
    }
    
    $categoryRequireMessage ='カテゴリーが未分類です。指定してください';
    $categoryMibunruiExistMessage ='カテゴリー 未分類 にチェックが入っています。チェックを外してください';
    $messageErrorTemplate = '<div class="message error"><p>%s</p></div>';
    
    if ($pagenow == 'post.php'){
        if ($post->post_type == 'post') {
            // 投稿画面で投稿のとき
            $categories = get_the_category( $post->ID );
            $mibunruiExistFlag = false;
            foreach($categories as $category){
                if ($category->cat_ID == 1) {
                    $mibunruiExistFlag = true;
                }
            }
            if ($mibunruiExistFlag == true) {
                if (count($categories) == 1) {
                    // カテゴリーの指定がない
                    echo sprintf($messageErrorTemplate, $categoryRequireMessage);
                } else {
                    // カテゴリーの指定はあるけど、未分類にチェックが入ってる
                    echo sprintf($messageErrorTemplate, $categoryMibunruiExistMessage);
                }
            }
        }
    }
}
add_action( 'admin_notices','wwyp_category_check_message' );

このようになります。プラグイン化したときに追加したのは、

    $category1_post = get_option('wwyp_category1_post');
    
    if ($category1_post != '1') {
        return;
    }

この部分で、管理画面でカテゴリーチェック指示がなければ終了します。その他のロジックについては、

投稿時にカテゴリーが選ばれていなかったらエラーメッセージを出す

で書いてあるものと同じロジックとなっています。

この状態でカテゴリーを指示せずに保存すると

このようにメッセージが表示されます。

moreチェック部分はこのように追加しました。

function wwyp_more_check_message() {
    // more が入ってないときにメッセージを出す
    global $pagenow;
    global $post;
    
    $more_post = get_option('wwyp_more_post');
    $more_page = get_option('wwyp_more_page');
    
    $moreRequireMessage ='more がありません!!!!!';
    $messageErrorTemplate = '<div class="message error"><p>%s</p></div>';
    
    if ($pagenow == 'post.php'){
        if ($post->post_type == 'post') {
            if ($more_post != '1') {
                return;
            }
        } elseif ($post->post_type == 'page') {
            if ($more_page != '1'){
                return;
            }
        } else {
            return;
        }


        if (strpos($post->post_content_filtered, '&lt;!--more--&gt;') === false) {
            // more がない
            echo sprintf($messageErrorTemplate, $moreRequireMessage);
        }
    }
}
add_action( 'admin_notices','wwyp_more_check_message' );

追加した部分はスラッグチェックと同様です。その他のロジックについては、

投稿に「続きを読む」が入っていなかったらメッセージを表示する

で書いてあるものと同じロジックとなっています。

管理画面で、

このように指定しておくと

投稿

固定ページ(固定ページでmoreというのも…あれですが、チェックしたい場合はできますね)

チェックされるようになります。

公開時の確認部分をコーディングする

公開時に確認の指定があれば質問を表示して、あらかじめ決められた答えを入力しない限り公開できないようにします。

コードは、

function wwyp_publish_confirm_admin_print_scripts() {
    global $pagenow;
    global $post;
    
    $wwyp_publish_post = get_option('wwyp_publish_post');
    $wwyp_publish_page = get_option('wwyp_publish_page');
    if (($pagenow == 'post.php') OR ($pagenow == 'post-new.php')){
        if ($post->post_type == 'post') {
            if ($wwyp_publish_post != '1') {
                return;
            }
        } elseif ($post->post_type == 'page') {
            if ($wwyp_publish_page != '1'){
                return;
            }
        } else {
            return;
        }
    }
    $wwyp_confirm_q = get_option('wwyp_confirm_q');
    $wwyp_confirm_a = get_option('wwyp_confirm_a');

    echo <<< EOM
<script type="text/javascript">
<!--
window.onload = function() {
    var id = document.getElementById('publish');
    if (id.value.indexOf("公開", 0) != -1) {
        id.onclick = publish_confirm;
    }
}

function publish_confirm() {
    answer = window.prompt("{$wwyp_confirm_q}", "");
    if (answer == '{$wwyp_confirm_a}') {
        return true;
    } else {
        var elements = document.getElementsByTagName('span');
        for (var i = 0; i < elements.length; i++) {
            var element = elements[i];
            if (element.className.indexOf("spinner", 0) != -1) {
                element.classList.remove('spinner');
            }
        }
        document.getElementById('publish').classList.remove('button-primary-disabled');
        document.getElementById('save-post').classList.remove('button-disabled');

            return false;
    }
}
// -->
</script>
EOM;
}

// 公開する前にアラートを表示する
add_action('admin_print_scripts', 'wwyp_publish_confirm_admin_print_scripts');

このようになります。functions.phpからプラグイン化したときに追加したのはスラッグやmoreの時と同じように投稿、固定ページの時に指示があれば実行する、それ以外の時は終了するという部分。

また、質問と答えを固定にしていましたが、管理画面から指定された質問と答えを表示するようにヒアドキュメントの質問部分と答え部分を

    $wwyp_confirm_q = get_option('wwyp_confirm_q');
    $wwyp_confirm_a = get_option('wwyp_confirm_a');
(中略)
    answer = window.prompt("{$wwyp_confirm_q}", "");
    if (answer == '{$wwyp_confirm_a}') {

このように変更しました。

管理画面で公開確認にチェックを入れておくと、公開 をクリックしたときに

このように指定した質問が表示されます。答えに指定してある文字列を入れると公開することができます。

その他のロジックについては、

「間違って公開を押してもすぐに公開されないようにする-ドジっこスペシャル付き」

に書いてあるものと同じものです。

まとめ:できあがったプラグインはこちらになります

できあがったプラグインはこちらになります →  warn-when-you-post

ソースの中身はこんな感じです↓

<?php
/*
Plugin Name: Warn when you post
Description: 投稿、固定ページを保存したり公開するときにチェックや確認を行いメッセージやポップアップを表示する
Author: MIKA Umoto(RYUS)l
Version: 1.0
Author URI: https://usortblog.com/
*/

add_action( 'admin_menu', 'wwyp_admin_menu' );

function wwyp_admin_menu() {
    add_options_page( 'Warn when you post', 'Warn when you post', 'manage_options', 'my-unique-identifier', 'wwyp_option_input' );
}

function wwyp_option_input() {
    if ( !current_user_can( 'manage_options' ) )  {
        wp_die( __( 'You do not have sufficient permissions to access this page.' ) );
    }
?>
<div class="wrap">
<h2 style="margin-bottom:10px;">Warn when you post</h2>
<form id="warn-when-you-post-form" method="post" action="">
    <?php wp_nonce_field('my-nonce-key', 'warn-when-you-post'); ?>
    <div style="margin-top:10px;">
        <div style="float:left;width:150px;">&nbsp;</div>
        <div style="float:left;width:150px;">投稿</div>
        <div style="float:left;width:150px;">固定ページ</div>
        <div style="clear:both"></div>
    </div>
    <div style="margin-top:10px;">
        <div style="float:left;width:150px;">スラッグチェック</div>
        <div style="float:left;width:150px;"><input type="checkbox" name="wwyp_slug_post" value="1"<?php echo wwyp_edit_checked('wwyp_slug_post');?>></div>
        <div style="float:left;width:150px;"><input type="checkbox" name="wwyp_slug_page" value="1"<?php echo wwyp_edit_checked('wwyp_slug_page');?>></div>
        <div style="clear:both"></div>
    </div>
    <div style="margin-top:10px;">
        <div style="float:left;width:150px;">未分類チェック</div>
        <div style="float:left;width:150px;"><input type="checkbox" name="wwyp_category1_post" value="1"<?php echo wwyp_edit_checked('wwyp_category1_post');?>></div>
        <div style="float:left;width:150px;">&nbsp;</div>
        <div style="clear:both"></div>
    </div>
    <div style="margin-top:10px;">
        <div style="float:left;width:150px;">moreチェック</div>
        <div style="float:left;width:150px;"><input type="checkbox" name="wwyp_more_post" value="1"<?php echo wwyp_edit_checked('wwyp_more_post');?>></div>
        <div style="float:left;width:150px;"><input type="checkbox" name="wwyp_more_page" value="1"<?php echo wwyp_edit_checked('wwyp_more_page');?>></div>
        <div style="clear:both"></div>
    </div>
    <div style="margin-top:15px;">
        <div style="float:left;width:150px;">公開確認</div>
        <div style="float:left;width:150px;"><input type="checkbox" name="wwyp_publish_post" value="1"<?php echo wwyp_edit_checked('wwyp_publish_post');?>></div>
        <div style="float:left;width:150px;"><input type="checkbox" name="wwyp_publish_page" value="1"<?php echo wwyp_edit_checked('wwyp_publish_page');?>></div>
        <div style="clear:both"></div>
    </div>
    <div style="margin-left:60px;">
        <div style="margin-top:10px;">
            <div>質問</div>
        </div>
        <div>
            <input type="text" name="wwyp_confirm_q" style="width:390px;" value="<?php echo esc_attr(get_option('wwyp_confirm_q')); ?>">
        </div>
        <div>
            <div>答え</div>
        </div>
        <div style="margin-top:10px;">
            <input type="text" name="wwyp_confirm_a" style="width:390px;" value="<?php echo esc_attr(get_option('wwyp_confirm_a')); ?>">
        </div>
    </div>
    <p>
    <input type="submit" value="変更を保存">
    </p>
</form>
</div>
<?php
}

function wwyp_edit_checked ($field_name) {
    if (get_option($field_name) == '1') {
        return ' checked';
    }
    return '';
}

add_action('admin_init', 'wwyp_init');

function wwyp_init() {
    // 項目名配列
    $field_array = array('wwyp_slug_post', 'wwyp_slug_page', 'wwyp_category1_post', 'wwyp_more_post', 'wwyp_more_page', 'wwyp_publish_post', 'wwyp_publish_page', 'wwyp_confirm_q', 'wwyp_confirm_a');
    // デフォルトの質問と答え
    $default_q = '公開しても大丈夫ですか?';
    $default_a = '大丈夫';
    
    // nonceの値をチェック
    if ( isset($_POST['warn-when-you-post']) && $_POST['warn-when-you-post'] ) {
        if (check_admin_referer('my-nonce-key', 'warn-when-you-post')) {
            // 値を保存
            foreach ($field_array as $field) {
                if (isset($_POST[$field]) && $_POST[$field]) {
                    update_option($field, $_POST[$field]);
                } else {
                    // 公開チェック指定があるのに質問もしくは答えが入ってなければデフォルトの値を入れる
                    if (($field == 'wwyp_confirm_q') AND (($_POST['wwyp_publish_post'] == '1') or ($_POST['wwyp_publish_page'] == '1'))){
                        update_option($field, $default_q);
                    } elseif (($field == 'wwyp_confirm_a') AND (($_POST['wwyp_publish_post'] == '1') or ($_POST['wwyp_publish_page'] == '1'))){
                        update_option($field, $default_a);
                    } else {
                        update_option($field, '');
                    }
                }
            }
            // 再表示
            wp_safe_redirect(menu_page_url('warn-when-you-post', false));
        }
    }
}

function wwyp_slug_check_message() {
    global $pagenow;
    global $post;
    global $wpdb;
    
    $slug_post = get_option('wwyp_slug_post');
    $slug_page = get_option('wwyp_slug_page');
        
    $statusName = array();
    $statusName['publish'] = '公開済み';
    $statusName['pending'] = 'レビュー待ち';
    $statusName['draft'] = '下書き';
    $statusName['future'] = 'スケジュール済み';
    $statusName['private'] = '非公開';

    if ($pagenow == 'post.php'){
        if ($post->post_type == 'post') {
            if ($slug_post != '1') {
                return;
            }
        } elseif ($post->post_type == 'page') {
            if ($slug_page != '1'){
                return;
            }
        } else {
            return;
        }

        $slug = wwyp_get_post_name($post->ID);
        if($slug != ''){
            // 同じslugが存在しているかチェックする
            $sql = "SELECT * FROM $wpdb->posts WHERE (post_type = 'post' OR post_type = 'page') AND ID != ".$post->ID. " AND post_status != 'trash' AND post_name = '%s'";
            $duplicatePosts = array();
            $results = $wpdb->get_results(sprintf($sql, $slug));
            $link = '<a href="'.site_url().'/post.php?p=%s&preview=true" target="_blank">%s(%s)</a>';
            foreach ($results as $value) {
                if($value->post_title == ''){
                    $value->post_title = '(タイトル無し)';
                }
                $duplicatePosts[] = sprintf($link, $value->ID, $value->post_title, $statusName[$value->post_status]);
            }
            if (count($duplicatePosts) > 0){
                $message = implode('<br />', $duplicatePosts);
                echo '<div class="message error"><p>スラッグ「'.$slug.'」が重複しています</p><p>'.$message.'</p></div>';
            }
        } else {
            echo '<div class="message error"><p>スラッグが入っていません!</p></div>';
        }
    }
}
function wwyp_get_post_name($id){
    // ページIDからslugを取得
    $page = get_page($id);
    return $page->post_name;
}

add_action( 'admin_notices','wwyp_slug_check_message' );

function wwyp_category_check_message() {
    // 投稿(post_type='post')のとき カテゴリー が入ってないor未分類カテゴリーが指定されているときにメッセージを出す
    global $pagenow;
    global $post;
    
    $category1_post = get_option('wwyp_category1_post');
    
    if ($category1_post != '1') {
        return;
    }
    
    $categoryRequireMessage ='カテゴリーが未分類です。指定してください';
    $categoryMibunruiExistMessage ='カテゴリー 未分類 にチェックが入っています。チェックを外してください';
    $messageErrorTemplate = '<div class="message error"><p>%s</p></div>';
    
    if ($pagenow == 'post.php'){
        if ($post->post_type == 'post') {
            // 投稿画面で投稿のとき
            $categories = get_the_category( $post->ID );
            $mibunruiExistFlag = false;
            foreach($categories as $category){
                if ($category->cat_ID == 1) {
                    $mibunruiExistFlag = true;
                }
            }
            if ($mibunruiExistFlag == true) {
                if (count($categories) == 1) {
                    // カテゴリーの指定がない
                    echo sprintf($messageErrorTemplate, $categoryRequireMessage);
                } else {
                    // カテゴリーの指定はあるけど、未分類にチェックが入ってる
                    echo sprintf($messageErrorTemplate, $categoryMibunruiExistMessage);
                }
            }
        }
    }
}
add_action( 'admin_notices','wwyp_category_check_message' );

function wwyp_more_check_message() {
    // more が入ってないときにメッセージを出す
    global $pagenow;
    global $post;
    
    $more_post = get_option('wwyp_more_post');
    $more_page = get_option('wwyp_more_page');
    
    $moreRequireMessage ='more がありません!!!!!';
    $messageErrorTemplate = '<div class="message error"><p>%s</p></div>';
    
    if ($pagenow == 'post.php'){
        if ($post->post_type == 'post') {
            if ($more_post != '1') {
                return;
            }
        } elseif ($post->post_type == 'page') {
            if ($more_page != '1'){
                return;
            }
        } else {
            return;
        }


        if (strpos($post->post_content_filtered, '&lt;!--more--&gt;') === false) {
            // more がない
            echo sprintf($messageErrorTemplate, $moreRequireMessage);
        }
    }
}
add_action( 'admin_notices','wwyp_more_check_message' );

function wwyp_publish_confirm_admin_print_scripts() {
    global $pagenow;
    global $post;
    
    $wwyp_publish_post = get_option('wwyp_publish_post');
    $wwyp_publish_page = get_option('wwyp_publish_page');
    if (($pagenow == 'post.php') OR ($pagenow == 'post-new.php')){
        if ($post->post_type == 'post') {
            if ($wwyp_publish_post != '1') {
                return;
            }
        } elseif ($post->post_type == 'page') {
            if ($wwyp_publish_page != '1'){
                return;
            }
        } else {
            return;
        }
    }
    $wwyp_confirm_q = get_option('wwyp_confirm_q');
    $wwyp_confirm_a = get_option('wwyp_confirm_a');

    echo <<< EOM
<script type="text/javascript">
<!--
window.onload = function() {
    var id = document.getElementById('publish');
    if (id.value.indexOf("公開", 0) != -1) {
        id.onclick = publish_confirm;
    }
}

function publish_confirm() {
    answer = window.prompt("{$wwyp_confirm_q}", "");
    if (answer == '{$wwyp_confirm_a}') {
        return true;
    } else {
        var elements = document.getElementsByTagName('span');
        for (var i = 0; i < elements.length; i++) {
            var element = elements[i];
            if (element.className.indexOf("spinner", 0) != -1) {
                element.classList.remove('spinner');
            }
        }
        document.getElementById('publish').classList.remove('button-primary-disabled');
        document.getElementById('save-post').classList.remove('button-disabled');

            return false;
    }
}
// -->
</script>
EOM;
}

// 公開する前にアラートを表示する
add_action('admin_print_scripts', 'wwyp_publish_confirm_admin_print_scripts');

よろしければダウンロードして試してみてください。このblogを書きながら作ったものなのでテストが不十分です!!もしお使いになる場合は自己責任の範囲でお願いします。なにか不具合があったりしましたらご意見いただけたら幸いですm(_ _)m

今までfunctions.phpで機能を拡張してきたものですが、プラグインにすることで別のサイトを作るときに簡単に必要な機能を入れられるようになると思います。また、「サイトの拡張性を飛躍的に高める WordPressプラグイン開発のバイブル」この本が詳しくてとても役立ちました。

とりあえず自分的にはできたなーと思いますがやはり急いで作ったものでClass化や国際化まで間に合いませんでした(^_^;。このプラグインができたのでここから少しずつそのへんに手を付けていきたいなぁと思います。

[スポンサードリンク]
兎本美佳

ブログを見た人がそのままできたらいいなと思って、できるだけ丁寧に書いています。blogに書いたようなネタの有償対応のご相談は「ゆうそうと」へいただければと思います(^^)/
無償での対応をご希望の場合は、コメントをいただけましたら可能な場合はコメントを返させていただきます。

ゆうそうとITブログの更新通知が受け取れます!
スポンサー広告

WordPress プラグイン
スポンサーリンク
ゆうそうとITブログの更新通知が受け取れます!
ゆうそうとITブログ

コメント