=== Shed Menu ===
Contributors: teamstaccato
Tags: menu, navigation, conditional, role, visibility
Requires at least: 6.0
Tested up to: 6.9
Requires PHP: 8.1
Stable tag: 0.1.5
License: GPL-2.0-or-later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Show or hide WordPress menu items based on login status, user role, or scheduled date range. Adds conditional visibility to your navigation.

== Description ==

Shed Menu adds visibility conditions to WordPress navigation menu items. You can show or hide each item based on three conditions:

* Login status (logged in / logged out / everyone)
* Date range (start datetime, end datetime)
* User roles (administrator, editor, author, contributor, subscriber, or custom roles)

All conditions are optional and combined with AND logic. This plugin reads the current user's role information via `wp_get_current_user()` to evaluate role-based conditions.

= Three ways to use =

1. **Standard menus** — Open Appearance → Menus, expand any item, and set the conditions inline.
2. **Hand-coded themes** — Use the helper function `shedmenu_visible()` in your `header.php` or other template files.
3. **Block editor** — Wrap any blocks in the "Shed Menu — Conditional" block to show/hide them based on the same conditions.

= Helper function example =

`<?php if ( shedmenu_visible( [ 'login' => 'in' ] ) ) : ?>
    <li><a href="/mypage/">My Page</a></li>
<?php endif; ?>`

= Shortcode example =

`[shedmenu_visible login="in" start="2026-04-01" end="2026-04-30" roles="administrator"]
This content is only visible to administrators between April 1 and April 30.
[/shedmenu_visible]`

= 日本語の説明 =

WordPress 標準ナビゲーションメニューに、メニュー項目単位の表示条件を追加します。

* ログイン状態（ログイン中 / ログアウト中 / 全員）
* 表示期間（開始日時・終了日時）
* ユーザーロール（管理者 / 編集者 / 投稿者 等）

全ての条件は任意で、AND 条件で組み合わされます。

外観 → メニュー画面で各項目に条件を設定できます。テーマで `wp_nav_menu()` を使わず HTML 直書きしている場合は `shedmenu_visible()` ヘルパー関数を使ってください。Gutenberg では「Shed Menu — Conditional」ブロックで任意のブロック群を条件表示にできます。

== Installation ==

1. Upload the `shed-menu` folder to the `/wp-content/plugins/` directory, or install via the Plugins screen in WordPress.
2. Activate the plugin through the Plugins screen.
3. Go to Appearance → Menus, expand any menu item, and configure visibility conditions.

== Frequently Asked Questions ==

= Does this work with caching plugins? =

Login-based visibility is evaluated per request. If you use a page caching plugin, make sure it serves separate cached pages for logged-in vs logged-out users. Most caching plugins support this by default.

= Does this conflict with other menu plugins? =

Shed Menu uses the standard `wp_nav_menu_objects` filter and does not override menu rendering. It works alongside most menu plugins.

= Why doesn't the date condition work in the Navigation block (block theme)? =

The Navigation block uses its own internal item structure that does not expose per-item post meta in a stable way. Use the "Shed Menu — Conditional" block to wrap navigation links instead.

= What happens to my settings when I uninstall? =

Uninstalling removes all visibility settings stored on menu items and plugin options. Deactivating without uninstalling preserves all settings.

= Can I use custom roles? =

Yes. The Roles field in the menu item editor lists all roles registered in your WordPress installation, including custom roles added by other plugins.

== Third-Party Services ==

This plugin does not connect to any external services. All processing happens on your own server.

== Screenshots ==

1. Visibility fields added to each menu item in Appearance → Menus.
2. The Conditional block in the Gutenberg editor with sidebar settings.
3. Plugin settings screen (Settings → Shed Menu).

== Changelog ==

= 0.1.5 =
* [fix] Block namespace renamed from `shed/conditional` to `shed-menu/conditional` for WordPress.org compliance.
* [fix] Helper function renamed from `shed_menu_visible()` to `shedmenu_visible()` for prefix consistency.
* [fix] Shortcode renamed from `[shed_menu_visible]` to `[shedmenu_visible]` for prefix consistency.
* [fix] readme.txt License field updated to SPDX identifier GPL-2.0-or-later.

= 0.1.4 =
* [perf] Child-item cascade removal now uses O(1) hash lookup instead of O(n) in_array; added circular-reference guard.
* [fix] Added update_meta_cache() call in filter_menu_items() to prevent N+1 meta queries on large menus.
* [fix] normalize_datetime() now validates month/day with checkdate() to reject invalid dates like 2026-02-30.
* [fix] array_filter() applied to roles meta in is_item_visible() to strip empty strings stored in serialized arrays.
* [fix] Added Domain Path header; renamed wp_localize_script object from wsmData to shedmenuData.
* [fix] Removed non-standard Description-ja header field.

= 0.1.2 =
* [fix] Constant `Shedmenu_PATH` renamed to `SHEDMENU_PATH` to follow WordPress naming conventions (uppercase).
* [fix] Replaced `phpcs:disable/enable` blocks with per-line `phpcs:ignore` in menu item save handler. Added English comment explaining core nonce pre-verification.

= 0.1.1 =
* Changed: All function, class, constant, hook, and option prefixes renamed from wsm_/WSM_ to shedmenu_/SHEDMENU_/Shedmenu_.

= 0.1.0 =
* Initial release.
* Login status visibility (in / out / either).
* Scheduled date range visibility (start / end datetime).
* Role-based visibility (all registered roles supported).
* Helper function shed_menu_visible() for hand-coded themes.
* Shortcode [shed_menu_visible] for widgets, pages, and classic editor.
* Conditional block (shed/conditional) for the block editor.
* Automatic cascade: hiding a parent item also hides all its children.

== Upgrade Notice ==

= 0.1.5 =
Block renamed to `shed-menu/conditional`, helper function to `shedmenu_visible()`, shortcode to `[shedmenu_visible]`. First public release — no existing content to migrate.

= 0.1.4 =
Performance and reliability improvements. Upgrade recommended.

= 0.1.0 =
Initial release.
