Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

Feature: PushMD - Media upload & upsert support for push-only staging workflow

オープン
#102 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
5/5
見積もり時間
1週間以上
初心者へのやさしさ
35/100
issue の種類
機能追加
明瞭さ
おおむね明確
活発さ
静か
技術スタック
git, php, wordpress
領域
backend, content

調査の方向性

まず push 同期パスと、言及されている export_media_content() の動作から始め、次に WordPress のアップロードがどのように処理されるかを追跡します。提案されている media/ ワークフロー、検証ルール、URL の書き換え、upsert の動作、pull のクリーンアップを受け入れ条件として使用してください。この issue では実装ファイルやテストが指定されていないため、プロジェクトの調査が必要です。

索引モデルが issue の本文から書いたものです。

説明

Summary / Context

Currently, Push MD allows Markdown-first teams and AI coding agents to clone, edit, and push WordPress posts, pages, and templates. However, there is no support for managing post image assets through Git. When an author or agent creates a new post locally that includes diagrams, screenshots, quote cards, or a featured image, they must manually upload those images via WP-Admin and copy the resulting URLs back into Markdown before pushing.

I propose adding native Git media support to Push MD using a push-only staging directory (media/). Authors can drop image binaries into media/, reference them using relative paths in Markdown or Gutenberg blocks, and push via Git. Push MD handles fail-closed image validation, uploads/upserts the files into the WordPress Media Library, rewrites all inline content & block references to absolute WordPress attachment URLs, and cleans up the staging files on git pull to keep local checkouts lightweight.

Why Media Upload Support is Useful
  1. Complete Offline & Agent Workflows: Coding agents and local Markdown editors (Obsidian, VS Code, Cursor) can create complete posts - text and images - in a single Git commit without requiring manual WP-Admin file uploads.
  2. Lean Local Repositories (Push-Only Staging): By operating media/ as a push-only staging area, binary image blobs do not accumulate in Git history or bloat local checkouts over time.
  3. In-Place Image Versioning: Updating an existing image via Git overwrites the file on disk and regenerates WordPress image metadata without creating duplicate attachment records (image-1.png, image-2.png).
  4. Automatic Attachment Metadata: Alt text, image titles, and <figcaption> captions written in Markdown or HTML automatically populate WordPress attachment metadata.
Proposed Architecture & Workflow
1. The media/ Staging Directory
  • A media/ directory is present in the repository tree (maintained via a media/.gitkeep placeholder).
  • Authors place image files directly under media/ (e.g. media/architecture-diagram.png).
  • In post Markdown, images are referenced using standard relative syntax:
---
title: "New Product Launch"
featured_image: "../media/hero.webp"
---
![Architecture Diagram](../media/architecture-diagram.png "System Architecture")
2. Push-Time Ingestion & URL Rewriting

When a commit is pushed to trunk:

  1. Upfront Payload Ingestion: Push MD detects files in media/, validates them, and uploads them to the WordPress Uploads folder, creating or updating attachment records.
  2. Contextual Metadata Assignment: Alt text (![Alt Text](...)), titles ("Title Text"), and figure captions (<figcaption>...</figcaption>) in post markup populate _wp_attachment_image_alt, post_title, and post_excerpt on the corresponding attachment.
  3. Multi-Format Content Rewriting: Relative media/ paths are rewritten to absolute WordPress upload URLs across:
    • Markdown image syntax: ![alt](url "title")
    • HTML attributes: src, href, poster, srcset across <img>, <source>, <figure>, and <a> tags
    • Gutenberg Block comment JSON metadata: <!-- wp:image {"id":0,"url":"../media/chart.png"} --> (updates id, mediaId, and url fields)
    • Front matter featured_image (assigns post thumbnail attachment ID)
  4. Filename-Based Re-Linking: If a Markdown post is pushed in a later commit referencing media/existing-chart.png (where the binary is no longer in the commit tree), Push MD resolves existing-chart.png against existing Media Library attachments by filename and links it cleanly.
3. Automatic Working Tree Cleanup (git pull)
  • Binary images are ingested into the WordPress Media Library on push.
  • To prevent binary bloat, Push MD does not export the Media Library into Git on clone/fetch (export_media_content() returns an empty array).
  • On the next git pull, repository synchronization notices the pushed image files are no longer exported by WordPress and creates a sync commit that deletes the staging image files from the Git tree while preserving media/.gitkeep.
  • Git fast-forwards the local working directory, automatically deleting the local media/image.png file while keeping the media/ folder intact.
4. In-Place Upserts (Image Versioning)
  • Standard WordPress wp_upload_bits() renames same-named uploads to image-1.png, image-2.png, creating duplicate attachment records.
  • Push MD checks if an attachment with the exact filename already exists. If found:
    • Overwrites the file on disk (get_attached_file()) in-place.
    • Regenerates image metadata (dimensions, thumbnails) via wp_generate_attachment_metadata().
    • Returns the existing attachment ID and URL, preserving existing post references.
Security, Validation & Safety Model

Push MD operates on a strict fail-closed safety model:

  1. Extension Whitelist: Only .png, .jpg, .jpeg, .gif, and .webp extensions are accepted.
  2. Binary MIME Type Detection: Validates raw binary headers using finfo_buffer with fallback magic-number inspection (\x89PNG\r\n\x1a\n, \xFF\xD8\xFF, GIF87a/GIF89a, RIFF...WEBP) to prevent extension spoofing or execution of non-image payloads.
  3. Path Traversal Protection: Rejects paths containing .. or attempted directory escapes outside media/.
  4. WordPress Capability Checks: Media upload processing runs within the authenticated user session, respecting WordPress editorial capabilities.
  5. Non-Image Filtering: Non-image placeholder files in media/ (such as .gitkeep) are skipped during ingestion without raising validation errors.
Why not WordPress media REST API?

I implemented this using REST API initially, but that requires additional maintenance, authentication and integration. Doing it via PushMD is much cleaner approach.

主要言語
PHP
スター
22
フォーク
5
PR マージ指標
30日以内にマージされた PR はありません

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

Automattic/php-toolkit のほかの issue

Automattic/php-toolkit の issue をすべて見る

似ている issue

PHP の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。