diff --git a/.github/workflows/profile-3d.yml b/.github/workflows/profile-3d.yml deleted file mode 100644 index ee7b5be..0000000 --- a/.github/workflows/profile-3d.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: GitHub-Profile-3D-Contrib - -on: - # schedule: # 03:00 JST == 18:00 UTC - # - cron: "0 1 * * *" - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - name: generate-github-profile-3d-contrib - steps: - - uses: actions/checkout@v3 - - uses: yoshi389111/github-profile-3d-contrib@0.7.1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - USERNAME: ${{ github.repository_owner }} - - name: Commit & Push - run: | - git config user.name github-actions - git config user.email github-actions@github.com - git add -A . - git commit -m "generated" - git push diff --git a/.github/workflows/update-github-activity.yml b/.github/workflows/update-github-activity.yml deleted file mode 100644 index e510432..0000000 --- a/.github/workflows/update-github-activity.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: update github activity - -on: - #schedule: - # - cron: '*/30 * * * *' - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - name: Update this repo's README with recent activity - - steps: - - uses: actions/checkout@v4 - - uses: jamesgeorge007/github-activity-readme@master - env: - GITHUB_TOKEN: ${{ secrets.SODERLIND_TOKEN }} - with: - MAX_LINES: 5 diff --git a/.github/workflows/update-plugins.yml b/.github/workflows/update-plugins.yml index c7be77c..2ef883a 100644 --- a/.github/workflows/update-plugins.yml +++ b/.github/workflows/update-plugins.yml @@ -26,8 +26,8 @@ jobs: - name: Update README env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: python update_plugins_readme.py + SODERLIND_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: python build_readme.py - name: Commit & Push run: | diff --git a/README.md b/README.md index d7a5d6d..f41c621 100644 --- a/README.md +++ b/README.md @@ -1,105 +1,370 @@ +
+
|
-
-
+
|
+
+### Virtual Media Folders
+
+ Virtual Media Folders brings folder organization to your WordPress Media Library. Organize your media files into hierarchical folders without moving files on disk. Folders are virtual, so your URLs never change. Also available on WordPress.org. Add-ons available:+ + |
+||
| + +**Add-On Manager** ⭐ 4 + +🚀 Install and manage add-ons that extend Virtual Media Folders. + + | ++ +**AI Ability** ⭐ 1 + +Exposes Virtual Media Folders operations as WordPress Abilities API tools for AI agents and MCP adapters. + + | +||
| + +**AI Organizer** ⭐ 5 + +Uses vision-capable AI models to analyze actual image content and automatically organize your media library into virtual folders. This is add-on functionality requiring an API key from a supported AI service provider, or a local LLM. + + | ++ +**Editorial Workflow** ⭐ 1 + +Role-based folder access, move restrictions, and Inbox workflow for Virtual Media Folders. + + | +||
| + +**Folder Exporter** ⭐ 1 + +Export folders (or subtrees) as ZIP archives with optional CSV manifests. + + | ++ +**Media Cleanup** ⭐ 2 + +Tools to identify and clean up unused or duplicate media files. + + | +||
| + +**Migrate** ⭐ 3 + +Import folders and file assignments from other media folder plugins. Supports FileBird, Enhanced Media Library, Real Media Library,HappyFiles, WP Media Folder, CatFolders and Media Library Assistant. + + | ++ +**Rules Engine** ⭐ 1 + +Rule-based automatic folder assignment for media uploads, based on metadata, file type, or other criteria. + + | +||
| + +### :robot: AI Experiments :robot: + +Some are in early beta, while others are production ready, and all explore how AI can be used in WordPress. + + | +|||
| + +**Admin Coach Tours** ⭐ 3 + +AI-powered interactive tutorials for the WordPress block editor. + + | ++ +**AI Alt Text** ⭐ 1 + +Generate alt text for images using AI. Supports multiple AI providers including OpenAI, Claude, Gemini, Ollama, Azure OpenAI, and Grok. + + | +||
|
+
+**AI Provider for Azure AI Foundry** ⭐ 3
+
+ Connect WordPress 7.0+ to Azure AI Foundry for text generation, image generation, embeddings, and more. Also available on WordPress.org. + + |
+
+
+**AI Provider for exo**
+
+ Connect WordPress to exo, run frontier AI models locally on your device cluster. Also available on WordPress.org. + + |
+||
| + +**AI Router** ⭐ 6 + +Route AI requests to different provider configurations based on capability. Configure multiple instances of the same AI provider (e.g., GPT-4o for text, gpt-image-1 for images) and let AI Router automatically select the right one. + + | ++ +**AI Valve** ⭐ 19 + +Control, meter, and permission-gate AI usage from plugins that connect through the WordPress 7 AI connector. + + | +||
| + +**Content Poll** ⭐ 2 + +A modern, accessible polling block that lets visitors vote on questions about your content. Generate the poll using AI. Supports multiple AI providers including OpenAI, Claude, Gemini, Ollama, Azure OpenAI, and Grok. + + | ++ +**LLMS MD** + +Provides a generated site.tld/llms.md endpoint for WordPress using cached AI-driven site analysis. + + | +||
| + +**PS Design System** + +Extract design systems from WordPress themes using deterministic parsing and AI synthesis. + + | ++ +**Talking Head** ⭐ 3 + +Talking Head lets you write multi-speaker conversations in the WordPress block editor, then generate podcast-quality audio using AI text-to-speech. Each speaker ("head") gets their own voice, and the plugin stitches the segments together into a single audio file with configurable silence gaps. + + | +||
| + +### WordPress Multisite Plugins + + | +|||
| + +**All Sites Cron** ⭐ 7 + +Run wp-cron on all public sites in a multisite network + + | ++ +**Multisite Exporter** ⭐ 6 + +Multisite Exporter is a WordPress plugin that allows you to export content from all subsites in a WordPress multisite installation. The plugin generates WordPress XML (WXR) files by running the WordPress exporter on each subsite in the background using the Action Scheduler library, making it efficient even for large multisite networks. + + | +||
| + +**Network Style Override** + +Network-wide CSS and theme.json overrides for WordPress Multisite. Enforce brand consistency across all subsites from a single admin panel. + + | +
+
+**Super Admin All Sites Menu** ⭐ 34
+
+ For the super admin, replace WP Admin Bar My Sites menu with an All Sites menu. Also available on WordPress.org. + + |
+||
| + +**Super Admin Switch To Admin** ⭐ 7 + +If you are logged in as a super admin, this User Switching companion allows you to switch to a regular admin account on the current site. + + | ++ | ||
| + +### Miscellaneous WordPress Plugins + + | +|||
| + +**Additional Javascript** ⭐ 4 + +Use WordPress Customizer to add JavaScript + + | +
+
+**Cache Tags for Cloudflare** ⭐ 1
+
+ Precise Cloudflare cache purging for WordPress: adds Cache-Tag headers and purges only affected posts, pages, and terms. Also available on WordPress.org. + + |
+||
| + +**Color Me Beautiful** ⭐ 1 + +Personalise the WordPress admin with your own accent colour. + + | ++ +**Custom Document Folder** ⭐ 3 + +Organize document uploads by automatically directing specific file types to custom folders based on their extensions. + | ||
-
|
-
|
||
-
|
-
|
||
-
|
-
|
||
-
|
-
|
||
-
|
-
|
||
-
|
-+ | ||
| ') + md_parts.append("") + if parent_url: + md_parts.append(f'### {parent_title}{stars_display}') + else: + md_parts.append(f'### {parent_title}') + md_parts.append("") + if parent_desc: + md_parts.append(f"{parent_desc}") + md_parts.append("") + md_parts.append(" | ") + md_parts.append("||
| ') + md_parts.append("") + md_parts.append(f'**{child_title}**{stars_display}') + md_parts.append("") + if child_desc: + md_parts.append(f"{child_desc}") + md_parts.append("") + md_parts.append(" | ") + + # Right column (if exists) + if i + 1 < len(children): + child = children[i + 1] + child_info = get_repo_info(child["url"]) + child_title = get_title_from_repo(child["url"], child.get("title")) + child_desc = child.get("description") or child_info["description"] + child_stars = child_info["stars"] + stars_display = f" ⭐ {child_stars}" if child_stars > 0 else "" + + md_parts.append('') + md_parts.append("") + md_parts.append(f'**{child_title}**{stars_display}') + md_parts.append("") + if child_desc: + md_parts.append(f"{child_desc}") + md_parts.append("") + md_parts.append(" | ") + else: + md_parts.append('') + + md_parts.append(" |
| \n \n{cell_html}\n \n | \n\n{cell}\n | ') - else: - row_cells.append('') - rows.append(f' |