Skip to content

Instantly share code, notes, and snippets.

@isuke01
Last active October 8, 2025 11:33
Show Gist options
  • Select an option

  • Save isuke01/1e8fe9cc15f31f526a3847139cc78719 to your computer and use it in GitHub Desktop.

Select an option

Save isuke01/1e8fe9cc15f31f526a3847139cc78719 to your computer and use it in GitHub Desktop.

Revisions

  1. isuke01 revised this gist Oct 8, 2025. No changes.
  2. isuke01 created this gist Oct 8, 2025.
    93 changes: 93 additions & 0 deletions wp-require.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,93 @@
    #!/bin/bash

    # wp-require — quickly require WP plugins/themes via wpackagist
    # Usage:
    # wp-require https://wordpress.org/plugins/onesignal-free-web-push-notifications/
    # wp-require https://pl.wordpress.org/plugins/onesignal-free-web-push-notifications/ "^0.4"
    # wp-require https://wordpress.org/themes/twentytwelve/
    # wp-require onesignal-free-web-push-notifications
    # wp-require twentytwelve --theme
    # wp-require my-cool-plugin "^1.2" --plugin

    set -euo pipefail

    usage() {
    echo "Usage: wp-require <wordpress.org URL or slug> [version-constraint] [--plugin|--theme]" >&2
    exit 1
    }

    command -v composer >/dev/null 2>&1 || { echo "Error: composer not found in PATH." >&2; exit 127; }

    [[ $# -ge 1 ]] || usage

    arg1="$1"
    version=""
    type=""
    shift

    # Parse optional args (version or flags)
    for arg in "$@"; do
    case "$arg" in
    --plugin) type="wpackagist-plugin" ;;
    --theme) type="wpackagist-theme" ;;
    ^*|~*|[0-9]*)
    version="$arg"
    ;;
    esac
    done

    # Trim trailing slashes
    url="${arg1%/}"

    slug=""

    # Detect from URL or treat as slug
    if [[ "$url" =~ wordpress\.org ]]; then
    # URL mode
    if [[ "$url" =~ /plugins/ ]]; then
    type="${type:-wpackagist-plugin}"
    slug="$(printf '%s' "$url" | sed -E 's#.*?/plugins/([^/]+).*#\1#')"
    elif [[ "$url" =~ /themes/ ]]; then
    type="${type:-wpackagist-theme}"
    slug="$(printf '%s' "$url" | sed -E 's#.*?/themes/([^/]+).*#\1#')"
    else
    echo "Error: Could not detect /plugins/ or /themes/ in URL." >&2
    exit 2
    fi
    else
    # Slug mode
    slug="$url"
    if [[ -z "$type" ]]; then
    # Default to plugin if not specified
    type="wpackagist-plugin"
    fi
    fi

    # Validate slug
    if [[ -z "$slug" || ! "$slug" =~ ^[a-z0-9-]+$ ]]; then
    echo "Error: Invalid slug: '$slug'" >&2
    exit 3
    fi

    package="$type/$slug"

    if [[ -n "$version" ]]; then
    echo "→ composer require $package \"$version\""
    exec composer require "$package" "$version"
    else
    echo "→ composer require $package"
    exec composer require "$package"
    fi

    # 1. Add script to bin globally:
    # Create file and paste the content.
    # sudo mv wp-require.sh /usr/local/bin/wp-require
    # sudo chmod +x /usr/local/bin/wp-require

    # 2. Second option: Alias in .bashrc or .zshrc
    # BASH:
    # echo 'alias wp-require="bash /usr/local/bin/wp-require"' >> ~/.bashrc
    # source ~/.bashrc
    # ZSH:
    # echo 'alias wp-require="bash /usr/local/bin/wp-require"' >> ~/.zshrc
    # source ~/.zshrc