{"id":4931,"date":"2024-07-11T13:24:08","date_gmt":"2024-07-11T18:24:08","guid":{"rendered":"https:\/\/wpengine.com\/builders\/?p=4931"},"modified":"2026-03-12T08:23:22","modified_gmt":"2026-03-12T13:23:22","slug":"using-composer-manage-plugins-deploy","status":"publish","type":"post","link":"https:\/\/wpengine.com\/builders\/using-composer-manage-plugins-deploy\/","title":{"rendered":"Using Composer to Manage Plugins and Deploy to WP Engine"},"content":{"rendered":"\n<p>We recently covered how to do <a href=\"https:\/\/wpengine.com\/builders\/branched-deploys-to-wp-engine-with-github-actions\/\">branched deploys to WP Engine with GitHub Actions<\/a>. Today, let\u2019s explore managing plugin dependencies with Composer when deploying to WP Engine.<\/p>\n\n\n\n<div class=\"wp-block-group has-polar-background-color has-background has-global-padding is-layout-constrained wp-container-core-group-is-layout-8d232dfb wp-block-group-is-layout-constrained\" style=\"border-radius:12px;margin-bottom:var(--wp--preset--spacing--30);padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--40)\">\n<p class=\"has-large-font-size\"><strong>Table of contents<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\" style=\"margin-top:0.33rem;margin-right:var(--wp--preset--spacing--30);margin-bottom:0;margin-left:var(--wp--preset--spacing--30)\">\n<li><a href=\"#overview\">Overview of project organization<\/a><\/li>\n\n\n\n<li><a href=\"#gitignore\">Create a .gitignore<\/a><\/li>\n\n\n\n<li><a href=\"#composer-setup\">Set up Composer with WPackagist integration<\/a><\/li>\n\n\n\n<li><a href=\"#acf-with-composer\">How to install ACF PRO with Composer<\/a><\/li>\n\n\n\n<li><a href=\"#wpe-gha-with-composer\">Set up WP Engine GitHub Action for Composer integration<\/a>\n<ul class=\"wp-block-list\">\n<li><a href=\"#configure-rsync-flags\">Configure rsync flags<\/a><\/li>\n\n\n\n<li><a href=\"#post-deploy-script\">Create a post-deploy script<\/a><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"#conclusion\">Conclusion<\/a><\/li>\n<\/ul>\n<\/div>\n\n\n\n<p>It helps if you are familiar with Composer, WPackagist, and Git version control. However,&nbsp;if you are not, here is an excellent resource to get you started: <a href=\"https:\/\/deliciousbrains.com\/storing-wordpress-in-git\/\">Managing your WordPress site with Git and Composer<\/a>. Also, these instructions assume you have an existing WordPress site hosted on WP Engine that you are retroactively putting under version control.<\/p>\n\n\n\n<div class=\"wp-block-group has-border-color has-link-color has-small-font-size wp-elements-c4a970e3283394ce0e10dd7f3ff1ff99 has-global-padding is-layout-constrained wp-container-core-group-is-layout-9b866ece wp-block-group-is-layout-constrained\" style=\"border-color:#007eea;border-width:3px;border-radius:12px;margin-bottom:var(--wp--preset--spacing--30);padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\">\n<div class=\"wp-block-columns is-not-stacked-on-mobile is-layout-flex wp-container-core-columns-is-layout-9c22b1e3 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-container-core-column-is-layout-b2a27621 wp-block-column-is-layout-flow\" style=\"padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;flex-basis:36px\">\n<div class=\"wp-block-outermost-icon-block items-justified-center\" style=\"margin-bottom:0;margin-left:0;margin-right:0;margin-top:0\"><div class=\"icon-container has-icon-color has-lapis-color\" style=\"color:#007eea;width:28px;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"-2 -2 24 24\" aria-hidden=\"true\"><path d=\"M10 2c4.42 0 8 3.58 8 8s-3.58 8-8 8-8-3.58-8-8 3.58-8 8-8zm1.13 9.38l.35-6.46H8.52l.35 6.46h2.26zm-.09 3.36c.24-.23.37-.55.37-.96 0-.42-.12-.74-.36-.97s-.59-.35-1.06-.35-.82.12-1.07.35-.37.55-.37.97c0 .41.13.73.38.96.26.23.61.34 1.06.34s.8-.11 1.05-.34z\"><\/path><\/svg><\/div><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-container-core-column-is-layout-6ed3939d wp-block-column-is-layout-flow\">\n<p>If this is your first time setting up a site deployment on WP Engine &#8211; we recommend utilizing our <a href=\"https:\/\/my.wpengine.com\/profile\/github_action\">step-by-step guide<\/a> in the User Portal (logged in). It steps you through the SSH key pair generation, as well as generating the GitHub Action YML file.<\/p>\n\n\n\n<p>Be sure to review the <a href=\"https:\/\/github.com\/wpengine\/github-action-wpe-site-deploy?tab=readme-ov-file#wp-engine-github-action-for-site-deployment\">WP Engine GitHub Action for Site Deployment documentation<\/a>, and understand how the workflow utilizes rsync to modify files on the final server.<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<p>Here is what we\u2019ll be covering:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Version control (Git) \u2013 you will only need the <code>wp-content\/<\/code> directory under version control. We\u2019ll let WP Engine maintain <a href=\"https:\/\/wpengine.com\/support\/wordpress-updates\/\">WordPress core automatic updates<\/a>.<\/li>\n\n\n\n<li><a href=\"https:\/\/getcomposer.org\/\">Composer<\/a>\u2014You will use Composer and <a href=\"https:\/\/wpackagist.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">WPackagist.org<\/a> to manage WordPress plugins. Note that it will be your responsibility to manage plugin updates with this Composer setup, and utilizing Smart Plugin Manager or WordPress auto-updates is not covered.\n<ul class=\"wp-block-list\">\n<li>Bonus: You will learn to install and manage ACF PRO as a Composer dependency.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"overview\"><strong>Overview of project organization<\/strong><\/h2>\n\n\n\n<p>Below is an example of your final GitHub repository. We will explore these in greater detail.&nbsp;(Also, check out the <a href=\"https:\/\/github.com\/colorful-tones\/wp-engine-composer-deploy-demo\/tree\/main\" target=\"_blank\" rel=\"noreferrer noopener\">demo codebase<\/a> on GitHub to follow along with the proposed structure.)<\/p>\n\n\n\n<ul style=\"margin-bottom:var(--wp--preset--spacing--30)\" class=\"is-style-default wp-block-list\">\n<li><code>.github\/workflows\/[dev|staging|production].yml<\/code>: These represent our GitHub Action configuration files for deploying our codebase to their corresponding environments. Be sure to become familiar with the <a href=\"https:\/\/github.com\/wpengine\/github-action-wpe-site-deploy\">WP Engine GitHub Action for Site Deployment<\/a>, which relies on using rsync to sync the repository files with the targeted server.<\/li>\n\n\n\n<li><code>rsync-config<\/code>: These files configure our WP Engine GitHub Action for Site Deployment. The action relies on running a rsync between the GitHub repository and the targeted environment.\n<ul class=\"wp-block-list\">\n<li><code>excludes.txt<\/code>: Referenced in the <code>.github\/workflows\/[dev|staging|production].yml<\/code> file as the explicit rsync <a href=\"https:\/\/github.com\/colorful-tones\/wp-engine-composer-deploy-demo\/blob\/d66e88034268ffc8888feba67c01e7655cb12abc\/.github\/workflows\/production.yml#L32\"><code>FLAGS<\/code><\/a>. These are any items we want to <em>exclude<\/em> from being deleted each time our GitHub Action runs a rsync.\n<ul class=\"wp-block-list\">\n<li><strong><em>Hint:<\/em><\/strong> these files likely exist on the final WP Engine server and we do not want to remove them every time an rsync is executed in our GitHub Action.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><code>includes.txt<\/code>: Referenced in the <code>.github\/workflows\/[dev|staging|production].yml<\/code> GitHub Action as the explicit rsync <a href=\"https:\/\/github.com\/colorful-tones\/wp-engine-composer-deploy-demo\/blob\/d66e88034268ffc8888feba67c01e7655cb12abc\/.github\/workflows\/production.yml#L32\"><code>FLAGS<\/code><\/a>. These are any items we want to <em>include<\/em> in our GitHub Action rsync.\n<ul class=\"wp-block-list\">\n<li><em><strong>Hint:<\/strong><\/em> these will likely represent the un-ignored items in your project <code>.gitignore<\/code> which we\u2019ll cover below.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><code>bin\/post-deploy.sh<\/code>: This is how you pass any <code>SCRIPTS<\/code> to the GitHub Action to run commands on the final destination server.\n<ul class=\"wp-block-list\">\n<li><strong>Tip:<\/strong> you can run WP-CLI and Composer install commands on the final WP Engine environment.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><code>plugins\/<\/code>: You will rely on Composer and WPackagist to install standard and stable plugins. However, we will also show you how you might handle a custom plugin.\n<ul class=\"wp-block-list\">\n<li><code>plugins\/demo-plugin<\/code>: Represents any custom plugins you may want to version control. You could have as many of these as you like. For example, you could organize your custom functionality as <code>plugins\/foo-plugin<\/code>, <code>plugins\/bar-plugin<\/code>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><code>themes\/<\/code>: Similar to our plugins, you will likely version control a single theme for the final destination.\n<ul class=\"wp-block-list\">\n<li><code>themes\/demo-theme<\/code>: Represents a single, custom theme you would have under version control.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><code>.gitignore<\/code><span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\">: It is critical to tell Git what you&nbsp;<em>want to ignore<\/em>&nbsp;from being under version control,&nbsp;<em>as well as what you do not want to ignore<\/em>&nbsp;(yes, this sounds odd, but trust us).<\/span><\/li>\n\n\n\n<li><code>composer.json<\/code>: Lists your project\u2019s direct dependencies, as well as each dependency\u2019s dependencies, and allows you to pin relative semantic versions for your dependencies.<\/li>\n\n\n\n<li><code>composer.lock<\/code>: Allows you to control when and how to update your dependencies.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-group has-border-color has-royal-border-color has-link-color has-small-font-size wp-elements-a992dfd32c9364d491ad1b391bee3cb3 is-layout-flow wp-container-core-group-is-layout-66da3d5a wp-block-group-is-layout-flow\" style=\"border-style:dashed;border-width:3px;border-radius:8px;margin-bottom:var(--wp--preset--spacing--30);padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\">\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-4a74e3f1 wp-block-group-is-layout-flex\" style=\"margin-bottom:0.3rem\">\n<div class=\"wp-block-outermost-icon-block items-justified-undefined\"><div class=\"icon-container has-icon-color has-royal-color\" style=\"color:#7e5cef;width:34px\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z\"><\/path><\/svg><\/div><\/div>\n\n\n\n<p class=\"has-large-font-size\"><strong>WP Engine Composer Deploy Demo<\/strong><\/p>\n<\/div>\n\n\n\n<p style=\"margin-top:0;margin-bottom:0\">Check out the <a href=\"https:\/\/github.com\/colorful-tones\/wp-engine-composer-deploy-demo\" target=\"_blank\" rel=\"noreferrer noopener\">full demo source code<\/a> for this tutorial and consider following along and forking the repo.<\/p>\n<\/div>\n\n\n\n<p>Start by organizing a copy of your WordPress site\u2019s <code>wp-content\/<\/code> directory to mirror the organization noted above. It is recommended to create this setup on your local computer. You can <a href=\"https:\/\/wpengine.com\/support\/restore\/\">access a full site backup<\/a> from WP Engine\u2019s User Portal.&nbsp; It is okay if there are other directories within your <code>wp-content\/<\/code> directory. You will tell Git what you want to ignore, or not ignore in the next step.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"gitignore\">Create a .gitignore<\/h2>\n\n\n\n<p>Create a <code>.gitignore<\/code> file in your WordPress installation\u2019s <code>wp-content\/<\/code> directory and place the code below:<\/p>\n\n\n\n<div class=\"wp-block-group has-border-color has-polar-border-color has-polar-background-color has-background is-layout-flow wp-container-core-group-is-layout-f285f6d4 wp-block-group-is-layout-flow\" style=\"border-width:1px;border-radius:12px;margin-bottom:var(--wp--preset--spacing--30);padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\">\n<p class=\"has-text-align-center has-small-font-size\" style=\"padding-top:6px;padding-right:var(--wp--preset--spacing--20);padding-bottom:6px;padding-left:var(--wp--preset--spacing--20);line-height:1\"><code>.gitignore<\/code> (<a href=\"https:\/\/github.com\/colorful-tones\/wp-engine-composer-deploy-demo\/blob\/main\/.gitignore\" target=\"_blank\" rel=\"noreferrer noopener\">full source<\/a>)<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-left-radius:12px;border-bottom-right-radius:12px\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"plaintext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span>#---------------------------\n<\/span><\/span><span class='shcb-loc'><span># WordPress general\n<\/span><\/span><span class='shcb-loc'><span>#---------------------------\n<\/span><\/span><span class='shcb-loc'><span># Ignore the wp-content\/index.php\n<\/span><\/span><span class='shcb-loc'><span>\/index.php\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>#---------------------------\n<\/span><\/span><span class='shcb-loc'><span># WordPress themes\n<\/span><\/span><span class='shcb-loc'><span>#---------------------------\n<\/span><\/span><span class='shcb-loc'><span># Ignore all themes\n<\/span><\/span><mark class='shcb-loc'><span>\/themes\/*\n<\/span><\/mark><span class='shcb-loc'><span># DO NOT ignore this theme!\n<\/span><\/span><mark class='shcb-loc'><span>!\/themes\/demo-theme\n<\/span><\/mark><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>#---------------------------\n<\/span><\/span><span class='shcb-loc'><span># WordPress plugins\n<\/span><\/span><span class='shcb-loc'><span>#---------------------------\n<\/span><\/span><span class='shcb-loc'><span># Ignore all plugins\n<\/span><\/span><mark class='shcb-loc'><span>\/plugins\/*\n<\/span><\/mark><span class='shcb-loc'><span># DO NOT ignore this plugin!\n<\/span><\/span><mark class='shcb-loc'><span>!\/plugins\/demo-plugin\n<\/span><\/mark><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>#---------------------------\n<\/span><\/span><span class='shcb-loc'><span># WP MU plugins: these are\n<\/span><\/span><span class='shcb-loc'><span># managed by the platform.\n<\/span><\/span><span class='shcb-loc'><span>#---------------------------\n<\/span><\/span><span class='shcb-loc'><span>\/mu-plugins\/\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>#---------------------------\n<\/span><\/span><span class='shcb-loc'><span># WP uploads directory\n<\/span><\/span><span class='shcb-loc'><span>#---------------------------\n<\/span><\/span><span class='shcb-loc'><span>\/uploads\/\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>#---------------------------\n<\/span><\/span><span class='shcb-loc'><span># WP upgrade files\n<\/span><\/span><span class='shcb-loc'><span>#---------------------------\n<\/span><\/span><span class='shcb-loc'><span>\/upgrade\/\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>#---------------------------\n<\/span><\/span><span class='shcb-loc'><span># Composer\n<\/span><\/span><span class='shcb-loc'><span>#---------------------------\n<\/span><\/span><span class='shcb-loc'><span>\/vendor\n<\/span><\/span><span class='shcb-loc'><span>auth.json\n<\/span><\/span><span class='shcb-loc'><span>.env\n<\/span><\/span><span class='shcb-loc'><span>.env.*\n<\/span><\/span><span class='shcb-loc'><span>!.env.example\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">plaintext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n\n<p>A few key things to note from the code above:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>\/plugins\/*<\/code>: this ignores any directories nested within the <code>plugins\/<\/code> directory.\n<ul class=\"wp-block-list\">\n<li><code>!\/plugins\/demo-plugin<\/code>: overrides the previous <code>\/plugins\/*<\/code> to allow the <code>demo-plugin<\/code> to not be ignored, and instead, it is version-controlled.&nbsp;<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><code>\/themes\/*<\/code>: this ignores any directories nested within the themes\/ directory.\n<ul class=\"wp-block-list\">\n<li><code>!\/themes\/demo-theme<\/code>: overrides the previous <code>\/themes\/*<\/code> to allow the <code>demo-theme<\/code> to not be ignored, and instead it is version controlled.&nbsp;<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>You can adjust the <code>demo-plugin<\/code> or <code>demo-theme<\/code> examples to work with your setup.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"composer-setup\"><strong>Set up Composer with WPackagist integration<\/strong><\/h2>\n\n\n\n<p>Composer allows you to manage your PHP dependencies. WPackagist mirrors the WordPress plugin and theme directories as a Composer repository.&nbsp;<\/p>\n\n\n\n<p>Typically, you could consider utilizing Composer for PSR-4 \/ PSR-0 namespacing, linting, and unit testing. We\u2019ll only focus on demonstrating how you might pull in some standard WordPress plugins.\u00a0<\/p>\n\n\n\n<p>Here is a <code>composer.json<\/code> that installs a few example plugins from WPackagist: Two Factor, Gutenberg, and WordPress SEO. These are here for demonstration and feel free to replace them with plugins that are standard to your workflow.<\/p>\n\n\n\n<div class=\"wp-block-group has-border-color has-polar-border-color has-polar-background-color has-background is-layout-flow wp-container-core-group-is-layout-f285f6d4 wp-block-group-is-layout-flow\" style=\"border-width:1px;border-radius:12px;margin-bottom:var(--wp--preset--spacing--30);padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\">\n<p class=\"has-text-align-center has-small-font-size\" style=\"padding-top:6px;padding-bottom:6px;line-height:1\"><code>composer.json<\/code> (<a href=\"https:\/\/github.com\/colorful-tones\/wp-engine-composer-deploy-demo\/blob\/main\/composer.json\" target=\"_blank\" rel=\"noreferrer noopener\">full source<\/a>)<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-left-radius:12px;border-bottom-right-radius:12px\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span>{\n<\/span><\/span><span class='shcb-loc'><span>   <span class=\"hljs-attr\">\"name\"<\/span>: <span class=\"hljs-string\">\"wpe\/composer-demo\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>   <span class=\"hljs-attr\">\"description\"<\/span>: <span class=\"hljs-string\">\"Demo with Composer and deploy to WP Engine.\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>   <span class=\"hljs-attr\">\"license\"<\/span>: <span class=\"hljs-string\">\"GPL-2.0+\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>   <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"project\"<\/span>,\n<\/span><\/span><mark class='shcb-loc'><span>   <span class=\"hljs-attr\">\"repositories\"<\/span>: &#91;\n<\/span><\/mark><mark class='shcb-loc'><span>       {\n<\/span><\/mark><mark class='shcb-loc'><span>           <span class=\"hljs-attr\">\"type\"<\/span>:<span class=\"hljs-string\">\"composer\"<\/span>,\n<\/span><\/mark><mark class='shcb-loc'><span>           <span class=\"hljs-attr\">\"url\"<\/span>:<span class=\"hljs-string\">\"https:\/\/wpackagist.org\"<\/span>,\n<\/span><\/mark><mark class='shcb-loc'><span>           <span class=\"hljs-attr\">\"only\"<\/span>: &#91;\n<\/span><\/mark><mark class='shcb-loc'><span>               <span class=\"hljs-string\">\"wpackagist-plugin\/*\"<\/span>,\n<\/span><\/mark><mark class='shcb-loc'><span>               <span class=\"hljs-string\">\"wpackagist-theme\/*\"<\/span>\n<\/span><\/mark><mark class='shcb-loc'><span>           ]\n<\/span><\/mark><mark class='shcb-loc'><span>       }\n<\/span><\/mark><mark class='shcb-loc'><span>   ],\n<\/span><\/mark><span class='shcb-loc'><span>   <span class=\"hljs-attr\">\"require\"<\/span>: {\n<\/span><\/span><mark class='shcb-loc'><span>       <span class=\"hljs-attr\">\"wpackagist-plugin\/two-factor\"<\/span>: <span class=\"hljs-string\">\"*\"<\/span>,\n<\/span><\/mark><mark class='shcb-loc'><span>       <span class=\"hljs-attr\">\"wpackagist-plugin\/gutenberg\"<\/span>: <span class=\"hljs-string\">\"*\"<\/span>,\n<\/span><\/mark><mark class='shcb-loc'><span>       <span class=\"hljs-attr\">\"wpackagist-plugin\/wordpress-seo\"<\/span>: <span class=\"hljs-string\">\"*\"<\/span>\n<\/span><\/mark><span class='shcb-loc'><span>   },\n<\/span><\/span><span class='shcb-loc'><span>   <span class=\"hljs-attr\">\"extra\"<\/span>: {\n<\/span><\/span><mark class='shcb-loc'><span>       <span class=\"hljs-attr\">\"installer-paths\"<\/span>: {\n<\/span><\/mark><mark class='shcb-loc'><span>           <span class=\"hljs-attr\">\"plugins\/{$name}\/\"<\/span>: &#91;\n<\/span><\/mark><mark class='shcb-loc'><span>               <span class=\"hljs-string\">\"type:wordpress-plugin\"<\/span>\n<\/span><\/mark><mark class='shcb-loc'><span>           ],\n<\/span><\/mark><mark class='shcb-loc'><span>           <span class=\"hljs-attr\">\"themes\/{$name}\/\"<\/span>: &#91;\n<\/span><\/mark><mark class='shcb-loc'><span>               <span class=\"hljs-string\">\"type:wordpress-theme\"<\/span>\n<\/span><\/mark><mark class='shcb-loc'><span>           ]\n<\/span><\/mark><mark class='shcb-loc'><span>       }\n<\/span><\/mark><span class='shcb-loc'><span>   },\n<\/span><\/span><span class='shcb-loc'><span>   <span class=\"hljs-attr\">\"config\"<\/span>: {\n<\/span><\/span><span class='shcb-loc'><span>       <span class=\"hljs-attr\">\"allow-plugins\"<\/span>: {\n<\/span><\/span><span class='shcb-loc'><span>           <span class=\"hljs-attr\">\"composer\/installers\"<\/span>: <span class=\"hljs-literal\">true<\/span>\n<\/span><\/span><span class='shcb-loc'><span>       }\n<\/span><\/span><span class='shcb-loc'><span>   }\n<\/span><\/span><span class='shcb-loc'><span>}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n\n<p>If you\u2019re just integrating Composer into your project the first time then you\u2019ll likely want to now run <code>composer install<\/code> after creating a <code>composer.json<\/code> like the one above. This will generate the corresponding <code>composer.lock<\/code> file for your project with these new dependencies (and their dependencies).<\/p>\n\n\n\n<p style=\"margin-bottom:0\">If this this is your first time integrating WPackagist into your existing Composer project then the key things to note from the code above:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Add the WPackagist repository under the <code>repositories<\/code> entry (<em>see lines 6-15 in the code above<\/em>).<\/li>\n\n\n\n<li>Add any plugins or themes you want to install from WPackagist under the <code>require<\/code> key (<em>see lines 17-19 in the code above<\/em>). Be sure to use the <code>wpackagist-plugin\/<\/code> or <code>wpackagist-theme\/<\/code> prefixed vendor name to tell Composer that you intend these to be installed through WPackagist.<\/li>\n\n\n\n<li>Set the <code>installer-paths<\/code> for your plugins and themes under the <code>extra<\/code> key to tell Composer where to install your WPackagist dependencies.<\/li>\n<\/ul>\n\n\n\n<p>Run <code>composer update<\/code> to install the new required dependencies (<em>see lines 22-29 in the code above<\/em>).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"acf-with-composer\"><strong>How to install ACF PRO with Composer<\/strong><\/h2>\n\n\n\n<p>ACF has some useful information on <a href=\"https:\/\/www.advancedcustomfields.com\/resources\/installing-acf-pro-with-composer\/\">installing ACF PRO with Composer<\/a>. We\u2019ll use the <code>composer.json<\/code> code above as our starting point. Here are the steps you\u2019ll need to set this up, which we\u2019ll go over in further detail:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Copy your ACF PRO license key from the <a href=\"https:\/\/www.advancedcustomfields.com\/my-account\/view-licenses\/\" target=\"_blank\" rel=\"noreferrer noopener\">Licenses tab<\/a>. To activate your license via your\u00a0<code>wp-config.php<\/code>\u00a0file, add the following line to the file, replacing\u00a0<code>[key]<\/code>\u00a0with your license key: <code>define( 'ACF_PRO_LICENSE', '[key]'<\/code>.<\/li>\n\n\n\n<li>Add the ACF package repository to your <code>composer.json<\/code>.<\/li>\n\n\n\n<li>Install the plugin by running <code>composer require wpengine\/advanced-custom-fields-pro<\/code>.<\/li>\n<\/ol>\n\n\n\n<p>Here is what your final <code>composer.json<\/code> file will look:<\/p>\n\n\n\n<div class=\"wp-block-group has-border-color has-polar-border-color has-polar-background-color has-background is-layout-flow wp-container-core-group-is-layout-f285f6d4 wp-block-group-is-layout-flow\" style=\"border-width:1px;border-radius:12px;margin-bottom:var(--wp--preset--spacing--30);padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\">\n<p class=\"has-text-align-center has-small-font-size\" style=\"padding-top:6px;padding-right:var(--wp--preset--spacing--20);padding-bottom:6px;padding-left:var(--wp--preset--spacing--20);line-height:1\"><code>composer.json<\/code> (<a href=\"https:\/\/github.com\/colorful-tones\/wp-engine-composer-deploy-demo\/blob\/main\/composer.json\" target=\"_blank\" rel=\"noreferrer noopener\">full source<\/a>)<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-left-radius:12px;border-bottom-right-radius:12px\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span>{\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attr\">\"name\"<\/span>: <span class=\"hljs-string\">\"wpe\/composer-demo\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attr\">\"description\"<\/span>: <span class=\"hljs-string\">\"Demo with Composer and deploy to WP Engine.\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attr\">\"license\"<\/span>: <span class=\"hljs-string\">\"GPL-2.0+\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"project\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attr\">\"repositories\"<\/span>: &#91;\n<\/span><\/span><span class='shcb-loc'><span>        {\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"composer\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"url\"<\/span>: <span class=\"hljs-string\">\"https:\/\/connect.advancedcustomfields.com\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        },\n<\/span><\/span><span class='shcb-loc'><span>        {\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"type\"<\/span>:<span class=\"hljs-string\">\"composer\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"url\"<\/span>:<span class=\"hljs-string\">\"https:\/\/wpackagist.org\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"only\"<\/span>: &#91;\n<\/span><\/span><span class='shcb-loc'><span>                <span class=\"hljs-string\">\"wpackagist-plugin\/*\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>                <span class=\"hljs-string\">\"wpackagist-theme\/*\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>            ]\n<\/span><\/span><span class='shcb-loc'><span>        }\n<\/span><\/span><span class='shcb-loc'><span>    ],\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attr\">\"require\"<\/span>: {\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">\"wpackagist-plugin\/two-factor\"<\/span>: <span class=\"hljs-string\">\"*\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">\"wpackagist-plugin\/gutenberg\"<\/span>: <span class=\"hljs-string\">\"*\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">\"wpackagist-plugin\/wordpress-seo\"<\/span>: <span class=\"hljs-string\">\"*\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">\"wpengine\/advanced-custom-fields-pro\"<\/span>: <span class=\"hljs-string\">\"^6.3\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    },\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attr\">\"extra\"<\/span>: {\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">\"installer-paths\"<\/span>: {\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"plugins\/{$name}\/\"<\/span>: &#91;\n<\/span><\/span><span class='shcb-loc'><span>                <span class=\"hljs-string\">\"type:wordpress-plugin\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>            ],\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"themes\/{$name}\/\"<\/span>: &#91;\n<\/span><\/span><span class='shcb-loc'><span>                <span class=\"hljs-string\">\"type:wordpress-theme\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>            ]\n<\/span><\/span><span class='shcb-loc'><span>        }\n<\/span><\/span><span class='shcb-loc'><span>    },\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attr\">\"config\"<\/span>: {\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">\"allow-plugins\"<\/span>: {\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"composer\/installers\"<\/span>: <span class=\"hljs-literal\">true<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        }\n<\/span><\/span><span class='shcb-loc'><span>    }\n<\/span><\/span><span class='shcb-loc'><span>}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n\n<p>There are other ways to install and activate your ACF PRO license, so be sure to check out the <a href=\"https:\/\/www.advancedcustomfields.com\/resources\/how-to-activate\/\">full documentation<\/a>. If you encounter any issues along the way, then send<a href=\"https:\/\/www.advancedcustomfields.com\/support\/\"> a support message<\/a>.<\/p>\n\n\n\n<div class=\"wp-block-group has-base-color has-text-color has-background has-link-color wp-elements-b3b5111bd1ed80257b6afde7f6c47e8c has-global-padding is-layout-constrained wp-container-core-group-is-layout-9b866ece wp-block-group-is-layout-constrained\" style=\"border-radius:12px;background-color:#0076dc;margin-bottom:var(--wp--preset--spacing--30);padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\">\n<div class=\"wp-block-group alignwide is-content-justification-left is-layout-flex wp-container-core-group-is-layout-75880670 wp-block-group-is-layout-flex\" style=\"padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\">\n<div class=\"wp-block-outermost-icon-block\"><div class=\"icon-container\" style=\"width:80px\"><svg fill=\"none\" viewBox=\"0 0 80 36\" aria-label=\"ACF logo\"><path fill=\"currentColor\" d=\"M64.169 35.437h-8.673V.427h23.118v8.152H64.169v6.248h13.615v7.95H64.169v12.662-.002Z\"><\/path><path fill=\"currentColor\" d=\"M53.208 20.744h8.596c-1.272 8.911-8.74 14.805-17.787 14.805-9.907 0-17.974-7.45-17.974-17.483-.02-2.333.43-4.646 1.325-6.799a17.22 17.22 0 0 1 3.882-5.722A17.972 17.972 0 0 1 44.017.436c8.964 0 16.64 5.939 17.731 14.707h-8.587c-2.582-9.932-18.671-8.96-18.671 2.923 0 11.885 16.29 12.76 18.718 2.68v-.002Z\" opacity=\".05\"><\/path><path fill=\"currentColor\" d=\"M51.449 20.744c-1.475 5.014-6.724 7.994-11.89 6.746-5.17-1.253-8.409-6.28-7.336-11.39 1.072-5.113 6.071-8.48 11.323-7.628A9.366 9.366 0 0 1 49.16 11.4a9.656 9.656 0 0 1 2.24 3.742h8.337C58.645 6.354 50.948.436 42.006.436a17.97 17.97 0 0 0-12.77 5.106 17.214 17.214 0 0 0-3.884 5.725 17.302 17.302 0 0 0-1.324 6.802c0 10.032 8.02 17.48 17.98 17.48 9.04 0 16.487-5.894 17.781-14.805h-8.341.001Z\"><\/path><path fill=\"currentColor\" d=\"M25.544 30.344h-12.07l-1.972 5.088H2.266L16.4.389h6.16l14.697 35.054h-9.752l-1.964-5.1h.003Zm-8.639-8.674-.302.79h5.86l-.204-.593-2.728-7.515-2.626 7.318Z\" opacity=\".05\"><\/path><path fill=\"currentColor\" d=\"M23.258 30.344H11.21l-1.972 5.088H0L14.136.389h6.16l14.697 35.054h-9.748l-1.987-5.1ZM14.64 21.67l-.301.79h5.86l-.205-.593-2.727-7.515-2.626 7.318h-.001Z\"><\/path><\/svg><\/div><\/div>\n\n\n\n<p class=\"has-small-font-size wp-container-content-9cfa9a5a\" style=\"line-height:1.5\">Advanced custom fields to build <br>with WordPress your way.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-right is-nowrap is-layout-flex wp-container-core-buttons-is-layout-b315634e wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button is-style-outline-base\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/wpeng.in\/acf-builders\/\" style=\"border-radius:99px;padding-top:10px;padding-right:24px;padding-bottom:10px;padding-left:24px\" target=\"_blank\" rel=\"noreferrer noopener\">Download \u2192<\/a><\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"wpe-gha-with-composer\"><strong>Set up WP Engine GitHub Action for Composer integration<\/strong><\/h2>\n\n\n\n<p>WP Engine\u2019s <a href=\"https:\/\/github.com\/wpengine\/github-action-wpe-site-deploy\">GitHub Action for Site Deployment<\/a> relies on <a href=\"https:\/\/en.wikipedia.org\/wiki\/Rsync\">rsync<\/a> to transfer and synchronize local GitHub repository files to the final WP Engine hosting environment. This is critical to be mindful of when you initially setup your GitHub workflows.<\/p>\n\n\n\n<p>Additionally, since we\u2019re organizing the root of our repository within the <code>wp-content\/<\/code> directory then we want to be sure that we configure some key deployment options in the final workflow.<\/p>\n\n\n\n<div class=\"wp-block-group has-border-color has-polar-border-color has-polar-background-color has-background is-layout-flow wp-container-core-group-is-layout-f285f6d4 wp-block-group-is-layout-flow\" style=\"border-width:1px;border-radius:12px;margin-bottom:var(--wp--preset--spacing--30);padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\">\n<p class=\"has-text-align-center has-small-font-size\" style=\"padding-top:6px;padding-right:var(--wp--preset--spacing--20);padding-bottom:6px;padding-left:var(--wp--preset--spacing--20);line-height:1\"><code>production.yml<\/code> (<a href=\"https:\/\/github.com\/colorful-tones\/wp-engine-composer-deploy-demo\/blob\/main\/.github\/workflows\/production.yml\" target=\"_blank\" rel=\"noreferrer noopener\">full source<\/a>)<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-left-radius:12px;border-bottom-right-radius:12px\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"YAML\" data-shcb-language-slug=\"yaml\"><span><code class=\"hljs language-yaml shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\"># Deploy to WP Engine Production environment<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># https:\/\/wpengine.com\/support\/environments\/#About_Environments<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">Deploy<\/span> <span class=\"hljs-string\">to<\/span> <span class=\"hljs-string\">production<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">on:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>  <span class=\"hljs-attr\">push:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attr\">branches:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>     <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-string\">main<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">jobs:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>  <span class=\"hljs-attr\">Deploy-to-WP-Engine-Production:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attr\">runs-on:<\/span> <span class=\"hljs-string\">ubuntu-latest<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attr\">steps:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">run:<\/span> <span class=\"hljs-string\">echo<\/span> <span class=\"hljs-string\">\"Preparing to deploy to WP Engine production\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">uses:<\/span> <span class=\"hljs-string\">actions\/checkout@v3<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">GitHub<\/span> <span class=\"hljs-string\">Action<\/span> <span class=\"hljs-string\">Deploy<\/span> <span class=\"hljs-string\">to<\/span> <span class=\"hljs-string\">WP<\/span> <span class=\"hljs-string\">Engine<\/span>\n<\/span><\/span><span class='shcb-loc'><span>      <span class=\"hljs-attr\">uses:<\/span> <span class=\"hljs-string\">wpengine\/github-action-wpe-site-deploy@v3<\/span>\n<\/span><\/span><span class='shcb-loc'><span>      <span class=\"hljs-attr\">with:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-comment\"># Deploy vars<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-comment\"># https:\/\/github.com\/wpengine\/github-action-wpe-site-deploy?tab=readme-ov-file#environment-variables--secrets<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-comment\"># The private RSA key you will save in the Github Secrets<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">WPE_SSHG_KEY_PRIVATE:<\/span> <span class=\"hljs-string\">${{<\/span> <span class=\"hljs-string\">secrets.WPE_SSHG_KEY_PRIVATE<\/span> <span class=\"hljs-string\">}}<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-comment\"># Destination to deploy to WPE<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-comment\"># Change to your environment name<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">WPE_ENV:<\/span> <span class=\"hljs-string\">yourEnvironmentName<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-comment\"># Deploy options<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-comment\"># An optional destination directory to deploy<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-comment\"># to other than the WordPress root.<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">REMOTE_PATH:<\/span> <span class=\"hljs-string\">\"wp-content\/\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-comment\"># Optional flags for the deployment<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">FLAGS:<\/span> <span class=\"hljs-string\">-azvr<\/span> <span class=\"hljs-string\">--inplace<\/span> <span class=\"hljs-string\">--delete<\/span> <span class=\"hljs-string\">--include-from<\/span> <span class=\"hljs-string\">rsync-config\/includes.txt<\/span> <span class=\"hljs-string\">--exclude=\".*\"<\/span> <span class=\"hljs-string\">--exclude-from<\/span> <span class=\"hljs-string\">rsync-config\/excludes.txt<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-comment\"># File containing custom scripts run after the rsync<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">SCRIPT:<\/span> <span class=\"hljs-string\">wp-content\/bin\/post-deploy.sh<\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">YAML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">yaml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n\n<p>In the code above you\u2019ll want to replace some of the deployment variables, like <code>WPE_ENV<\/code> and be sure to <a href=\"https:\/\/github.com\/wpengine\/github-action-wpe-site-deploy?tab=readme-ov-file#setup-instructions\">setup your SSH keys<\/a> (both the WP Engine SSH Gateway key and your GitHub repository\u2019s private SSH key: <code>WPE_SSH_KEY_PRIVATE<\/code>). Again, the helpful WP Engine <a href=\"https:\/\/my.wpengine.com\/profile\/github_action\">step-by-step guide<\/a> can help you here. The key options you will want to pay close attention to are listed in the table below.<\/p>\n\n\n\n<figure class=\"wp-block-table alignwide\"><table><thead><tr><th class=\"has-text-align-right\" data-align=\"right\">Name<\/th><th class=\"has-text-align-center\" data-align=\"center\">Type<\/th><th class=\"has-text-align-left\" data-align=\"left\">Usage<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-right\" data-align=\"right\"><code>REMOTE_PATH<\/code><\/td><td class=\"has-text-align-center\" data-align=\"center\">string<\/td><td class=\"has-text-align-left\" data-align=\"left\">Optional path to specify a directory destination to deploy to. Defaults to WordPress root directory on WP Engine. You want this to be <code>wp-content\/<\/code>.<\/td><\/tr><tr><td class=\"has-text-align-right\" data-align=\"right\"><code>FLAGS<\/code><\/td><td class=\"has-text-align-center\" data-align=\"center\">string<\/td><td class=\"has-text-align-left\" data-align=\"left\">Set optional rsync flags such as <code>--delete<\/code> or <code>--exclude-from<\/code>.&nbsp;<br><br><br><em>Caution: Setting custom rsync flags replaces the default flags provided by this action. Consider also adding the <code>-azvr<\/code> flags as needed.<\/em><br><em>&#8211;<code>a<\/code> preserves symbolic links, timestamps, user permissions and ownership.<\/em><br><em>&#8211;<code>z<\/code> is for compression<\/em><br><em>&#8211;<code>v<\/code> is for verbose output<\/em><br><em>&#8211;<code>r<\/code> is for recursive directory scanning<\/em><\/td><\/tr><tr><td class=\"has-text-align-right\" data-align=\"right\"><code>SCRIPT<\/code><\/td><td class=\"has-text-align-center\" data-align=\"center\">string<\/td><td class=\"has-text-align-left\" data-align=\"left\">Remote bash file to execute post-deploy. This can include WP_CLI commands for example. Path is relative to the WP root and file executes on remote. This file can be included in your repo, or be a persistent file that lives on your server.<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\">Deployment options for Deploy WordPress to WP Engine GitHub Action (<a href=\"https:\/\/github.com\/wpengine\/github-action-wpe-site-deploy?tab=readme-ov-file#environment-variables--secrets\" target=\"_blank\" rel=\"noreferrer noopener\">see full list<\/a>).<br><\/figcaption><\/figure>\n\n\n\n<p>You will want to pass some rather specific <code>FLAGS<\/code> and a custom post-deploy SCRIPT in order to get our targeted setup accurately deploying.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"configure-rsync-flags\">Configure rsync flags<\/h3>\n\n\n\n<p>You\u2019ll be running rsync with the&nbsp; <code>--delete<\/code> flag, which is destructive and we need to be careful about what we tell it to delete. Below is what you\u2019ll want to put in your <code>rsync-config\/excludes.txt<\/code> and <code>rsync-config\/includex.txt<\/code> files.<\/p>\n\n\n\n<div class=\"wp-block-group has-border-color has-polar-border-color has-polar-background-color has-background is-layout-flow wp-container-core-group-is-layout-f285f6d4 wp-block-group-is-layout-flow\" style=\"border-width:1px;border-radius:12px;margin-bottom:var(--wp--preset--spacing--30);padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\">\n<p class=\"has-text-align-center has-small-font-size\" style=\"padding-top:6px;padding-right:var(--wp--preset--spacing--20);padding-bottom:6px;padding-left:var(--wp--preset--spacing--20);line-height:1\"><code>excludes.txt<\/code> (<a href=\"https:\/\/github.com\/colorful-tones\/wp-engine-composer-deploy-demo\/blob\/main\/rsync-config\/excludes.txt\" target=\"_blank\" rel=\"noreferrer noopener\">full source<\/a>)<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-left-radius:12px;border-bottom-right-radius:12px\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"plaintext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span># Excluding these items from being deleted each rsync\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>plugins\/*\n<\/span><\/span><span class='shcb-loc'><span>themes\/* \n<\/span><\/span><span class='shcb-loc'><span>mu-plugins\/\n<\/span><\/span><span class='shcb-loc'><span>uploads\/\n<\/span><\/span><span class='shcb-loc'><span>blogs.dir\/\n<\/span><\/span><span class='shcb-loc'><span>upgrade\/*\n<\/span><\/span><span class='shcb-loc'><span>backup-db\/*\n<\/span><\/span><span class='shcb-loc'><span>advanced-cache.php\n<\/span><\/span><span class='shcb-loc'><span>wp-cache-config.php\n<\/span><\/span><span class='shcb-loc'><span>cache\/*\n<\/span><\/span><span class='shcb-loc'><span>cache\/supercache\/*\n<\/span><\/span><span class='shcb-loc'><span>index.php\n<\/span><\/span><span class='shcb-loc'><span>mysql.sql\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>.env\n<\/span><\/span><span class='shcb-loc'><span>.env.*\n<\/span><\/span><span class='shcb-loc'><span>auth.json\n<\/span><\/span><span class='shcb-loc'><span>vendor\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">plaintext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n\n<div class=\"wp-block-group has-border-color has-polar-border-color has-polar-background-color has-background is-layout-flow wp-container-core-group-is-layout-f285f6d4 wp-block-group-is-layout-flow\" style=\"border-width:1px;border-radius:12px;margin-bottom:var(--wp--preset--spacing--30);padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\">\n<p class=\"has-text-align-center has-small-font-size\" style=\"padding-top:6px;padding-right:var(--wp--preset--spacing--20);padding-bottom:6px;padding-left:var(--wp--preset--spacing--20);line-height:1\"><code>includes.txt<\/code> (<a href=\"https:\/\/github.com\/colorful-tones\/wp-engine-composer-deploy-demo\/blob\/main\/rsync-config\/includes.txt\" target=\"_blank\" rel=\"noreferrer noopener\">full source<\/a>)<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-left-radius:12px;border-bottom-right-radius:12px\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"plaintext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span># Including plugins\/themes that we check into\n<\/span><\/span><span class='shcb-loc'><span># Git so that the version in GitHub is deployed\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\/plugins\/demo-plugin\n<\/span><\/span><span class='shcb-loc'><span>\/themes\/demo-theme\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span># ...other plugins could go here...\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">plaintext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"post-deploy-script\">Create a post-deploy script<\/h3>\n\n\n\n<p>After everything is deployed, you will want to run <code>composer install<\/code> on the WP Engine environment. This will allow you to update your dependencies with Composer locally, commit any changes, push them to the Git remote, and once the GitHub Action is run to rsync any <code>composer.json<\/code> and <code>composer.lock<\/code> changes then it\u2019ll install any updated dependencies on the final environment. This is the <code>SCRIPT: wp-content\/bin\/post-deploy.sh<\/code> we set in our GitHub Actions\u2019s YML file (above).<\/p>\n\n\n\n<div class=\"wp-block-group has-border-color has-polar-border-color has-polar-background-color has-background is-layout-flow wp-container-core-group-is-layout-f285f6d4 wp-block-group-is-layout-flow\" style=\"border-width:1px;border-radius:12px;margin-bottom:var(--wp--preset--spacing--30);padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\">\n<p class=\"has-text-align-center has-small-font-size\" style=\"padding-top:6px;padding-right:var(--wp--preset--spacing--20);padding-bottom:6px;padding-left:var(--wp--preset--spacing--20);line-height:1\"><code>post-deploy.sh<\/code> (<a href=\"https:\/\/github.com\/colorful-tones\/wp-engine-composer-deploy-demo\/blob\/main\/bin\/post-deploy.sh\" target=\"_blank\" rel=\"noreferrer noopener\">full source<\/a>)<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-left-radius:12px;border-bottom-right-radius:12px\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"plaintext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span>#!\/bin\/sh\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>echo \"Starting post deploy script...\"\n<\/span><\/span><span class='shcb-loc'><span>echo \"Switch directory to wp-content\/\"\n<\/span><\/span><span class='shcb-loc'><span>cd wp-content\n<\/span><\/span><span class='shcb-loc'><span>echo \"Installing Composer dependencies...\"\n<\/span><\/span><span class='shcb-loc'><span>composer install --optimize-autoloader --no-dev --no-progress\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">plaintext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusion\">Conclusion<\/h2>\n\n\n\n<p>Utilizing Composer with WPackagist to manage your WordPress plugin dependencies can help keep teams organized and facilitate consistent workflows.<\/p>\n\n\n\n<p>Let us know how you\u2019re maintaining your ideal workflow\u2014tag us on X <a href=\"https:\/\/x.com\/wpengine\">@wpengine<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Manage your WordPress dependencies with Composer and deploy to WP Engine with GitHub Actions.<\/p>\n","protected":false},"author":11,"featured_media":4952,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_EventAllDay":false,"_EventTimezone":"","_EventStartDate":"","_EventEndDate":"","_EventStartDateUTC":"","_EventEndDateUTC":"","_EventShowMap":false,"_EventShowMapLink":false,"_EventURL":"","_EventCost":"","_EventCostDescription":"","_EventCurrencySymbol":"","_EventCurrencyCode":"","_EventCurrencyPosition":"","_EventDateTimeSeparator":"","_EventTimeRangeSeparator":"","_EventOrganizerID":[],"_EventVenueID":[],"_OrganizerEmail":"","_OrganizerPhone":"","_OrganizerWebsite":"","_VenueAddress":"","_VenueCity":"","_VenueCountry":"","_VenueProvince":"","_VenueState":"","_VenueZip":"","_VenuePhone":"","_VenueURL":"","_VenueStateProvince":"","_VenueLat":"","_VenueLng":"","_VenueShowMap":false,"_VenueShowMapLink":false,"footnotes":""},"categories":[1],"tags":[15,13,12,11,14],"class_list":["post-4931","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress","tag-composer","tag-deploy","tag-git","tag-github","tag-github-action"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Using Composer to Manage Plugins and Deploy to WP Engine - Builders<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wpengine.com\/builders\/using-composer-manage-plugins-deploy\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using Composer to Manage Plugins and Deploy to WP Engine - Builders\" \/>\n<meta property=\"og:description\" content=\"Manage your WordPress dependencies with Composer and deploy to WP Engine with GitHub Actions.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wpengine.com\/builders\/using-composer-manage-plugins-deploy\/\" \/>\n<meta property=\"og:site_name\" content=\"Builders\" \/>\n<meta property=\"article:published_time\" content=\"2024-07-11T18:24:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-12T13:23:22+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/composer-og.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Damon Cook\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/composer-og.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@dcook\" \/>\n<meta name=\"twitter:site\" content=\"@wpebuilders\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Damon Cook\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/using-composer-manage-plugins-deploy\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/using-composer-manage-plugins-deploy\\\/\"},\"author\":{\"name\":\"Damon Cook\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#\\\/schema\\\/person\\\/9d8d20c8a321b90faceae588fcf6d30d\"},\"headline\":\"Using Composer to Manage Plugins and Deploy to WP Engine\",\"datePublished\":\"2024-07-11T18:24:08+00:00\",\"dateModified\":\"2026-03-12T13:23:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/using-composer-manage-plugins-deploy\\\/\"},\"wordCount\":1701,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/using-composer-manage-plugins-deploy\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/wp-content\\\/uploads\\\/using-composer.png\",\"keywords\":[\"Composer\",\"deploy\",\"Git\",\"GitHub\",\"GitHub Action\"],\"articleSection\":[\"WordPress\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/wpengine.com\\\/builders\\\/using-composer-manage-plugins-deploy\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/using-composer-manage-plugins-deploy\\\/\",\"url\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/using-composer-manage-plugins-deploy\\\/\",\"name\":\"Using Composer to Manage Plugins and Deploy to WP Engine - Builders\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/using-composer-manage-plugins-deploy\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/using-composer-manage-plugins-deploy\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/wp-content\\\/uploads\\\/using-composer.png\",\"datePublished\":\"2024-07-11T18:24:08+00:00\",\"dateModified\":\"2026-03-12T13:23:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/using-composer-manage-plugins-deploy\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/wpengine.com\\\/builders\\\/using-composer-manage-plugins-deploy\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/using-composer-manage-plugins-deploy\\\/#primaryimage\",\"url\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/wp-content\\\/uploads\\\/using-composer.png\",\"contentUrl\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/wp-content\\\/uploads\\\/using-composer.png\",\"width\":1920,\"height\":1080},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/using-composer-manage-plugins-deploy\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using Composer to Manage Plugins and Deploy to WP Engine\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#website\",\"url\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/\",\"name\":\"Builders\",\"description\":\"Reimagining the way we build with WordPress.\",\"publisher\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#organization\",\"name\":\"WP Engine\",\"url\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/wp-content\\\/uploads\\\/2024\\\/05\\\/WP-Engine-Horizontal@2x.png\",\"contentUrl\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/wp-content\\\/uploads\\\/2024\\\/05\\\/WP-Engine-Horizontal@2x.png\",\"width\":348,\"height\":68,\"caption\":\"WP Engine\"},\"image\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/wpebuilders\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCh1WuL54XFb9ZI6m6goFv1g\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#\\\/schema\\\/person\\\/9d8d20c8a321b90faceae588fcf6d30d\",\"name\":\"Damon Cook\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/18d75285d6803fab88b7f45601bb68cbac7c3956347217c06a0291e27dc65f6a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/18d75285d6803fab88b7f45601bb68cbac7c3956347217c06a0291e27dc65f6a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/18d75285d6803fab88b7f45601bb68cbac7c3956347217c06a0291e27dc65f6a?s=96&d=mm&r=g\",\"caption\":\"Damon Cook\"},\"description\":\"Damon Cook is a Developer Advocate at WP Engine. Previously, he navigated the WordPress agency land for a decade. He is a purveyor and discoverer of musical frisson. He can be found in the realms of WordPress Slack, WooCommerce Slack, and Twitter.\",\"sameAs\":[\"https:\\\/\\\/x.com\\\/dcook\"],\"url\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/author\\\/damon-cook\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Using Composer to Manage Plugins and Deploy to WP Engine - Builders","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wpengine.com\/builders\/using-composer-manage-plugins-deploy\/","og_locale":"en_US","og_type":"article","og_title":"Using Composer to Manage Plugins and Deploy to WP Engine - Builders","og_description":"Manage your WordPress dependencies with Composer and deploy to WP Engine with GitHub Actions.","og_url":"https:\/\/wpengine.com\/builders\/using-composer-manage-plugins-deploy\/","og_site_name":"Builders","article_published_time":"2024-07-11T18:24:08+00:00","article_modified_time":"2026-03-12T13:23:22+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/composer-og.jpg","type":"image\/jpeg"}],"author":"Damon Cook","twitter_card":"summary_large_image","twitter_image":"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/composer-og.jpg","twitter_creator":"@dcook","twitter_site":"@wpebuilders","twitter_misc":{"Written by":"Damon Cook","Est. reading time":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/wpengine.com\/builders\/using-composer-manage-plugins-deploy\/#article","isPartOf":{"@id":"https:\/\/wpengine.com\/builders\/using-composer-manage-plugins-deploy\/"},"author":{"name":"Damon Cook","@id":"https:\/\/wpengine.com\/builders\/#\/schema\/person\/9d8d20c8a321b90faceae588fcf6d30d"},"headline":"Using Composer to Manage Plugins and Deploy to WP Engine","datePublished":"2024-07-11T18:24:08+00:00","dateModified":"2026-03-12T13:23:22+00:00","mainEntityOfPage":{"@id":"https:\/\/wpengine.com\/builders\/using-composer-manage-plugins-deploy\/"},"wordCount":1701,"commentCount":0,"publisher":{"@id":"https:\/\/wpengine.com\/builders\/#organization"},"image":{"@id":"https:\/\/wpengine.com\/builders\/using-composer-manage-plugins-deploy\/#primaryimage"},"thumbnailUrl":"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/using-composer.png","keywords":["Composer","deploy","Git","GitHub","GitHub Action"],"articleSection":["WordPress"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/wpengine.com\/builders\/using-composer-manage-plugins-deploy\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/wpengine.com\/builders\/using-composer-manage-plugins-deploy\/","url":"https:\/\/wpengine.com\/builders\/using-composer-manage-plugins-deploy\/","name":"Using Composer to Manage Plugins and Deploy to WP Engine - Builders","isPartOf":{"@id":"https:\/\/wpengine.com\/builders\/#website"},"primaryImageOfPage":{"@id":"https:\/\/wpengine.com\/builders\/using-composer-manage-plugins-deploy\/#primaryimage"},"image":{"@id":"https:\/\/wpengine.com\/builders\/using-composer-manage-plugins-deploy\/#primaryimage"},"thumbnailUrl":"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/using-composer.png","datePublished":"2024-07-11T18:24:08+00:00","dateModified":"2026-03-12T13:23:22+00:00","breadcrumb":{"@id":"https:\/\/wpengine.com\/builders\/using-composer-manage-plugins-deploy\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wpengine.com\/builders\/using-composer-manage-plugins-deploy\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/wpengine.com\/builders\/using-composer-manage-plugins-deploy\/#primaryimage","url":"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/using-composer.png","contentUrl":"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/using-composer.png","width":1920,"height":1080},{"@type":"BreadcrumbList","@id":"https:\/\/wpengine.com\/builders\/using-composer-manage-plugins-deploy\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/wpengine.com\/builders\/"},{"@type":"ListItem","position":2,"name":"Using Composer to Manage Plugins and Deploy to WP Engine"}]},{"@type":"WebSite","@id":"https:\/\/wpengine.com\/builders\/#website","url":"https:\/\/wpengine.com\/builders\/","name":"Builders","description":"Reimagining the way we build with WordPress.","publisher":{"@id":"https:\/\/wpengine.com\/builders\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wpengine.com\/builders\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/wpengine.com\/builders\/#organization","name":"WP Engine","url":"https:\/\/wpengine.com\/builders\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/wpengine.com\/builders\/#\/schema\/logo\/image\/","url":"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2024\/05\/WP-Engine-Horizontal@2x.png","contentUrl":"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2024\/05\/WP-Engine-Horizontal@2x.png","width":348,"height":68,"caption":"WP Engine"},"image":{"@id":"https:\/\/wpengine.com\/builders\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/wpebuilders","https:\/\/www.youtube.com\/channel\/UCh1WuL54XFb9ZI6m6goFv1g"]},{"@type":"Person","@id":"https:\/\/wpengine.com\/builders\/#\/schema\/person\/9d8d20c8a321b90faceae588fcf6d30d","name":"Damon Cook","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/18d75285d6803fab88b7f45601bb68cbac7c3956347217c06a0291e27dc65f6a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/18d75285d6803fab88b7f45601bb68cbac7c3956347217c06a0291e27dc65f6a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/18d75285d6803fab88b7f45601bb68cbac7c3956347217c06a0291e27dc65f6a?s=96&d=mm&r=g","caption":"Damon Cook"},"description":"Damon Cook is a Developer Advocate at WP Engine. Previously, he navigated the WordPress agency land for a decade. He is a purveyor and discoverer of musical frisson. He can be found in the realms of WordPress Slack, WooCommerce Slack, and Twitter.","sameAs":["https:\/\/x.com\/dcook"],"url":"https:\/\/wpengine.com\/builders\/author\/damon-cook\/"}]}},"_links":{"self":[{"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/posts\/4931","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/comments?post=4931"}],"version-history":[{"count":0,"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/posts\/4931\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/media\/4952"}],"wp:attachment":[{"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/media?parent=4931"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/categories?post=4931"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/tags?post=4931"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}