'wpcf7_contact_form', 'post_status' => 'publish', 'numberposts' => 50, ) ); $out = array(); foreach ( $posts as $p ) { $out[] = array( 'id' => (int) $p->ID, 'title' => $p->post_title, ); } return $out; } /** * Form pages. * * @param mixed $limit Parameter. */ public static function form_pages( $limit = 5 ) { global $wpdb; $like = '%' . $wpdb->esc_like( '[contact-form-7' ) . '%'; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- setup wizard one-off lookup by shortcode content $rows = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_title FROM {$wpdb->posts} WHERE post_status = 'publish' AND post_type IN ('page','post') AND post_content LIKE %s ORDER BY ID DESC LIMIT %d", $like, (int) $limit ) ); $out = array(); foreach ( (array) $rows as $r ) { $out[] = array( 'title' => $r->post_title ? $r->post_title : '(無題)', 'url' => get_permalink( $r->ID ), ); } return $out; } /** * Cache plugins. */ public static function cache_plugins() { $map = array( 'WP_ROCKET_VERSION' => 'WP Rocket', 'W3TC' => 'W3 Total Cache', 'LSCWP_V' => 'LiteSpeed Cache', 'WPFC_MAIN_PATH' => 'WP Fastest Cache', 'CACHE_ENABLER_VERSION' => 'Cache Enabler', 'WPCACHEHOME' => 'WP Super Cache', ); $found = array(); foreach ( $map as $const => $name ) { if ( defined( $const ) ) { $found[] = $name; } } return $found; } /** * Checks. */ public static function checks() { global $wpdb; $c = array(); $c[] = version_compare( PHP_VERSION, '7.4', '>=' ) ? array( 'ok', 'サーバーの PHP バージョン', 'PHP ' . PHP_VERSION . ' で問題ありません。' ) : array( 'ng', 'サーバーの PHP バージョン', 'PHP ' . PHP_VERSION . ' は古く、動作しません。レンタルサーバーの管理画面で PHP 7.4 以上に変更してください。' ); if ( ! self::cf7_active() ) { $c[] = array( 'ng', 'Contact Form 7', 'Contact Form 7 が有効になっていません。「プラグイン」画面で Contact Form 7 を有効化してから、この画面に戻ってください。' ); } elseif ( version_compare( WPCF7_VERSION, '5.4', '<' ) ) { $c[] = array( 'ng', 'Contact Form 7', 'Contact Form 7 のバージョンが古い(' . WPCF7_VERSION . ')ため動作しません。「プラグイン」画面で更新してください。' ); } else { $c[] = array( 'ok', 'Contact Form 7', 'Contact Form 7 ' . WPCF7_VERSION . ' が見つかりました。' ); $forms = self::cf7_forms(); $c[] = $forms ? array( 'ok', '保護されるフォーム', count( $forms ) . ' 件のフォームが自動的に保護されます(' . implode( '、', array_map( function ( $f ) { return $f['title']; }, array_slice( $forms, 0, 5 ) ) ) . ( count( $forms ) > 5 ? ' ほか' : '' ) . ')。設定は不要です。', ) : array( 'warn', '保護されるフォーム', 'Contact Form 7 のフォームがまだ見つかりません。フォームを作成すると、自動的に保護されます。' ); } $cache = self::cache_plugins(); $c[] = $cache ? array( 'warn', 'ページのキャッシュ機能', implode( '、', $cache ) . ' が見つかりました。問い合わせフォームのあるページを「キャッシュしない」設定にしてください(設定方法は各プラグインの「キャッシュ除外」の項目です)。設定が難しい場合は、次の手順②『保護レベル』(または『設定』タブの『詳しい設定』)でトークン有効時間を長くする方法もあります。' ) : array( 'ok', 'ページのキャッシュ機能', '代表的なキャッシュ系プラグインは見つかりませんでした。(レンタルサーバー側の高速化機能は、ここでは確認できません。)' ); $table = AISFG_Logger::table(); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- setup check for aisfg_log custom table $has = $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table ) ) === $table; $c[] = $has ? array( 'ok', '記録用の保存領域', '準備ができています。' ) : array( 'ng', '記録用の保存領域', '作成できていません。プラグインをいったん停止して、もう一度有効化してください。' ); return $c; } /** * Selftest. */ public static function selftest() { global $wpdb; $r = array(); $base = array( 'min_seconds' => 0, 'token_ttl_hours' => 1, ); $tok = AISFG_Guard::make_token( 0 ); $r[] = array( array() === AISFG_Guard::verify_token( $tok, 0, $base ), '確認情報の発行と照合', 'フォームに付ける確認情報を作り、正しく照合できるか調べました。', ); $r[] = array( in_array( 'TOKEN_INVALID', AISFG_Guard::verify_token( $tok . '0', 0, $base ), true ), '改ざんの検知', '確認情報が書き換えられたときに気づけるか調べました。', ); $r[] = array( in_array( 'TOO_FAST', AISFG_Guard::verify_token( $tok, 0, array( 'min_seconds' => 60, 'token_ttl_hours' => 1, ) ), true ), '「開いてすぐ送信」の検知', 'ページを開いてすぐ送られた送信に気づけるか調べました。', ); $ok = false; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery -- aisfg_log custom table; selftest write $wpdb->insert( AISFG_Logger::table(), array( 'created_at' => gmdate( 'Y-m-d H:i:s' ), 'form_id' => 0, 'decision' => 'test', 'reasons' => 'SELFTEST', 'ip_masked' => '', ), array( '%s', '%d', '%s', '%s', '%s' ) ); if ( $wpdb->insert_id ) { $ok = true; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- aisfg_log custom table; selftest cleanup $wpdb->delete( AISFG_Logger::table(), array( 'id' => (int) $wpdb->insert_id ), array( '%d' ) ); } $r[] = array( $ok, '記録の保存', '検知の記録を保存できるか調べました。' ); return $r; } }