プラグインなしで「ToDo」機能を追加する方法

Cocoonカスタマイズ集
この記事は約7分で読めます。
記事内に広告が含まれています。

はじめに

プラグイン「WP Dashboard Notes」などを使わずに、ダッシュボードに「ToDo」機能を追加します。

直感的で使いやすいUIにより、作成済みのToDoの編集や削除、追加もスムーズに操作可能です。

この記事では、この方法について説明します。

完成イメージ

実装手順

以下のコードをfunctons.phpに追加します。

// ダッシュボードウィジェットを追加
add_action('wp_dashboard_setup', function () {
  wp_add_dashboard_widget(
    'todo',
    'ToDoリスト',
    'render_todo'
  );
});


/**
 * ダッシュボードにウィジェットを出力
 *
 * @return void
 */
if (!function_exists('render_todo')):
function render_todo() {
  // ToDoリストを取得
  $todo_items = get_option('my_todo_items', []);

  ?>
  <div class="todo">
    <form method="post" class="todo__form">
      <?php wp_nonce_field('todo_action', 'todo_nonce'); ?>

      <ul class="todo__list">
        <?php foreach ($todo_items as $index => $item): ?>
          <?php
          if (is_array($item)) {
            $text = $item['text'] ?? '';
            $completed = !empty($item['completed']);
          } else {
            $text = $item;
            $completed = false;
          }
          ?>

          <li class="todo__item">
            <input type="checkbox" name="todo_completed[<?php echo esc_attr($index); ?>]" value="1" class="todo__checkbox" <?php checked($completed, true); ?>>
            <input type="text" name="todo_items[<?php echo esc_attr($index); ?>]" value="<?php echo esc_attr($text); ?>" class="todo__input">
            <button type="submit" name="todo_delete" value="<?php echo esc_attr($index); ?>" class="todo__delete button" onclick="return confirm('このToDoを削除しますか?');">削除</button>
          </li>

        <?php endforeach; ?>

        <li class="todo__item">
          <input type="checkbox" class="todo__checkbox" disabled>
          <input type="text" name="todo_items[]" value="" placeholder="新しいToDoを追加" class="todo__input">
          <button type="button" class="todo__delete button" disabled>削除</button>
        </li>
      </ul>

      <button type="submit" name="todo_save" value="1" class="button button-primary todo__save" onclick="return confirm('変更内容を保存しますか?');">保存</button>
    </form>
  </div>
  <?php
}
endif;


// 管理画面からの設定データ更新
add_action('admin_init', function () {
  if (!isset($_POST['todo_items'])) {
    return;
  }

  // nonceチェック
  check_admin_referer('todo_action', 'todo_nonce');

  // 権限チェック
  if (!current_user_can('edit_posts')) {
    wp_die('この操作を行う権限がありません。');
  }

  $new_items = [];

  if (is_array($_POST['todo_items'])) {
    foreach ($_POST['todo_items'] as $index => $item) {
      $item = sanitize_text_field($item);

      // 削除対象を除外
      if (isset($_POST['todo_delete']) && (string) $_POST['todo_delete'] === (string) $index) {
        continue;
      }

      // 空のToDoを除外
      if ($item === '') {
        continue;
      }

      // 完了状態を取得
      $completed = isset($_POST['todo_completed'][$index]);

      $new_items[] = [
        'text' => $item,
        'completed' => $completed,
      ];
    }
  }

  // ToDoリストを更新
  update_option('my_todo_items', $new_items);

  wp_safe_redirect(add_query_arg('todo_saved', '1', admin_url('index.php')));
  exit;
});


// 管理画面用JS・CSSを追加
add_action('admin_enqueue_scripts', function ($hook_suffix) {
  if ($hook_suffix !== 'index.php') {
    return;
  }

  ob_start();
  ?>
  .todo__item {
    align-items: center;
    display: flex;
    gap: 6px;
  }

  .todo__input {
    flex: 1;
    min-width: 0;
  }

  .todo__delete {
    flex: 0 0 auto;
  }
  <?php
  wp_add_inline_style('wp-admin', ob_get_clean());
});


// 通知メッセージを出力
add_action('admin_notices', function () {
  $screen = get_current_screen();

  if ($screen && $screen->id === 'dashboard' && isset($_GET['todo_saved']) && $_GET['todo_saved'] === '1') {
    echo '<div class="notice notice-success is-dismissible"><p>ToDoリストを更新しました。</p></div>';
  }
});

さいごに

今回紹介した方法を使えば、ダッシュボードに軽量でシンプルなToDoリスト機能を追加できます。
日々の運用タスクやメモの管理など、ちょっとした情報の整理にとても便利です。

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