Vimeo Media Sync WP Registry grade A. No security issues foundWP RegistryNo security issues foundOpen the reportA
Sync Wordpress videos with Vimeo
Install
This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/dylanfisher/wp-vimeo-media-sync/archive/refs/heads/main.zipSynchronize WordPress video uploads to Vimeo with resumable (tus) uploads and status polling. This plugin creates Vimeo videos, adds them to a Wordpress folder, and tracks sync metadata on each attachment.
Features
- Resumable Vimeo uploads via the tus protocol.
- Automatic status polling with backoff until processing completes.
- Attachment-level Vimeo metadata tracking.
- Optional privacy override (unlisted/public/private) with automatic retry if Vimeo rejects it.
- Dashboard table of all video attachments with pagination and tools to sync missing Vimeo uploads.
- Optional delete-on-remove to remove Vimeo videos when WP attachments are deleted.
Requirements
- WordPress 6.x
- Vimeo personal access token with scopes:
public,private,create,edit,delete,upload,stats,video files - Reachable WordPress cron (
wp-cron.php) or a real server cron runner.
Installation
- Copy this plugin into
wp-content/plugins/vimeo-media-sync. - Activate it in the WordPress admin.
Configuration
Set the Vimeo access token in wp-config.php or an environment variable:
define( 'VIMEO_MEDIA_SYNC_ACCESS_TOKEN', 'your_token' );
export VIMEO_MEDIA_SYNC_ACCESS_TOKEN=your_token
In the plugin dashboard (Vimeo Sync), choose a default privacy value and the Vimeo folder name to store uploads. If Vimeo does not allow privacy overrides, the plugin retries without the privacy parameter. You can also enable automatic deletion of Vimeo videos when a WordPress attachment is deleted.
Usage
- Upload a video to the Media Library.
- The plugin creates a Vimeo video via tus upload and adds it to the configured Vimeo folder.
- Open the attachment details to see Vimeo status, IDs, and progress.
- Use the “Refresh status” button to manually recheck processing.
- Use the dashboard table (paginated) to review all video attachments and sync missing videos in bulk or per row; the table includes status, progress, and error context.
- If you switch Vimeo accounts, use “Clear Vimeo metadata” in the dashboard to reset attachment sync data before re-uploading.
Attachment Metadata
The plugin stores Vimeo metadata on attachments using post meta keys:
_vimeo_media_sync_video_id_vimeo_media_sync_uri_vimeo_media_sync_link_vimeo_media_sync_status_vimeo_media_sync_synced_at_vimeo_media_sync_error_vimeo_media_sync_upload_source_vimeo_media_sync_upload_link_vimeo_media_sync_upload_offset_vimeo_media_sync_upload_size_vimeo_media_sync_duration_vimeo_media_sync_privacy_vimeo_media_sync_files_vimeo_media_sync_response
Frontend Helpers
Use Vimeo_Media_Sync_Helpers to access synced metadata without API calls.
Available helpers:
get_vimeo_meta( $attachment )get_vimeo_video_id( $attachment )get_vimeo_uri( $attachment )get_vimeo_link( $attachment )get_vimeo_embed_html( $attachment, $args = [] )get_vimeo_embed_url( $attachment, $args = [] )get_vimeo_autoplay_embed_url( $attachment )get_vimeo_direct_files( $attachment )get_vimeo_hls_url( $attachment )get_vimeo_status_label( $attachment )is_vimeo_ready( $attachment )get_vimeo_error( $attachment )
Examples:
$embed = Vimeo_Media_Sync_Helpers::get_vimeo_embed_html( $attachment_id );
$files = Vimeo_Media_Sync_Helpers::get_vimeo_direct_files( $attachment_id );
Debugging
Set WP_DEBUG to true to log Vimeo sync progress and API calls to the PHP error log.
Upload pacing
Large videos are sent to Vimeo in 5 MB resumable (tus) chunks. Each run keeps sending chunks until it approaches its time budget, then schedules itself to resume shortly after, so upload speed is bounded by the server's connection and cron frequency rather than by a fixed chunk count.
Two filters tune this:
// Seconds one request may spend sending chunks. Defaults to 60% of
// max_execution_time, capped at 120. Unlimited execution time uses the cap.
add_filter( 'vimeo_media_sync_upload_time_budget', function( $seconds ) {
return 90;
} );
// Seconds before resuming an upload that still has bytes to send. Defaults to 30.
add_filter( 'vimeo_media_sync_upload_poll_delay', function( $seconds ) {
return 15;
} );
Only one process uploads a given attachment at a time. Clicking “Refresh status” while a cron run is mid-upload is safe: the second run sees the lock and returns, and the scheduled run continues uninterrupted. If Vimeo ever reports an offset mismatch, the plugin re-syncs to Vimeo's offset and carries on.
Because uploads resume through cron, cron frequency sets the floor on how often a run can happen. A once-per-minute system cron is recommended for large files; see below.
WP-Cron and Basic Auth
Background Vimeo uploads advance through scheduled WordPress cron events. If wp-cron.php is blocked by Basic Auth, .htaccess, a firewall, or a security plugin, uploads may appear to pause until someone clicks “Refresh status”.
For Basic Auth-protected environments, either allow unauthenticated requests to wp-cron.php or run cron events with a real server cron job.
Example .htaccess exception:
<Files "wp-cron.php">
Satisfy Any
Allow from all
Require all granted
</Files>
If you disable WP-Cron in wp-config.php:
define( 'DISABLE_WP_CRON', true );
add a system cron job instead:
* * * * * cd /path/to/wordpress && wp cron event run --due-now --quiet
As an HTTP fallback, include Basic Auth credentials in the cron request:
* * * * * curl -s -u username:password https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Updates (GitHub Releases)
This plugin bundles the Plugin Update Checker library at includes/plugin-update-checker/ and initializes it in vimeo-media-sync.php to deliver updates from GitHub Releases.
Automatic releases:
- A GitHub Actions workflow (
.github/workflows/release-on-version.yml) runs on every push tomain, reads theVersionheader invimeo-media-sync.php, and creates a published release when no tag matches that version yet. - It tags the release as
v1.2.3and auto-generates release notes. - Because the check is against existing tags rather than the previous commit, it does not matter which commit in a push carries the bump.
Release checklist:
- Update the
Versionheader invimeo-media-sync.php. - Merge/push the change to
main. - Push to
main. The workflow will create the tag and GitHub Release automatically (as long as that tag does not already exist).
Notes
- Vimeo ownership is tied to the access token owner. Use a team account token if you need uploads to land in a team account.
- The plugin relies on WordPress cron for status polling and resumable upload progress. Ensure WP-Cron is running and
wp-cron.phpis reachable, or configure a real server cron runner. Cron frequency directly limits upload throughput for large files. - If a resumable Vimeo upload URL expires with a 401 token parsing error, the plugin resets metadata for that attachment and starts one new upload attempt.
- Status polling continues for up to 6 hours after a video is marked ready to capture late-arriving transcode files.
- Delete-on-remove only runs for video attachments that the plugin previously uploaded to Vimeo.
- The plugin does not enqueue any public-facing scripts or styles.
- Vimeo project lookup reuses existing folders by name (case-insensitive) before creating a new one.
- Advanced Settings includes a button to delete all Vimeo videos uploaded by this plugin.
- Advanced Settings includes a button to refresh Vimeo metadata for all synced attachments.
- The Vimeo folder URI is cached to avoid duplicate folder creation; changing the folder name clears the cache.
- Plugin updates can be delivered via GitHub Releases.
Releases
7 releases.
These releases are tags only. The author does not attach a packaged zip, so there are no download counts to report.