<?php
/*
Plugin Name: One Click WP Setup
Description: 一括で指定プラグインをインストール&有効化し、基本設定(年表示、ACFフィールド、簡易つぶやきCPT、ショートコード)を行います。テスト環境で必ず確認してください。
Version: 1.0
Author: ChatGPT
*/
if (!defined(‘ABSPATH’)) exit;
class OneClickWPSetup {
private $slug_list = array(
‘list-category-posts’, // List Category Posts
‘relevanssi’, // Relevanssi
‘advanced-custom-fields’, // Advanced Custom Fields (ACF)
‘microblog-poster’ // Microblog Poster (may not exist in WP repo; adjust if needed)
);
public function __construct() {
add_action('admin_menu', array($this, 'admin_menu'));
add_action('admin_post_ocwps_run', array($this, 'handle_run'));
add_action('init', array($this, 'register_microblog_cpt'));
add_shortcode('microblog', array($this, 'shortcode_microblog'));
add_shortcode('today_message', array($this, 'shortcode_today_message'));
}
public function admin_menu() {
add_menu_page('WP セットアップ', 'WP セットアップ', 'manage_options', 'ocwps', array($this, 'admin_page'), 'dashicons-admin-generic', 55);
}
public function admin_page() {
if (!current_user_can('manage_options')) return;
?>
<div class="wrap">
<h1>One Click WP Setup</h1>
<p>選択したプラグインを WP.org からインストール → 有効化し、基本設定を行います。</p>
<form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>">
<?php wp_nonce_field('ocwps_run_nonce'); ?>
<input type="hidden" name="action" value="ocwps_run">
<h2>インストール対象プラグイン(チェックで実行)</h2>
<?php foreach ($this->slug_list as $slug): ?>
<label style="display:block;margin:6px 0;">
<input type="checkbox" name="plugins[]" value="<?php echo esc_attr($slug); ?>" checked>
<?php echo esc_html($slug); ?>
</label>
<?php endforeach; ?>
<p><strong>注意:</strong>スラッグが WP.org にないプラグインは失敗します。その際は手動でインストールしてください。</p>
<p><button class="button button-primary" type="submit">一括セットアップ実行</button></p>
</form>
<hr>
<h2>今日の一言(管理)</h2>
<form method="post" action="<?php echo admin_url('options.php'); ?>">
<?php settings_fields('ocwps_opts'); do_settings_sections('ocwps_opts'); ?>
<table class="form-table">
<tr valign="top">
<th scope="row">今日の一言</th>
<td><input type="text" name="ocwps_today_message" value="<?php echo esc_attr(get_option('ocwps_today_message','')); ?>" style="width:50%"></td>
</tr>
</table>
<?php submit_button('保存'); ?>
</form>
<p>ショートコード:</p>
<ul>
<li>[today_message] — 今日の一言を表示</li>
<li>[microblog count="5"] — つぶやき(microblog 投稿)を表示</li>
</ul>
</div>
<?php
}
public function handle_run() {
if (!current_user_can('manage_options')) wp_die('権限が必要です');
check_admin_referer('ocwps_run_nonce');
if (empty($_POST['plugins']) || !is_array($_POST['plugins'])) {
wp_redirect(add_query_arg('ocwps_result','no_plugins', wp_get_referer()));
exit;
}
// load required files for plugin install
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
require_once ABSPATH . 'wp-admin/includes/file.php';
require_once ABSPATH . 'wp-admin/includes/misc.php';
require_once ABSPATH . 'wp-admin/includes/plugin.php';
$upgrader = new Plugin_Upgrader(new Automatic_Upgrader_Skin());
$results = array();
foreach ($_POST['plugins'] as $slug) {
$slug = sanitize_text_field($slug);
// check if installed
$installed_plugins = get_plugins();
$found = false;
foreach ($installed_plugins as $path => $plugin_data) {
if (strpos($path, $slug) !== false || strpos($plugin_data['TextDomain'], $slug) !== false) {
$found = true;
// activate
$activate = activate_plugin($path);
$results[$slug] = is_wp_error($activate) ? $activate->get_error_message() : 'activated';
break;
}
}
if ($found) continue;
// try to find plugin in WP.org
$api = plugins_api('plugin_information', array('slug' => $slug, 'fields' => array('sections' => false)));
if (is_wp_error($api)) {
// not found on WP.org
$results[$slug] = 'not_found_in_wporg';
continue;
}
// install
$package = $api->download_link;
$installed = $upgrader->install($package);
if ($installed === true || $upgrader->result) {
// try to activate by scanning installed plugins
$installed_plugins = get_plugins();
foreach ($installed_plugins as $path => $plugin_data) {
if (strpos($path, $slug) !== false) {
$activate = activate_plugin($path);
$results[$slug] = is_wp_error($activate) ? $activate->get_error_message() : 'installed_and_activated';
break;
}
}
if (!isset($results[$slug])) $results[$slug] = 'installed_but_activation_failed';
} else {
$results[$slug] = 'install_failed';
}
}
// basic settings:
// 1) 日付表示を年のみ (Y)
update_option('date_format', 'Y');
// 2) If Relevanssi active, try to build index (best-effort)
if (function_exists('relevanssi_build_index')) {
// older/newer versions may have different function names; try action
try {
do_action('relevanssi_build_index');
$results['relevanssi_index'] = 'triggered';
} catch (Exception $e) {
$results['relevanssi_index'] = 'failed_to_trigger';
}
}
// 3) If ACF active, register a local field group for "今日の一言"
if (function_exists('acf_add_local_field_group')) {
acf_add_local_field_group(array(
'key' => 'group_ocwps_today',
'title' => '今日の一言',
'fields' => array(
array(
'key' => 'field_ocwps_today_text',
'label' => '今日の一言',
'name' => 'ocwps_today_text',
'type' => 'text',
'instructions' => 'フロントで表示する短いメッセージ',
'required' => 0,
),
),
'location' => array(
array(
array(
'param' => 'options_page',
'operator' => '==',
'value' => 'acf-options',
),
),
),
));
$results['acf_field'] = 'registered_local_field_group';
} else {
$results['acf_field'] = 'acf_not_active';
}
// 4) Create an option for today message fallback (if not using ACF)
if (!get_option('ocwps_today_message')) update_option('ocwps_today_message', '');
// redirect back with results (serialize)
$url = add_query_arg('ocwps_result', rawurlencode(json_encode($results)), wp_get_referer());
wp_redirect($url);
exit;
}
// simple custom post type for micro-posts (つぶやき)
public function register_microblog_cpt() {
$labels = array(
'name' => 'つぶやき',
'singular_name' => 'つぶやき',
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => false,
'supports' => array('title','editor','author'),
'menu_position' => 20,
'menu_icon' => 'dashicons-format-chat',
);
register_post_type('microblog', $args);
}
public function shortcode_microblog($atts) {
$atts = shortcode_atts(array('count' => 5), $atts, 'microblog');
$q = new WP_Query(array('post_type' => 'microblog', 'posts_per_page' => intval($atts['count'])));
$out = '<div class="ocwps-microblog">';
if ($q->have_posts()) {
$out .= '<ul>';
while ($q->have_posts()) {
$q->the_post();
$out .= '<li><strong>' . get_the_title() . '</strong><div>' . get_the_excerpt() . '</div><small>' . get_the_date() . '</small></li>';
}
$out .= '</ul>';
} else {
$out .= '<p>つぶやきがありません。</p>';
}
wp_reset_postdata();
$out .= '</div>';
return $out;
}
public function shortcode_today_message() {
// Prefer ACF field if exists, else fallback to option
if (function_exists('get_field')) {
$msg = get_field('ocwps_today_text', 'option');
if ($msg) return esc_html($msg);
}
$msg = get_option('ocwps_today_message','');
return esc_html($msg);
}
}
new OneClickWPSetup();
// register the options for today’s message (so the settings form works)
add_action(‘admin_init’, function(){
register_setting(‘ocwps_opts’,’ocwps_today_message’);
});