[{"data":1,"prerenderedAt":3696},["ShallowReactive",2],{"featured":3,"content-query-pataNbJU1Y":1385},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"head":10,"created":25,"tags":29,"chapters":32,"thumb":34,"contact":35,"feedback":35,"lead":35,"list":35,"index":35,"sitemap":35,"featured":35,"body":36,"_type":1379,"_id":1380,"_source":1381,"_file":1382,"_stem":1383,"_extension":1384},"/environment/how-to-create-docker-image-on-docker-hub","environment",false,"","How to create Docker image on Docker Hub?","Article describes the process of creating and publishing a Docker image on Docker Hub to enhance CI/CD setup in Bitbucket Pipelines and GitHub Actions.",{"title":11,"link":12,"meta":16},"How to create Docker image on Docker Hub? | pragmate.dev",[13],{"rel":14,"href":15},"canonical","https://pragmate.dev/environment/how-to-create-docker-image-on-docker-hub/",[17,20,23,26],{"name":18,"content":19},"twitter:creator","@przemekhernik",{"name":21,"content":22},"author","Przemysław Hernik",{"name":24,"content":25},"article:published_time","2026-07-24",{"name":27,"content":28},"og:image","https://cdn.pragmate.dev/wp-content/uploads/2025/11/47cc47bd-2c36-4c8b-b2f0-3e9e65186ef3.jpg",{"time":30,"level":31},"5 min","Easy",[33],"/environment/how-to-create-docker-image-on-docker-hub/","docker",true,{"type":37,"children":38,"toc":1368},"root",[39,45,72,86,90,94,101,146,155,183,190,193,199,225,232,248,276,296,317,427,430,435,443,447,450,456,461,466,473,486,535,573,576,582,594,618,642,645,651,663,670,673,679,706,798,801,807,828,1198,1203,1210,1215,1336,1339,1362],{"type":40,"tag":41,"props":42,"children":44},"element","prose-video",{"thumbnail":28,"url":43},"https://www.youtube-nocookie.com/embed/Glb4CzFKcg0",[],{"type":40,"tag":46,"props":47,"children":48},"p",{},[49,52,61,63,70],{"type":50,"value":51},"text","Using Docker is a perfect way to simplify task automation in ",{"type":40,"tag":53,"props":54,"children":58},"a",{"href":55,"rel":56},"https://www.atlassian.com/software/bitbucket/features/pipelines",[57],"nofollow",[59],{"type":50,"value":60},"Bitbucket Pipelines",{"type":50,"value":62}," and ",{"type":40,"tag":53,"props":64,"children":67},{"href":65,"rel":66},"https://github.com/features/actions",[57],[68],{"type":50,"value":69},"GitHub Actions",{"type":50,"value":71},". It helps creating environment that is aligned with the project’s requirements, which can then be used on these platforms to define workflows.",{"type":40,"tag":46,"props":73,"children":74},{},[75,77,84],{"type":50,"value":76},"In this article, I'll discuss the process of creating and publishing a Docker image on ",{"type":40,"tag":53,"props":78,"children":81},{"href":79,"rel":80},"https://hub.docker.com/",[57],[82],{"type":50,"value":83},"Docker Hub",{"type":50,"value":85}," to enhance CI/CD configuration on Bitbucket Pipelines and GitHub Actions.",{"type":40,"tag":87,"props":88,"children":89},"cta",{},[],{"type":40,"tag":91,"props":92,"children":93},"hr",{},[],{"type":40,"tag":95,"props":96,"children":98},"h2",{"id":97},"how-to-prepare-the-environment",[99],{"type":50,"value":100},"How to Prepare the Environment?",{"type":40,"tag":46,"props":102,"children":103},{},[104,110,112,118,120,127,129,135,137,144],{"type":40,"tag":53,"props":105,"children":108},{"href":106,"rel":107},"https://hub.docker.com/explore",[57],[109],{"type":50,"value":83},{"type":50,"value":111}," is a place that Bitbucket Pipelines and GitHub Actions use to run containers in their actions. To create and share an image there, you will need a few things: an account on ",{"type":40,"tag":53,"props":113,"children":116},{"href":114,"rel":115},"https://app.docker.com/signup",[57],[117],{"type":50,"value":83},{"type":50,"value":119},", the ",{"type":40,"tag":53,"props":121,"children":124},{"href":122,"rel":123},"https://www.docker.com/products/docker-desktop/",[57],[125],{"type":50,"value":126},"Docker Desktop",{"type":50,"value":128}," tool, and the ",{"type":40,"tag":130,"props":131,"children":133},"code",{"className":132},[],[134],{"type":50,"value":34},{"type":50,"value":136}," command ",{"type":40,"tag":53,"props":138,"children":141},{"href":139,"rel":140},"https://www.docker.com/products/cli/",[57],[142],{"type":50,"value":143},"available in the terminal",{"type":50,"value":145},".",{"type":40,"tag":46,"props":147,"children":148},{},[149],{"type":40,"tag":150,"props":151,"children":154},"img",{"alt":152,"src":153},"Image","https://crm.tentyp.dev/wp-content/uploads/2025/03/57624318-9111-4915-900d-63ed0e6a6e01.png",[],{"type":40,"tag":46,"props":156,"children":157},{},[158,160,172,174,181],{"type":50,"value":159},"To connect to the account, ",{"type":40,"tag":161,"props":162,"children":163},"strong",{},[164,166],{"type":50,"value":165},"open the terminal and enter the ",{"type":40,"tag":130,"props":167,"children":169},{"className":168},[],[170],{"type":50,"value":171},"docker login",{"type":50,"value":173}," command. It will open the browser, and upon successful login, it will authorize the session in the terminal. This is needed to push an image to the hub. Check out ",{"type":40,"tag":53,"props":175,"children":178},{"href":176,"rel":177},"https://docs.docker.com/get-started/docker_cheatsheet.pdf",[57],[179],{"type":50,"value":180},"the official cheat sheet",{"type":50,"value":182}," for a help.",{"type":40,"tag":46,"props":184,"children":185},{},[186],{"type":40,"tag":150,"props":187,"children":189},{"alt":152,"src":188},"https://crm.tentyp.dev/wp-content/uploads/2025/03/0c16873e-fec6-472b-8cdd-dbbee890c5c0.png",[],{"type":40,"tag":91,"props":191,"children":192},{},[],{"type":40,"tag":95,"props":194,"children":196},{"id":195},"how-to-create-a-docker-image",[197],{"type":50,"value":198},"How to create a Docker image?",{"type":40,"tag":46,"props":200,"children":201},{},[202,215,217,223],{"type":40,"tag":161,"props":203,"children":204},{},[205,207,213],{"type":50,"value":206},"Create a new directory for files and add an empty ",{"type":40,"tag":130,"props":208,"children":210},{"className":209},[],[211],{"type":50,"value":212},"Dockerfile",{"type":50,"value":214}," there",{"type":50,"value":216},". This is the most important file, as it's where you configure the project's environment. I also recommend creating a ",{"type":40,"tag":130,"props":218,"children":220},{"className":219},[],[221],{"type":50,"value":222},"package.json",{"type":50,"value":224}," where you can define tasks, eliminating the need to keep the commands in your mind, and pushing the current state to the repository.",{"type":40,"tag":46,"props":226,"children":227},{},[228],{"type":40,"tag":150,"props":229,"children":231},{"alt":152,"src":230},"https://crm.tentyp.dev/wp-content/uploads/2025/03/8e0eafe9-b0c6-4a7c-81b6-59c1ff729b73.png",[],{"type":40,"tag":46,"props":233,"children":234},{},[235,246],{"type":40,"tag":161,"props":236,"children":237},{},[238,240,245],{"type":50,"value":239},"The next step is to define the environment in the ",{"type":40,"tag":130,"props":241,"children":243},{"className":242},[],[244],{"type":50,"value":212},{"type":50,"value":145},{"type":50,"value":247}," This will be somewhat similar to setting up a clean Linux system. It might seem like a task for a DevOps, but don't worry, you can handle it. My project is to run on PHP 8.2 and Node 22, and support Yarn and Composer.",{"type":40,"tag":46,"props":249,"children":250},{},[251,253,258,260,266,268,274],{"type":50,"value":252},"First, ",{"type":40,"tag":161,"props":254,"children":255},{},[256],{"type":50,"value":257},"choose the base image on which you will build your container",{"type":50,"value":259},". If you feel confident, you can define everything you need on your own - PHP, its modules, Node, etc. In such a way, you can start with a basic image like ",{"type":40,"tag":130,"props":261,"children":263},{"className":262},[],[264],{"type":50,"value":265},"ubuntu:latest",{"type":50,"value":267},". I chose the ",{"type":40,"tag":130,"props":269,"children":271},{"className":270},[],[272],{"type":50,"value":273},"php:8.2",{"type":50,"value":275}," image since it already includes most of the required modules, to which I will only add additional things.",{"type":40,"tag":277,"props":278,"children":282},"pre",{"className":279,"code":280,"filename":212,"language":281,"meta":7,"style":7},"language-txt shiki shiki-themes one-dark-pro","FROM php:8.2\n","txt",[283],{"type":40,"tag":130,"props":284,"children":285},{"__ignoreMap":7},[286],{"type":40,"tag":287,"props":288,"children":291},"span",{"class":289,"line":290},"line",1,[292],{"type":40,"tag":287,"props":293,"children":294},{},[295],{"type":50,"value":280},{"type":40,"tag":46,"props":297,"children":298},{},[299,301,306,308,315],{"type":50,"value":300},"Once you have selected the base image, ",{"type":40,"tag":161,"props":302,"children":303},{},[304],{"type":50,"value":305},"add additional puzzle pieces and install the missing modules",{"type":50,"value":307},". You can do this using the ",{"type":40,"tag":53,"props":309,"children":312},{"href":310,"rel":311},"https://nodejs.org/en/download",[57],[313],{"type":50,"value":314},"official instructions",{"type":50,"value":316},". It's like configuring a Linux machine as if you were doing it on your machine, so the official tools documentation will help.",{"type":40,"tag":277,"props":318,"children":320},{"className":279,"code":319,"filename":212,"language":281,"meta":7,"style":7},"FROM php:8.2\n\nRUN apt-get update \\\n&& apt-get install -y git zip\n\nRUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \\\n&& apt-get install -y nodejs\n\nRUN npm install --global yarn\n\nRUN curl -sS https://getcomposer.org/installer | php \\\n&& mv composer.phar /usr/local/bin/composer\n",[321],{"type":40,"tag":130,"props":322,"children":323},{"__ignoreMap":7},[324,331,340,349,358,366,375,384,392,401,409,418],{"type":40,"tag":287,"props":325,"children":326},{"class":289,"line":290},[327],{"type":40,"tag":287,"props":328,"children":329},{},[330],{"type":50,"value":280},{"type":40,"tag":287,"props":332,"children":334},{"class":289,"line":333},2,[335],{"type":40,"tag":287,"props":336,"children":337},{"emptyLinePlaceholder":35},[338],{"type":50,"value":339},"\n",{"type":40,"tag":287,"props":341,"children":343},{"class":289,"line":342},3,[344],{"type":40,"tag":287,"props":345,"children":346},{},[347],{"type":50,"value":348},"RUN apt-get update \\\n",{"type":40,"tag":287,"props":350,"children":352},{"class":289,"line":351},4,[353],{"type":40,"tag":287,"props":354,"children":355},{},[356],{"type":50,"value":357},"&& apt-get install -y git zip\n",{"type":40,"tag":287,"props":359,"children":361},{"class":289,"line":360},5,[362],{"type":40,"tag":287,"props":363,"children":364},{"emptyLinePlaceholder":35},[365],{"type":50,"value":339},{"type":40,"tag":287,"props":367,"children":369},{"class":289,"line":368},6,[370],{"type":40,"tag":287,"props":371,"children":372},{},[373],{"type":50,"value":374},"RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \\\n",{"type":40,"tag":287,"props":376,"children":378},{"class":289,"line":377},7,[379],{"type":40,"tag":287,"props":380,"children":381},{},[382],{"type":50,"value":383},"&& apt-get install -y nodejs\n",{"type":40,"tag":287,"props":385,"children":387},{"class":289,"line":386},8,[388],{"type":40,"tag":287,"props":389,"children":390},{"emptyLinePlaceholder":35},[391],{"type":50,"value":339},{"type":40,"tag":287,"props":393,"children":395},{"class":289,"line":394},9,[396],{"type":40,"tag":287,"props":397,"children":398},{},[399],{"type":50,"value":400},"RUN npm install --global yarn\n",{"type":40,"tag":287,"props":402,"children":404},{"class":289,"line":403},10,[405],{"type":40,"tag":287,"props":406,"children":407},{"emptyLinePlaceholder":35},[408],{"type":50,"value":339},{"type":40,"tag":287,"props":410,"children":412},{"class":289,"line":411},11,[413],{"type":40,"tag":287,"props":414,"children":415},{},[416],{"type":50,"value":417},"RUN curl -sS https://getcomposer.org/installer | php \\\n",{"type":40,"tag":287,"props":419,"children":421},{"class":289,"line":420},12,[422],{"type":40,"tag":287,"props":423,"children":424},{},[425],{"type":50,"value":426},"&& mv composer.phar /usr/local/bin/composer\n",{"type":40,"tag":91,"props":428,"children":429},{},[],{"type":40,"tag":46,"props":431,"children":432},{},[433],{"type":50,"value":434},"Hi Guys! I've been working on something I’m really proud of - a new eBook all about code linting and formatting in web development. It’s filled with practical tips to help you set up the project environment so your code stays clean, consistent, and free of annoying little errors.",{"type":40,"tag":46,"props":436,"children":437},{},[438],{"type":40,"tag":161,"props":439,"children":440},{},[441],{"type":50,"value":442},"The plan is to sell it for $15, but if you're on my newsletter, you’ll get almost 70% discount. Just drop your email below, and you’ll get it for just $5 when it’s ready 🙌",{"type":40,"tag":444,"props":445,"children":446},"newsletter",{},[],{"type":40,"tag":91,"props":448,"children":449},{},[],{"type":40,"tag":95,"props":451,"children":453},{"id":452},"how-to-publish-docker-image",[454],{"type":50,"value":455},"How to publish Docker image?",{"type":40,"tag":46,"props":457,"children":458},{},[459],{"type":50,"value":460},"The process of publishing an image in Docker Hub consists of two steps. First, an image must be built. Next, this image needs to be pushed to the hub. You can find explanations below 👇",{"type":40,"tag":462,"props":463,"children":465},"spacer",{"height":464},75,[],{"type":40,"tag":467,"props":468,"children":470},"h3",{"id":469},"how-to-build-a-docker-image",[471],{"type":50,"value":472},"How to build a Docker image?",{"type":40,"tag":46,"props":474,"children":475},{},[476,478,484],{"type":50,"value":477},"To build a Docker image, use the ",{"type":40,"tag":130,"props":479,"children":481},{"className":480},[],[482],{"type":50,"value":483},"docker build",{"type":50,"value":485}," command along with a few arguments.",{"type":40,"tag":277,"props":487,"children":491},{"className":488,"code":489,"language":490,"meta":7,"style":7},"language-bash shiki shiki-themes one-dark-pro","docker build . --tag pragmatedev/vitewp-docker-test:latest --platform linux/amd64\n","bash",[492],{"type":40,"tag":130,"props":493,"children":494},{"__ignoreMap":7},[495],{"type":40,"tag":287,"props":496,"children":497},{"class":289,"line":290},[498,503,509,514,520,525,530],{"type":40,"tag":287,"props":499,"children":501},{"style":500},"--shiki-default:#61AFEF",[502],{"type":50,"value":34},{"type":40,"tag":287,"props":504,"children":506},{"style":505},"--shiki-default:#98C379",[507],{"type":50,"value":508}," build",{"type":40,"tag":287,"props":510,"children":511},{"style":505},[512],{"type":50,"value":513}," .",{"type":40,"tag":287,"props":515,"children":517},{"style":516},"--shiki-default:#D19A66",[518],{"type":50,"value":519}," --tag",{"type":40,"tag":287,"props":521,"children":522},{"style":505},[523],{"type":50,"value":524}," pragmatedev/vitewp-docker-test:latest",{"type":40,"tag":287,"props":526,"children":527},{"style":516},[528],{"type":50,"value":529}," --platform",{"type":40,"tag":287,"props":531,"children":532},{"style":505},[533],{"type":50,"value":534}," linux/amd64\n",{"type":40,"tag":536,"props":537,"children":538},"ol",{},[539,551,562],{"type":40,"tag":540,"props":541,"children":542},"li",{},[543,549],{"type":40,"tag":130,"props":544,"children":546},{"className":545},[],[547],{"type":50,"value":548},"docker build .",{"type":50,"value":550}," Builds a Docker image from the Dockerfile in the current directory.",{"type":40,"tag":540,"props":552,"children":553},{},[554,560],{"type":40,"tag":130,"props":555,"children":557},{"className":556},[],[558],{"type":50,"value":559},"--tag pragmatedev/vitewp-docker-test:latest",{"type":50,"value":561}," Gives the image a name and tag.",{"type":40,"tag":540,"props":563,"children":564},{},[565,571],{"type":40,"tag":130,"props":566,"children":568},{"className":567},[],[569],{"type":50,"value":570},"--platform linux/amd64",{"type":50,"value":572}," Specifies the platform for which the image should be built. This is useful when you are working on a machine with a different architecture, such as macOS, and want to force compatibility with the server.",{"type":40,"tag":462,"props":574,"children":575},{"height":464},[],{"type":40,"tag":467,"props":577,"children":579},{"id":578},"how-to-push-a-docker-image",[580],{"type":50,"value":581},"How to push a Docker image?",{"type":40,"tag":46,"props":583,"children":584},{},[585,587,593],{"type":50,"value":586},"To publish a Docker image, use the ",{"type":40,"tag":130,"props":588,"children":590},{"className":589},[],[591],{"type":50,"value":592},"docker push",{"type":50,"value":485},{"type":40,"tag":277,"props":595,"children":597},{"className":488,"code":596,"language":490,"meta":7,"style":7},"docker push pragmatedev/vitewp-docker-test:latest\n",[598],{"type":40,"tag":130,"props":599,"children":600},{"__ignoreMap":7},[601],{"type":40,"tag":287,"props":602,"children":603},{"class":289,"line":290},[604,608,613],{"type":40,"tag":287,"props":605,"children":606},{"style":500},[607],{"type":50,"value":34},{"type":40,"tag":287,"props":609,"children":610},{"style":505},[611],{"type":50,"value":612}," push",{"type":40,"tag":287,"props":614,"children":615},{"style":505},[616],{"type":50,"value":617}," pragmatedev/vitewp-docker-test:latest\n",{"type":40,"tag":536,"props":619,"children":620},{},[621,631],{"type":40,"tag":540,"props":622,"children":623},{},[624,629],{"type":40,"tag":130,"props":625,"children":627},{"className":626},[],[628],{"type":50,"value":592},{"type":50,"value":630}," Publishes a Docker image to Docker Hub.",{"type":40,"tag":540,"props":632,"children":633},{},[634,640],{"type":40,"tag":130,"props":635,"children":637},{"className":636},[],[638],{"type":50,"value":639},"pragmatedev/vitewp-docker-test:latest",{"type":50,"value":641}," Defines name and tag for the image.",{"type":40,"tag":462,"props":643,"children":644},{"height":464},[],{"type":40,"tag":467,"props":646,"children":648},{"id":647},"how-to-find-a-docker-image",[649],{"type":50,"value":650},"How to find a Docker image?",{"type":40,"tag":46,"props":652,"children":653},{},[654,656,662],{"type":50,"value":655},"After firing the commands, your image should be pushed to Docker Hub and visible there. You can verify it by visiting the following URL: ",{"type":40,"tag":130,"props":657,"children":659},{"className":658},[],[660],{"type":50,"value":661},"https://hub.docker.com/r/{image_name}",{"type":50,"value":145},{"type":40,"tag":46,"props":664,"children":665},{},[666],{"type":40,"tag":150,"props":667,"children":669},{"alt":152,"src":668},"https://crm.tentyp.dev/wp-content/uploads/2025/03/9012200f-75f5-4171-8fd7-1167d591442a.png",[],{"type":40,"tag":462,"props":671,"children":672},{"height":464},[],{"type":40,"tag":467,"props":674,"children":676},{"id":675},"how-to-simplify-a-process",[677],{"type":50,"value":678},"How to simplify a process?",{"type":40,"tag":46,"props":680,"children":681},{},[682,684,689,691,697,698,704],{"type":50,"value":683},"To simplify the process and minimize what you need to remember, define tasks in your project's ",{"type":40,"tag":130,"props":685,"children":687},{"className":686},[],[688],{"type":50,"value":222},{"type":50,"value":690},". This allows you to use simple ",{"type":40,"tag":130,"props":692,"children":694},{"className":693},[],[695],{"type":50,"value":696},"yarn build",{"type":50,"value":62},{"type":40,"tag":130,"props":699,"children":701},{"className":700},[],[702],{"type":50,"value":703},"yarn push",{"type":50,"value":705}," commands.",{"type":40,"tag":277,"props":707,"children":711},{"className":708,"code":709,"filename":222,"language":710,"meta":7,"style":7},"language-json shiki shiki-themes one-dark-pro","{\n    \"scripts\": {\n        \"build\": \"docker build . --tag pragmatedev/vitewp-docker-test:latest --platform linux/amd64\",\n        \"push\": \"docker push pragmatedev/vitewp-docker-test:latest\",\n    }\n}\n","json",[712],{"type":40,"tag":130,"props":713,"children":714},{"__ignoreMap":7},[715,724,738,761,782,790],{"type":40,"tag":287,"props":716,"children":717},{"class":289,"line":290},[718],{"type":40,"tag":287,"props":719,"children":721},{"style":720},"--shiki-default:#ABB2BF",[722],{"type":50,"value":723},"{\n",{"type":40,"tag":287,"props":725,"children":726},{"class":289,"line":333},[727,733],{"type":40,"tag":287,"props":728,"children":730},{"style":729},"--shiki-default:#E06C75",[731],{"type":50,"value":732},"    \"scripts\"",{"type":40,"tag":287,"props":734,"children":735},{"style":720},[736],{"type":50,"value":737},": {\n",{"type":40,"tag":287,"props":739,"children":740},{"class":289,"line":342},[741,746,751,756],{"type":40,"tag":287,"props":742,"children":743},{"style":729},[744],{"type":50,"value":745},"        \"build\"",{"type":40,"tag":287,"props":747,"children":748},{"style":720},[749],{"type":50,"value":750},": ",{"type":40,"tag":287,"props":752,"children":753},{"style":505},[754],{"type":50,"value":755},"\"docker build . --tag pragmatedev/vitewp-docker-test:latest --platform linux/amd64\"",{"type":40,"tag":287,"props":757,"children":758},{"style":720},[759],{"type":50,"value":760},",\n",{"type":40,"tag":287,"props":762,"children":763},{"class":289,"line":351},[764,769,773,778],{"type":40,"tag":287,"props":765,"children":766},{"style":729},[767],{"type":50,"value":768},"        \"push\"",{"type":40,"tag":287,"props":770,"children":771},{"style":720},[772],{"type":50,"value":750},{"type":40,"tag":287,"props":774,"children":775},{"style":505},[776],{"type":50,"value":777},"\"docker push pragmatedev/vitewp-docker-test:latest\"",{"type":40,"tag":287,"props":779,"children":780},{"style":720},[781],{"type":50,"value":760},{"type":40,"tag":287,"props":783,"children":784},{"class":289,"line":360},[785],{"type":40,"tag":287,"props":786,"children":787},{"style":720},[788],{"type":50,"value":789},"    }\n",{"type":40,"tag":287,"props":791,"children":792},{"class":289,"line":368},[793],{"type":40,"tag":287,"props":794,"children":795},{"style":720},[796],{"type":50,"value":797},"}\n",{"type":40,"tag":91,"props":799,"children":800},{},[],{"type":40,"tag":95,"props":802,"children":804},{"id":803},"how-to-use-docker-hub-images-in-bitbucket-pipelines",[805],{"type":50,"value":806},"How to use Docker Hub images in Bitbucket Pipelines?",{"type":40,"tag":46,"props":808,"children":809},{},[810,812,818,820,826],{"type":50,"value":811},"To use the image in your project, open the ",{"type":40,"tag":130,"props":813,"children":815},{"className":814},[],[816],{"type":50,"value":817},"bitbucket-pipelines.yml",{"type":50,"value":819}," file and specify its name in the ",{"type":40,"tag":130,"props":821,"children":823},{"className":822},[],[824],{"type":50,"value":825},"image",{"type":50,"value":827}," key. After committing your changes and triggering the action, it should work fine.",{"type":40,"tag":277,"props":829,"children":834},{"className":830,"code":831,"filename":817,"highlights":832,"language":833,"meta":7,"style":7},"language-yaml shiki shiki-themes one-dark-pro","definitions:\n  steps:\n    - step: &lint\n        name: Lint\n        image: pragmatedev/vitewp-docker-test\n        script:\n          - cd wp-content/themes/footmate\n          - composer install\n          - yarn install\n          - yarn lint\n        caches:\n          - composer\n          - node\n  caches:\n    composer: wp-content/themes/footmate/vendor\n    node: wp-content/themes/footmate/node_modules\n\npipelines:\n  custom:\n    lint:\n      - step: *lint\n  pull-requests:\n    '**':\n      - step: *lint\n",[360],"yaml",[835],{"type":40,"tag":130,"props":836,"children":837},{"__ignoreMap":7},[838,851,863,892,909,928,940,953,965,977,989,1001,1013,1026,1039,1057,1075,1083,1096,1109,1122,1148,1161,1174],{"type":40,"tag":287,"props":839,"children":840},{"class":289,"line":290},[841,846],{"type":40,"tag":287,"props":842,"children":843},{"style":729},[844],{"type":50,"value":845},"definitions",{"type":40,"tag":287,"props":847,"children":848},{"style":720},[849],{"type":50,"value":850},":\n",{"type":40,"tag":287,"props":852,"children":853},{"class":289,"line":333},[854,859],{"type":40,"tag":287,"props":855,"children":856},{"style":729},[857],{"type":50,"value":858},"  steps",{"type":40,"tag":287,"props":860,"children":861},{"style":720},[862],{"type":50,"value":850},{"type":40,"tag":287,"props":864,"children":865},{"class":289,"line":342},[866,871,876,880,886],{"type":40,"tag":287,"props":867,"children":868},{"style":720},[869],{"type":50,"value":870},"    - ",{"type":40,"tag":287,"props":872,"children":873},{"style":729},[874],{"type":50,"value":875},"step",{"type":40,"tag":287,"props":877,"children":878},{"style":720},[879],{"type":50,"value":750},{"type":40,"tag":287,"props":881,"children":883},{"style":882},"--shiki-default:#C678DD",[884],{"type":50,"value":885},"&",{"type":40,"tag":287,"props":887,"children":889},{"style":888},"--shiki-default:#E5C07B",[890],{"type":50,"value":891},"lint\n",{"type":40,"tag":287,"props":893,"children":894},{"class":289,"line":351},[895,900,904],{"type":40,"tag":287,"props":896,"children":897},{"style":729},[898],{"type":50,"value":899},"        name",{"type":40,"tag":287,"props":901,"children":902},{"style":720},[903],{"type":50,"value":750},{"type":40,"tag":287,"props":905,"children":906},{"style":505},[907],{"type":50,"value":908},"Lint\n",{"type":40,"tag":287,"props":910,"children":913},{"class":911,"line":360},[289,912],"highlight",[914,919,923],{"type":40,"tag":287,"props":915,"children":916},{"style":729},[917],{"type":50,"value":918},"        image",{"type":40,"tag":287,"props":920,"children":921},{"style":720},[922],{"type":50,"value":750},{"type":40,"tag":287,"props":924,"children":925},{"style":505},[926],{"type":50,"value":927},"pragmatedev/vitewp-docker-test\n",{"type":40,"tag":287,"props":929,"children":930},{"class":289,"line":368},[931,936],{"type":40,"tag":287,"props":932,"children":933},{"style":729},[934],{"type":50,"value":935},"        script",{"type":40,"tag":287,"props":937,"children":938},{"style":720},[939],{"type":50,"value":850},{"type":40,"tag":287,"props":941,"children":942},{"class":289,"line":377},[943,948],{"type":40,"tag":287,"props":944,"children":945},{"style":720},[946],{"type":50,"value":947},"          - ",{"type":40,"tag":287,"props":949,"children":950},{"style":505},[951],{"type":50,"value":952},"cd wp-content/themes/footmate\n",{"type":40,"tag":287,"props":954,"children":955},{"class":289,"line":386},[956,960],{"type":40,"tag":287,"props":957,"children":958},{"style":720},[959],{"type":50,"value":947},{"type":40,"tag":287,"props":961,"children":962},{"style":505},[963],{"type":50,"value":964},"composer install\n",{"type":40,"tag":287,"props":966,"children":967},{"class":289,"line":394},[968,972],{"type":40,"tag":287,"props":969,"children":970},{"style":720},[971],{"type":50,"value":947},{"type":40,"tag":287,"props":973,"children":974},{"style":505},[975],{"type":50,"value":976},"yarn install\n",{"type":40,"tag":287,"props":978,"children":979},{"class":289,"line":403},[980,984],{"type":40,"tag":287,"props":981,"children":982},{"style":720},[983],{"type":50,"value":947},{"type":40,"tag":287,"props":985,"children":986},{"style":505},[987],{"type":50,"value":988},"yarn lint\n",{"type":40,"tag":287,"props":990,"children":991},{"class":289,"line":411},[992,997],{"type":40,"tag":287,"props":993,"children":994},{"style":729},[995],{"type":50,"value":996},"        caches",{"type":40,"tag":287,"props":998,"children":999},{"style":720},[1000],{"type":50,"value":850},{"type":40,"tag":287,"props":1002,"children":1003},{"class":289,"line":420},[1004,1008],{"type":40,"tag":287,"props":1005,"children":1006},{"style":720},[1007],{"type":50,"value":947},{"type":40,"tag":287,"props":1009,"children":1010},{"style":505},[1011],{"type":50,"value":1012},"composer\n",{"type":40,"tag":287,"props":1014,"children":1016},{"class":289,"line":1015},13,[1017,1021],{"type":40,"tag":287,"props":1018,"children":1019},{"style":720},[1020],{"type":50,"value":947},{"type":40,"tag":287,"props":1022,"children":1023},{"style":505},[1024],{"type":50,"value":1025},"node\n",{"type":40,"tag":287,"props":1027,"children":1029},{"class":289,"line":1028},14,[1030,1035],{"type":40,"tag":287,"props":1031,"children":1032},{"style":729},[1033],{"type":50,"value":1034},"  caches",{"type":40,"tag":287,"props":1036,"children":1037},{"style":720},[1038],{"type":50,"value":850},{"type":40,"tag":287,"props":1040,"children":1042},{"class":289,"line":1041},15,[1043,1048,1052],{"type":40,"tag":287,"props":1044,"children":1045},{"style":729},[1046],{"type":50,"value":1047},"    composer",{"type":40,"tag":287,"props":1049,"children":1050},{"style":720},[1051],{"type":50,"value":750},{"type":40,"tag":287,"props":1053,"children":1054},{"style":505},[1055],{"type":50,"value":1056},"wp-content/themes/footmate/vendor\n",{"type":40,"tag":287,"props":1058,"children":1060},{"class":289,"line":1059},16,[1061,1066,1070],{"type":40,"tag":287,"props":1062,"children":1063},{"style":729},[1064],{"type":50,"value":1065},"    node",{"type":40,"tag":287,"props":1067,"children":1068},{"style":720},[1069],{"type":50,"value":750},{"type":40,"tag":287,"props":1071,"children":1072},{"style":505},[1073],{"type":50,"value":1074},"wp-content/themes/footmate/node_modules\n",{"type":40,"tag":287,"props":1076,"children":1078},{"class":289,"line":1077},17,[1079],{"type":40,"tag":287,"props":1080,"children":1081},{"emptyLinePlaceholder":35},[1082],{"type":50,"value":339},{"type":40,"tag":287,"props":1084,"children":1086},{"class":289,"line":1085},18,[1087,1092],{"type":40,"tag":287,"props":1088,"children":1089},{"style":729},[1090],{"type":50,"value":1091},"pipelines",{"type":40,"tag":287,"props":1093,"children":1094},{"style":720},[1095],{"type":50,"value":850},{"type":40,"tag":287,"props":1097,"children":1099},{"class":289,"line":1098},19,[1100,1105],{"type":40,"tag":287,"props":1101,"children":1102},{"style":729},[1103],{"type":50,"value":1104},"  custom",{"type":40,"tag":287,"props":1106,"children":1107},{"style":720},[1108],{"type":50,"value":850},{"type":40,"tag":287,"props":1110,"children":1112},{"class":289,"line":1111},20,[1113,1118],{"type":40,"tag":287,"props":1114,"children":1115},{"style":729},[1116],{"type":50,"value":1117},"    lint",{"type":40,"tag":287,"props":1119,"children":1120},{"style":720},[1121],{"type":50,"value":850},{"type":40,"tag":287,"props":1123,"children":1125},{"class":289,"line":1124},21,[1126,1131,1135,1139,1144],{"type":40,"tag":287,"props":1127,"children":1128},{"style":720},[1129],{"type":50,"value":1130},"      - ",{"type":40,"tag":287,"props":1132,"children":1133},{"style":729},[1134],{"type":50,"value":875},{"type":40,"tag":287,"props":1136,"children":1137},{"style":720},[1138],{"type":50,"value":750},{"type":40,"tag":287,"props":1140,"children":1141},{"style":882},[1142],{"type":50,"value":1143},"*",{"type":40,"tag":287,"props":1145,"children":1146},{"style":729},[1147],{"type":50,"value":891},{"type":40,"tag":287,"props":1149,"children":1151},{"class":289,"line":1150},22,[1152,1157],{"type":40,"tag":287,"props":1153,"children":1154},{"style":729},[1155],{"type":50,"value":1156},"  pull-requests",{"type":40,"tag":287,"props":1158,"children":1159},{"style":720},[1160],{"type":50,"value":850},{"type":40,"tag":287,"props":1162,"children":1164},{"class":289,"line":1163},23,[1165,1170],{"type":40,"tag":287,"props":1166,"children":1167},{"style":505},[1168],{"type":50,"value":1169},"    '**'",{"type":40,"tag":287,"props":1171,"children":1172},{"style":720},[1173],{"type":50,"value":850},{"type":40,"tag":287,"props":1175,"children":1177},{"class":289,"line":1176},24,[1178,1182,1186,1190,1194],{"type":40,"tag":287,"props":1179,"children":1180},{"style":720},[1181],{"type":50,"value":1130},{"type":40,"tag":287,"props":1183,"children":1184},{"style":729},[1185],{"type":50,"value":875},{"type":40,"tag":287,"props":1187,"children":1188},{"style":720},[1189],{"type":50,"value":750},{"type":40,"tag":287,"props":1191,"children":1192},{"style":882},[1193],{"type":50,"value":1143},{"type":40,"tag":287,"props":1195,"children":1196},{"style":729},[1197],{"type":50,"value":891},{"type":40,"tag":46,"props":1199,"children":1200},{},[1201],{"type":50,"value":1202},"The keyword is \"should.\" In my case, the first attempt did not succeed, but through simple trial and error, I was able to resolve it. I'm aware that your project will have unique elements that cannot be foreseen, so experimentation might be required.",{"type":40,"tag":46,"props":1204,"children":1205},{},[1206],{"type":40,"tag":150,"props":1207,"children":1209},{"alt":152,"src":1208},"https://crm.tentyp.dev/wp-content/uploads/2025/03/83115091-1bdc-47a3-b871-3c768f8378cd.png",[],{"type":40,"tag":46,"props":1211,"children":1212},{},[1213],{"type":50,"value":1214},"I had to implement several additional modifications in the Dockerfile to ensure compatibility in both Bitbucket Pipelines and GitHub Actions. The majority concerned configurations for additional tools. Below is an example of a working image configuration for my project.",{"type":40,"tag":277,"props":1216,"children":1218},{"className":279,"code":1217,"filename":212,"language":281,"meta":7,"style":7},"FROM php:8.2\n\nRUN apt-get update \\\n&& apt-get install -y git zip\n\nRUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \\\n&& apt-get install -y nodejs\n\nRUN npm install --global yarn\n\nRUN curl -sS https://getcomposer.org/installer | php \\\n&& mv composer.phar /usr/local/bin/composer\n\nRUN git config --system --add safe.directory '*'\n\nENV COMPOSER_ALLOW_SUPERUSER=1\n",[1219],{"type":40,"tag":130,"props":1220,"children":1221},{"__ignoreMap":7},[1222,1229,1236,1243,1250,1257,1264,1271,1278,1285,1292,1299,1306,1313,1321,1328],{"type":40,"tag":287,"props":1223,"children":1224},{"class":289,"line":290},[1225],{"type":40,"tag":287,"props":1226,"children":1227},{},[1228],{"type":50,"value":280},{"type":40,"tag":287,"props":1230,"children":1231},{"class":289,"line":333},[1232],{"type":40,"tag":287,"props":1233,"children":1234},{"emptyLinePlaceholder":35},[1235],{"type":50,"value":339},{"type":40,"tag":287,"props":1237,"children":1238},{"class":289,"line":342},[1239],{"type":40,"tag":287,"props":1240,"children":1241},{},[1242],{"type":50,"value":348},{"type":40,"tag":287,"props":1244,"children":1245},{"class":289,"line":351},[1246],{"type":40,"tag":287,"props":1247,"children":1248},{},[1249],{"type":50,"value":357},{"type":40,"tag":287,"props":1251,"children":1252},{"class":289,"line":360},[1253],{"type":40,"tag":287,"props":1254,"children":1255},{"emptyLinePlaceholder":35},[1256],{"type":50,"value":339},{"type":40,"tag":287,"props":1258,"children":1259},{"class":289,"line":368},[1260],{"type":40,"tag":287,"props":1261,"children":1262},{},[1263],{"type":50,"value":374},{"type":40,"tag":287,"props":1265,"children":1266},{"class":289,"line":377},[1267],{"type":40,"tag":287,"props":1268,"children":1269},{},[1270],{"type":50,"value":383},{"type":40,"tag":287,"props":1272,"children":1273},{"class":289,"line":386},[1274],{"type":40,"tag":287,"props":1275,"children":1276},{"emptyLinePlaceholder":35},[1277],{"type":50,"value":339},{"type":40,"tag":287,"props":1279,"children":1280},{"class":289,"line":394},[1281],{"type":40,"tag":287,"props":1282,"children":1283},{},[1284],{"type":50,"value":400},{"type":40,"tag":287,"props":1286,"children":1287},{"class":289,"line":403},[1288],{"type":40,"tag":287,"props":1289,"children":1290},{"emptyLinePlaceholder":35},[1291],{"type":50,"value":339},{"type":40,"tag":287,"props":1293,"children":1294},{"class":289,"line":411},[1295],{"type":40,"tag":287,"props":1296,"children":1297},{},[1298],{"type":50,"value":417},{"type":40,"tag":287,"props":1300,"children":1301},{"class":289,"line":420},[1302],{"type":40,"tag":287,"props":1303,"children":1304},{},[1305],{"type":50,"value":426},{"type":40,"tag":287,"props":1307,"children":1308},{"class":289,"line":1015},[1309],{"type":40,"tag":287,"props":1310,"children":1311},{"emptyLinePlaceholder":35},[1312],{"type":50,"value":339},{"type":40,"tag":287,"props":1314,"children":1315},{"class":289,"line":1028},[1316],{"type":40,"tag":287,"props":1317,"children":1318},{},[1319],{"type":50,"value":1320},"RUN git config --system --add safe.directory '*'\n",{"type":40,"tag":287,"props":1322,"children":1323},{"class":289,"line":1041},[1324],{"type":40,"tag":287,"props":1325,"children":1326},{"emptyLinePlaceholder":35},[1327],{"type":50,"value":339},{"type":40,"tag":287,"props":1329,"children":1330},{"class":289,"line":1059},[1331],{"type":40,"tag":287,"props":1332,"children":1333},{},[1334],{"type":50,"value":1335},"ENV COMPOSER_ALLOW_SUPERUSER=1\n",{"type":40,"tag":91,"props":1337,"children":1338},{},[],{"type":40,"tag":46,"props":1340,"children":1341},{},[1342,1344,1351,1353,1360],{"type":50,"value":1343},"Thank you so much for joining me in today ❤️ Your support means a lot to me, and it keeps me motivated to create more content. If you enjoyed this video, please consider ",{"type":40,"tag":53,"props":1345,"children":1348},{"href":1346,"rel":1347},"https://www.youtube.com/@pragmatedev?sub_confirmation=1",[57],[1349],{"type":50,"value":1350},"subscribing to the channel",{"type":50,"value":1352}," and giving it a thumbs-up - it really helps spread the word. And if you need developers who truly care about quality and delivering great results, visit my company’s site: ",{"type":40,"tag":53,"props":1354,"children":1357},{"href":1355,"rel":1356},"https://coditive.com/?utm_source=www&utm_medium=content&utm_campaign=pragmate_dev",[57],[1358],{"type":50,"value":1359},"coditive.com",{"type":50,"value":1361}," or contact me with the form below. Thanks again and see you next time!",{"type":40,"tag":1363,"props":1364,"children":1365},"style",{},[1366],{"type":50,"value":1367},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":333,"depth":333,"links":1369},[1370,1371,1372,1378],{"id":97,"depth":333,"text":100},{"id":195,"depth":333,"text":198},{"id":452,"depth":333,"text":455,"children":1373},[1374,1375,1376,1377],{"id":469,"depth":342,"text":472},{"id":578,"depth":342,"text":581},{"id":647,"depth":342,"text":650},{"id":675,"depth":342,"text":678},{"id":803,"depth":333,"text":806},"markdown","content:environment:how-to-create-docker-image-on-docker-hub.md","content","environment/how-to-create-docker-image-on-docker-hub.md","environment/how-to-create-docker-image-on-docker-hub","md",[1386,1913,2067,2515,2932,3370],{"_path":1387,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":1388,"description":1389,"head":1390,"tags":1400,"links":1404,"chapters":1407,"created":1399,"thumb":1409,"body":1410,"_type":1379,"_id":1910,"_source":1381,"_file":1911,"_stem":1912,"_extension":1384},"/wordpress/environment/how-lazyness-can-improve-dev-workflow","How laziness can improve your workflow? Automating processes in WordPress","Lazy developers can be a project's secret weapon. By avoiding tedious tasks and focusing on what truly matters, they boost the team's efficiency and ultimately lead to success. So how do they use the power of laziness to improve WordPress workflow? ",{"title":1391,"link":1392,"meta":1395},"How laziness can improve dev workflow? Automating processes in WordPress | pragmate.dev",[1393],{"rel":14,"href":1394},"https://pragmate.dev/wordpress/environment/how-lazyness-can-improve-dev-workflow/",[1396,1397,1398],{"name":18,"content":19},{"name":21,"content":22},{"name":24,"content":1399},"2023-04-01",{"time":1401,"level":31,"stack":1402},"10 min",[1403],"WordPress",{"solution":1405,"github":1406},"#use-cases","https://github.com/przemekhernik/templates/blob/main/bash/wp.sh",[1408],"/wordpress/environment/how-lazyness-can-improve-dev-workflow/","performance",{"type":37,"children":1411,"toc":1902},[1412,1417,1429,1432,1435,1441,1452,1457,1461,1465,1469,1472,1478,1483,1488,1498,1511,1780,1808,1814,1826,1829,1835,1848,1898],{"type":40,"tag":41,"props":1413,"children":1416},{"thumbnail":1414,"url":1415},"https://cdn.pragmate.dev/wp-content/uploads/2023/04/b749ac0f-5bd0-48b1-a5f3-44c9f7a420a6.jpg","https://www.youtube-nocookie.com/embed/6EWxezAVu50",[],{"type":40,"tag":46,"props":1418,"children":1419},{},[1420,1422,1427],{"type":50,"value":1421},"While laziness may seem like a hindrance, lazy developers actually bring immense value to any project. They are always looking for ways to avoid doing repetitive, menial tasks which lead to creative ",{"type":40,"tag":161,"props":1423,"children":1424},{},[1425],{"type":50,"value":1426},"automated solutions",{"type":50,"value":1428},", which then improve team efficiency and save time in the long run. I'll show you how laziness can boost your productivity and allow you to focus on things that matter while building WordPress solutions.",{"type":40,"tag":87,"props":1430,"children":1431},{},[],{"type":40,"tag":91,"props":1433,"children":1434},{},[],{"type":40,"tag":95,"props":1436,"children":1438},{"id":1437},"use-cases",[1439],{"type":50,"value":1440},"Use Cases",{"type":40,"tag":46,"props":1442,"children":1443},{},[1444,1446,1451],{"type":50,"value":1445},"What are typical tasks in my WordPress workflow that are boring and really repetitive for me which I try to automate? ",{"type":40,"tag":161,"props":1447,"children":1448},{},[1449],{"type":50,"value":1450},"Be aware that those scripts are created based on my workflow, so check them carefuly and adjust to your needs if you want to use them",{"type":50,"value":145},{"type":40,"tag":1453,"props":1454,"children":1456},"prose-tile",{"url":1455},"/wordpress/environment/automate-installation",[],{"type":40,"tag":1453,"props":1458,"children":1460},{"url":1459},"/wordpress/environment/automate-database-export",[],{"type":40,"tag":1453,"props":1462,"children":1464},{"url":1463},"/wordpress/environment/automate-database-synchronization",[],{"type":40,"tag":1453,"props":1466,"children":1468},{"url":1467},"/wordpress/environment/automate-database-deployment",[],{"type":40,"tag":91,"props":1470,"children":1471},{},[],{"type":40,"tag":95,"props":1473,"children":1475},{"id":1474},"tools",[1476],{"type":50,"value":1477},"Tools",{"type":40,"tag":46,"props":1479,"children":1480},{},[1481],{"type":50,"value":1482},"There are many possibilities to automate tasks in WordPress depending on yor personal workflow. I'll show you two tools without which I cannot imagine this type of work.",{"type":40,"tag":467,"props":1484,"children":1485},{"id":490},[1486],{"type":50,"value":1487},"Bash",{"type":40,"tag":46,"props":1489,"children":1490},{},[1491,1496],{"type":40,"tag":161,"props":1492,"children":1493},{},[1494],{"type":50,"value":1495},"The easiest way for me is creating simple scripts using Bash.",{"type":50,"value":1497}," It is a command-line shell and scripting language for Unix systems, used to interact with the them by entering commands and executing scripts.",{"type":40,"tag":46,"props":1499,"children":1500},{},[1501,1503,1509],{"type":50,"value":1502},"So I create them using simple and easy-to-read pattern that allows me to fire different tasks just by passing their names as parameters. It reads ",{"type":40,"tag":130,"props":1504,"children":1506},{"className":1505},[],[1507],{"type":50,"value":1508},".env",{"type":50,"value":1510}," file so all project variables are also avaliable there. Maybe that’s nothing fancy but it works nice.",{"type":40,"tag":277,"props":1512,"children":1514},{"className":488,"code":1513,"language":490,"meta":7,"style":7},"#!/bin/bash\n\n# Read and inject variables from .env file\nif [[ ! -f \"./.env\" ]]; then\n  echo \"Missing .env file.\"\nelse\n  export $(grep -v '^#' .env | xargs)\nfi\n\n# Define specic tasks\nfunction task() {\n  echo \"Performing task #1...\"\n}\n\n# Switch statement that fires specific function from parameter\ncase $1 in\n  \"task\")\n    task\n    ;;\nesac\n",[1515],{"type":40,"tag":130,"props":1516,"children":1517},{"__ignoreMap":7},[1518,1527,1534,1542,1581,1594,1602,1650,1658,1665,1673,1691,1703,1710,1717,1725,1744,1756,1764,1772],{"type":40,"tag":287,"props":1519,"children":1520},{"class":289,"line":290},[1521],{"type":40,"tag":287,"props":1522,"children":1524},{"style":1523},"--shiki-default:#7F848E;--shiki-default-font-style:italic",[1525],{"type":50,"value":1526},"#!/bin/bash\n",{"type":40,"tag":287,"props":1528,"children":1529},{"class":289,"line":333},[1530],{"type":40,"tag":287,"props":1531,"children":1532},{"emptyLinePlaceholder":35},[1533],{"type":50,"value":339},{"type":40,"tag":287,"props":1535,"children":1536},{"class":289,"line":342},[1537],{"type":40,"tag":287,"props":1538,"children":1539},{"style":1523},[1540],{"type":50,"value":1541},"# Read and inject variables from .env file\n",{"type":40,"tag":287,"props":1543,"children":1544},{"class":289,"line":351},[1545,1550,1555,1561,1566,1571,1576],{"type":40,"tag":287,"props":1546,"children":1547},{"style":882},[1548],{"type":50,"value":1549},"if",{"type":40,"tag":287,"props":1551,"children":1552},{"style":720},[1553],{"type":50,"value":1554}," [[ ",{"type":40,"tag":287,"props":1556,"children":1558},{"style":1557},"--shiki-default:#56B6C2",[1559],{"type":50,"value":1560},"!",{"type":40,"tag":287,"props":1562,"children":1563},{"style":1557},[1564],{"type":50,"value":1565}," -f",{"type":40,"tag":287,"props":1567,"children":1568},{"style":505},[1569],{"type":50,"value":1570}," \"./.env\"",{"type":40,"tag":287,"props":1572,"children":1573},{"style":720},[1574],{"type":50,"value":1575}," ]]; ",{"type":40,"tag":287,"props":1577,"children":1578},{"style":882},[1579],{"type":50,"value":1580},"then\n",{"type":40,"tag":287,"props":1582,"children":1583},{"class":289,"line":360},[1584,1589],{"type":40,"tag":287,"props":1585,"children":1586},{"style":1557},[1587],{"type":50,"value":1588},"  echo",{"type":40,"tag":287,"props":1590,"children":1591},{"style":505},[1592],{"type":50,"value":1593}," \"Missing .env file.\"\n",{"type":40,"tag":287,"props":1595,"children":1596},{"class":289,"line":368},[1597],{"type":40,"tag":287,"props":1598,"children":1599},{"style":882},[1600],{"type":50,"value":1601},"else\n",{"type":40,"tag":287,"props":1603,"children":1604},{"class":289,"line":377},[1605,1610,1615,1620,1625,1630,1635,1640,1645],{"type":40,"tag":287,"props":1606,"children":1607},{"style":882},[1608],{"type":50,"value":1609},"  export",{"type":40,"tag":287,"props":1611,"children":1612},{"style":720},[1613],{"type":50,"value":1614}," $(",{"type":40,"tag":287,"props":1616,"children":1617},{"style":500},[1618],{"type":50,"value":1619},"grep",{"type":40,"tag":287,"props":1621,"children":1622},{"style":516},[1623],{"type":50,"value":1624}," -v",{"type":40,"tag":287,"props":1626,"children":1627},{"style":505},[1628],{"type":50,"value":1629}," '^#'",{"type":40,"tag":287,"props":1631,"children":1632},{"style":505},[1633],{"type":50,"value":1634}," .env",{"type":40,"tag":287,"props":1636,"children":1637},{"style":720},[1638],{"type":50,"value":1639}," | ",{"type":40,"tag":287,"props":1641,"children":1642},{"style":500},[1643],{"type":50,"value":1644},"xargs",{"type":40,"tag":287,"props":1646,"children":1647},{"style":720},[1648],{"type":50,"value":1649},")\n",{"type":40,"tag":287,"props":1651,"children":1652},{"class":289,"line":386},[1653],{"type":40,"tag":287,"props":1654,"children":1655},{"style":882},[1656],{"type":50,"value":1657},"fi\n",{"type":40,"tag":287,"props":1659,"children":1660},{"class":289,"line":394},[1661],{"type":40,"tag":287,"props":1662,"children":1663},{"emptyLinePlaceholder":35},[1664],{"type":50,"value":339},{"type":40,"tag":287,"props":1666,"children":1667},{"class":289,"line":403},[1668],{"type":40,"tag":287,"props":1669,"children":1670},{"style":1523},[1671],{"type":50,"value":1672},"# Define specic tasks\n",{"type":40,"tag":287,"props":1674,"children":1675},{"class":289,"line":411},[1676,1681,1686],{"type":40,"tag":287,"props":1677,"children":1678},{"style":882},[1679],{"type":50,"value":1680},"function",{"type":40,"tag":287,"props":1682,"children":1683},{"style":500},[1684],{"type":50,"value":1685}," task",{"type":40,"tag":287,"props":1687,"children":1688},{"style":720},[1689],{"type":50,"value":1690},"() {\n",{"type":40,"tag":287,"props":1692,"children":1693},{"class":289,"line":420},[1694,1698],{"type":40,"tag":287,"props":1695,"children":1696},{"style":1557},[1697],{"type":50,"value":1588},{"type":40,"tag":287,"props":1699,"children":1700},{"style":505},[1701],{"type":50,"value":1702}," \"Performing task #1...\"\n",{"type":40,"tag":287,"props":1704,"children":1705},{"class":289,"line":1015},[1706],{"type":40,"tag":287,"props":1707,"children":1708},{"style":720},[1709],{"type":50,"value":797},{"type":40,"tag":287,"props":1711,"children":1712},{"class":289,"line":1028},[1713],{"type":40,"tag":287,"props":1714,"children":1715},{"emptyLinePlaceholder":35},[1716],{"type":50,"value":339},{"type":40,"tag":287,"props":1718,"children":1719},{"class":289,"line":1041},[1720],{"type":40,"tag":287,"props":1721,"children":1722},{"style":1523},[1723],{"type":50,"value":1724},"# Switch statement that fires specific function from parameter\n",{"type":40,"tag":287,"props":1726,"children":1727},{"class":289,"line":1059},[1728,1733,1739],{"type":40,"tag":287,"props":1729,"children":1730},{"style":882},[1731],{"type":50,"value":1732},"case",{"type":40,"tag":287,"props":1734,"children":1736},{"style":1735},"--shiki-default:#E06C75;--shiki-default-font-style:italic",[1737],{"type":50,"value":1738}," $1",{"type":40,"tag":287,"props":1740,"children":1741},{"style":882},[1742],{"type":50,"value":1743}," in\n",{"type":40,"tag":287,"props":1745,"children":1746},{"class":289,"line":1077},[1747,1752],{"type":40,"tag":287,"props":1748,"children":1749},{"style":505},[1750],{"type":50,"value":1751},"  \"task\"",{"type":40,"tag":287,"props":1753,"children":1754},{"style":720},[1755],{"type":50,"value":1649},{"type":40,"tag":287,"props":1757,"children":1758},{"class":289,"line":1085},[1759],{"type":40,"tag":287,"props":1760,"children":1761},{"style":500},[1762],{"type":50,"value":1763},"    task\n",{"type":40,"tag":287,"props":1765,"children":1766},{"class":289,"line":1098},[1767],{"type":40,"tag":287,"props":1768,"children":1769},{"style":720},[1770],{"type":50,"value":1771},"    ;;\n",{"type":40,"tag":287,"props":1773,"children":1774},{"class":289,"line":1111},[1775],{"type":40,"tag":287,"props":1776,"children":1777},{"style":882},[1778],{"type":50,"value":1779},"esac\n",{"type":40,"tag":46,"props":1781,"children":1782},{},[1783,1785,1791,1793,1799,1801,1807],{"type":50,"value":1784},"To perform the operations in the ",{"type":40,"tag":130,"props":1786,"children":1788},{"className":1787},[],[1789],{"type":50,"value":1790},"task",{"type":50,"value":1792}," function I just need to use ",{"type":40,"tag":130,"props":1794,"children":1796},{"className":1795},[],[1797],{"type":50,"value":1798},"wp.sh",{"type":50,"value":1800}," script and pass task name as parameter: ",{"type":40,"tag":130,"props":1802,"children":1804},{"className":1803},[],[1805],{"type":50,"value":1806},"./wp.sh task",{"type":50,"value":145},{"type":40,"tag":467,"props":1809,"children":1811},{"id":1810},"wp-cli",[1812],{"type":50,"value":1813},"WP CLI",{"type":40,"tag":46,"props":1815,"children":1816},{},[1817,1824],{"type":40,"tag":53,"props":1818,"children":1821},{"href":1819,"rel":1820},"https://developer.wordpress.org/cli/commands/",[57],[1822],{"type":50,"value":1823},"WP-CLI",{"type":50,"value":1825}," is a must-have for automating things in WordPress. It's a command-line tool that allows to manage WordPress using a terminal. It can perform many types of tasks, such as updating plugins and themes, creating new posts and pages, managing users and many many more.",{"type":40,"tag":91,"props":1827,"children":1828},{},[],{"type":40,"tag":95,"props":1830,"children":1832},{"id":1831},"notes",[1833],{"type":50,"value":1834},"Notes",{"type":40,"tag":46,"props":1836,"children":1837},{},[1838,1840,1846],{"type":50,"value":1839},"If you want to use full version of the script analyzed in this example, feel free to check out ",{"type":40,"tag":53,"props":1841,"children":1843},{"href":1406,"rel":1842},[57],[1844],{"type":50,"value":1845},"GitHub",{"type":50,"value":1847}," or just use the command below to download it and make executable. Enjoy!",{"type":40,"tag":277,"props":1849,"children":1851},{"className":488,"code":1850,"language":490,"meta":7,"style":7},"curl https://raw.githubusercontent.com/przemekhernik/templates/main/bash/wp.sh -o wp.sh && chmod 744 wp.sh\n",[1852],{"type":40,"tag":130,"props":1853,"children":1854},{"__ignoreMap":7},[1855],{"type":40,"tag":287,"props":1856,"children":1857},{"class":289,"line":290},[1858,1863,1868,1873,1878,1883,1888,1893],{"type":40,"tag":287,"props":1859,"children":1860},{"style":500},[1861],{"type":50,"value":1862},"curl",{"type":40,"tag":287,"props":1864,"children":1865},{"style":505},[1866],{"type":50,"value":1867}," https://raw.githubusercontent.com/przemekhernik/templates/main/bash/wp.sh",{"type":40,"tag":287,"props":1869,"children":1870},{"style":516},[1871],{"type":50,"value":1872}," -o",{"type":40,"tag":287,"props":1874,"children":1875},{"style":505},[1876],{"type":50,"value":1877}," wp.sh",{"type":40,"tag":287,"props":1879,"children":1880},{"style":720},[1881],{"type":50,"value":1882}," && ",{"type":40,"tag":287,"props":1884,"children":1885},{"style":500},[1886],{"type":50,"value":1887},"chmod",{"type":40,"tag":287,"props":1889,"children":1890},{"style":516},[1891],{"type":50,"value":1892}," 744",{"type":40,"tag":287,"props":1894,"children":1895},{"style":505},[1896],{"type":50,"value":1897}," wp.sh\n",{"type":40,"tag":1363,"props":1899,"children":1900},{},[1901],{"type":50,"value":1367},{"title":7,"searchDepth":333,"depth":333,"links":1903},[1904,1905,1909],{"id":1437,"depth":333,"text":1440},{"id":1474,"depth":333,"text":1477,"children":1906},[1907,1908],{"id":490,"depth":342,"text":1487},{"id":1810,"depth":342,"text":1813},{"id":1831,"depth":333,"text":1834},"content:wordpress:environment:how-lazyness-can-improve-dev-workflow.md","wordpress/environment/how-lazyness-can-improve-dev-workflow.md","wordpress/environment/how-lazyness-can-improve-dev-workflow",{"_path":1914,"_dir":1409,"_draft":6,"_partial":6,"_locale":7,"title":1915,"description":1916,"head":1917,"tags":1927,"links":1930,"chapters":1932,"created":1926,"thumb":1409,"body":1934,"_type":1379,"_id":2064,"_source":1381,"_file":2065,"_stem":2066,"_extension":1384},"/wordpress/performance/newrelic","Boost WordPress Performance with New Relic","New Relic is a cloud-based platform that helps monitor and troubleshoot software applications, including WordPress. How to use it power to boost performance?",{"title":1918,"link":1919,"meta":1922},"Boost WordPress Performance with New Relic | pragmate.dev",[1920],{"rel":14,"href":1921},"https://pragmate.dev/wordpress/performance/newrelic/",[1923,1924,1925],{"name":18,"content":19},{"name":21,"content":22},{"name":24,"content":1926},"2023-03-31",{"time":30,"level":31,"stack":1928},[1403,1929],"Environment",{"solution":1931},"#how-it-might-help",[1933],"/wordpress/performance/newrelic/",{"type":37,"children":1935,"toc":2059},[1936,1942,1956,1961,1966,1969,1975,1989,2001,2005,2014,2017,2023,2028,2054],{"type":40,"tag":95,"props":1937,"children":1939},{"id":1938},"what-is-new-relic",[1940],{"type":50,"value":1941},"What is New Relic?",{"type":40,"tag":46,"props":1943,"children":1944},{},[1945,1947,1954],{"type":50,"value":1946},"With ",{"type":40,"tag":53,"props":1948,"children":1951},{"href":1949,"rel":1950},"https://newrelic.com/platform/application-monitoring",[57],[1952],{"type":50,"value":1953},"New Relic",{"type":50,"value":1955},", you can gain real-time visibility into the performance and health of your application, including metrics like response times, error rates, and throughput. You can also track user behavior and identify potential issues before they impact your users.",{"type":40,"tag":46,"props":1957,"children":1958},{},[1959],{"type":50,"value":1960},"Additionally, New Relic can help you optimize your system by providing insights into code-level performance, database queries, and external service dependencies. It can also help you troubleshoot issues by providing detailed transaction traces and error analytics.",{"type":40,"tag":1962,"props":1963,"children":1965},"prose-gallery",{":items":1964},"[\"https://cdn.pragmate.dev/wp-content/uploads/2023/03/ca8c864f-edba-4a94-b783-2425d515af0c.png\",\"https://cdn.pragmate.dev/wp-content/uploads/2023/03/b8da1442-91a5-44ab-a59a-d75408d2cf13.png\"]",[],{"type":40,"tag":91,"props":1967,"children":1968},{},[],{"type":40,"tag":95,"props":1970,"children":1972},{"id":1971},"how-it-might-help",[1973],{"type":50,"value":1974},"How it might help?",{"type":40,"tag":46,"props":1976,"children":1977},{},[1978,1980,1987],{"type":50,"value":1979},"Last time at ",{"type":40,"tag":53,"props":1981,"children":1984},{"href":1982,"rel":1983},"https://coditive.com/services/",[57],[1985],{"type":50,"value":1986},"coditive_",{"type":50,"value":1988}," we were experiencing slow page load times in one of the WordPress projects, which was impacting user experience and causing clients frustration. By using New Relic, we were able to identify and diagnose performance issues in the code and database queries.",{"type":40,"tag":46,"props":1990,"children":1991},{},[1992,1994,1999],{"type":50,"value":1993},"We optimized the system, made some changes to the code, and saw a significant improvement in page load times (",{"type":40,"tag":161,"props":1995,"children":1996},{},[1997],{"type":50,"value":1998},"improvement from 1.6s response time with a huge traffic to ~500ms",{"type":50,"value":2000},"). With New Relic's real-time monitoring and diagnostic tools, we were able to quickly pinpoint and resolve the issues that were causing slow performance, which helped us to maintain a positive user experience and keep our visitors engaged.",{"type":40,"tag":1962,"props":2002,"children":2004},{":items":2003},"[\"https://cdn.pragmate.dev/wp-content/uploads/2023/03/66cb95c9-42bb-4c22-bfb3-39cf71a9faf2.png\"]",[],{"type":40,"tag":2006,"props":2007,"children":2008},"blockquote",{},[2009],{"type":40,"tag":46,"props":2010,"children":2011},{},[2012],{"type":50,"value":2013},"It helped us to show how problematic Yoast might be when it comes to large applications that provide a huge number pf posts. Most of the demanding queries are related to the sitemap generation feature :(",{"type":40,"tag":91,"props":2015,"children":2016},{},[],{"type":40,"tag":95,"props":2018,"children":2020},{"id":2019},"summary",[2021],{"type":50,"value":2022},"Summary",{"type":40,"tag":46,"props":2024,"children":2025},{},[2026],{"type":50,"value":2027},"Overall, New Relic is a powerful tool for WordPress developers and administrators who want to ensure the performance, scalability, and reliability of their applications. It provides many integrations, but there are two that I've used:",{"type":40,"tag":2029,"props":2030,"children":2031},"ul",{},[2032,2043],{"type":40,"tag":540,"props":2033,"children":2034},{},[2035,2037],{"type":50,"value":2036},"Kinsta: ",{"type":40,"tag":53,"props":2038,"children":2041},{"href":2039,"rel":2040},"https://kinsta.com/docs/custom-new-relic-tracking/",[57],[2042],{"type":50,"value":2039},{"type":40,"tag":540,"props":2044,"children":2045},{},[2046,2048],{"type":50,"value":2047},"WP Engine: ",{"type":40,"tag":53,"props":2049,"children":2052},{"href":2050,"rel":2051},"https://wpengine.com/support/new-relic-dashboard/",[57],[2053],{"type":50,"value":2050},{"type":40,"tag":46,"props":2055,"children":2056},{},[2057],{"type":50,"value":2058},"New Relic is a must-have for developers who work with large WordPress applications where performance plays a key role and each query counts.",{"title":7,"searchDepth":333,"depth":333,"links":2060},[2061,2062,2063],{"id":1938,"depth":333,"text":1941},{"id":1971,"depth":333,"text":1974},{"id":2019,"depth":333,"text":2022},"content:wordpress:performance:newrelic.md","wordpress/performance/newrelic.md","wordpress/performance/newrelic",{"_path":2068,"_dir":2069,"_draft":6,"_partial":6,"_locale":7,"title":2070,"description":2071,"head":2072,"tags":2082,"chapters":2085,"links":2087,"created":2081,"thumb":2089,"body":2090,"_type":1379,"_id":2512,"_source":1381,"_file":2513,"_stem":2514,"_extension":1384},"/wordpress/do-you-need-plugins","wordpress","WordPress Plugins: Do you need them at all?","Plugins are one of the best and worst things in the WordPress ecosystem. They can increase development experience and also decrease to the lowest level. They can make us happy, and cry. So should we use them?",{"title":2073,"link":2074,"meta":2077},"WordPress Plugins: Do you need them at all? | pragmate.dev",[2075],{"rel":14,"href":2076},"https://pragmate.dev/wordpress/do-you-need-plugins/",[2078,2079,2080],{"name":18,"content":19},{"name":21,"content":22},{"name":24,"content":2081},"2023-03-25",{"time":1401,"level":2083,"stack":2084},"Medium",[1403],[2086],"/wordpress/do-you-need-plugins/",{"solution":2088},"#how-to-decide-about-plugins-usage","components",{"type":37,"children":2091,"toc":2498},[2092,2097,2102,2137,2140,2143,2149,2157,2162,2167,2179,2183,2188,2199,2203,2206,2212,2217,2222,2232,2236,2248,2265,2268,2274,2284,2289,2293,2298,2341,2351,2354,2360,2365,2371,2376,2382,2387,2393,2398,2404,2409,2415,2420,2423,2429,2434,2444,2467,2470,2474,2486],{"type":40,"tag":41,"props":2093,"children":2096},{"thumbnail":2094,"url":2095},"https://cdn.pragmate.dev/wp-content/uploads/2023/03/f3f55362-21b6-496e-8acf-9f7bda702ad8.jpg","https://www.youtube-nocookie.com/embed/fAnteWiniB0",[],{"type":40,"tag":46,"props":2098,"children":2099},{},[2100],{"type":50,"value":2101},"Plugins are like magical tools that can make your website do amazing things. They help you add cool features and make your website look and work just the way you want. But using plugins isn't always easy – you need to know when and how to use them.",{"type":40,"tag":46,"props":2103,"children":2104},{},[2105,2107,2113,2114,2120,2122,2128,2130,2135],{"type":50,"value":2106},"In this article, I'll explain the ",{"type":40,"tag":53,"props":2108,"children":2110},{"href":2109},"#what-is-clean-architecture",[2111],{"type":50,"value":2112},"idea of clean architecture",{"type":50,"value":62},{"type":40,"tag":53,"props":2115,"children":2117},{"href":2116},"#how-architecture-impacts-your-business",[2118],{"type":50,"value":2119},"how it affects your business",{"type":50,"value":2121},". I'll help you figure out ",{"type":40,"tag":53,"props":2123,"children":2125},{"href":2124},"#when-plugins-might-be-a-bad-choice",[2126],{"type":50,"value":2127},"when plugins might not be the best choice",{"type":50,"value":2129}," and give you practical tips on deciding ",{"type":40,"tag":53,"props":2131,"children":2132},{"href":2088},[2133],{"type":50,"value":2134},"when to use them",{"type":50,"value":2136},". By the end, you'll know how to use them in a way that will make your life easier, not harder.",{"type":40,"tag":87,"props":2138,"children":2139},{},[],{"type":40,"tag":91,"props":2141,"children":2142},{},[],{"type":40,"tag":95,"props":2144,"children":2146},{"id":2145},"what-is-clean-architecture",[2147],{"type":50,"value":2148},"What is Clean Architecture?",{"type":40,"tag":2006,"props":2150,"children":2151},{},[2152],{"type":40,"tag":46,"props":2153,"children":2154},{},[2155],{"type":50,"value":2156},"Software architecture is all about the direction of dependencies.",{"type":40,"tag":46,"props":2158,"children":2159},{},[2160],{"type":50,"value":2161},"Let's assume that you're building a house where you spend the rest of your life. You want to have the ability to choose and use solutions that match your requirements, your expectations and which are not dependent on anyone else but you.",{"type":40,"tag":46,"props":2163,"children":2164},{},[2165],{"type":50,"value":2166},"You probably don’t want to change the layout of your kitchen  (the core) due to the Fridge X (implementation detail) that doesn’t fit. You’ll just find the fridge that will fit there. Of course, sometimes you will have to find a compromise, but mostly you’ll want to do it in your style.",{"type":40,"tag":46,"props":2168,"children":2169},{},[2170,2172,2177],{"type":50,"value":2171},"That's an example of the clean architecture of your life: ",{"type":40,"tag":161,"props":2173,"children":2174},{},[2175],{"type":50,"value":2176},"You're in the centre. Everything else is around this.",{"type":50,"value":2178}," Why it is good architecture? Because the dependencies are directed in correct way - towards things that are most important.",{"type":40,"tag":1962,"props":2180,"children":2182},{":items":2181},"[\"https://cdn.pragmate.dev/wp-content/uploads/2023/03/9c1bbb84-33e4-4a98-a056-ce9061375a1e.png\"]",[],{"type":40,"tag":46,"props":2184,"children":2185},{},[2186],{"type":50,"value":2187},"And the same approach should be used when you build applications that solve your business problems. Your problems, your needs and your requirements should be at the centre with the highest possible independence level. Plugins are just implementation details so you probably don’t want to change your business needs because external solution requires this.",{"type":40,"tag":46,"props":2189,"children":2190},{},[2191,2193,2198],{"type":50,"value":2192},"So if your business needs are at the centre, ",{"type":40,"tag":161,"props":2194,"children":2195},{},[2196],{"type":50,"value":2197},"you should build solutions around your then rather than around plugins",{"type":50,"value":145},{"type":40,"tag":1962,"props":2200,"children":2202},{":items":2201},"[\"https://cdn.pragmate.dev/wp-content/uploads/2023/03/b744eb5d-21f2-468c-8745-916d2e7f9013.png\"]",[],{"type":40,"tag":91,"props":2204,"children":2205},{},[],{"type":40,"tag":95,"props":2207,"children":2209},{"id":2208},"how-architecture-impacts-your-business",[2210],{"type":50,"value":2211},"How architecture impacts your business?",{"type":40,"tag":46,"props":2213,"children":2214},{},[2215],{"type":50,"value":2216},"Let's say you're building a hotel room reservation system for a client. The client's business needs are simple - guests should be able to reserve a room and select the number of people in their party. You decide to use a free plugin that provides this basic functionality.",{"type":40,"tag":46,"props":2218,"children":2219},{},[2220],{"type":50,"value":2221},"However, as the client's business grows, you realize that you need to offer more customized features, such as different pricing for adults and children, and the ability to restrict bookings during holiday seasons on certain weekends. Unfortunately, the plugin you used doesn't support them, and modifying behaviour without altering its core files is difficult.",{"type":40,"tag":46,"props":2223,"children":2224},{},[2225,2230],{"type":40,"tag":161,"props":2226,"children":2227},{},[2228],{"type":50,"value":2229},"As a result, you start adding more and more business features on top of the plugin to fit your client's needs and after a short time, you've become too reliant on it.",{"type":50,"value":2231}," Let’s assume that the author decides to switch to a paid license, which costs $1000 per week. Since the system is now heavily dependent on the plugin, there is no choice but to pay the fee. The worst-case scenario happens when the author abandons the plugin, leaving your business without updates.",{"type":40,"tag":1962,"props":2233,"children":2235},{":items":2234},"[\"https://cdn.pragmate.dev/wp-content/uploads/2023/03/6be058fd-a853-4189-973a-94d5befb0804.png\"]",[],{"type":40,"tag":46,"props":2237,"children":2238},{},[2239,2241,2246],{"type":50,"value":2240},"This example highlights the biggest problem with plugins. ",{"type":40,"tag":161,"props":2242,"children":2243},{},[2244],{"type":50,"value":2245},"You are dependent on someone else's work and decisions, which can potentially harm your client's business.",{"type":50,"value":2247}," If the plugin author implements faulty changes, the business will suffer. If there is a data leak due to poor security, the business might be impacted as well.",{"type":40,"tag":46,"props":2249,"children":2250},{},[2251,2253,2258,2260],{"type":50,"value":2252},"In other words, ",{"type":40,"tag":161,"props":2254,"children":2255},{},[2256],{"type":50,"value":2257},"the business needs should be at the centre of your software development strategy, not plugins",{"type":50,"value":2259},". By building solutions that match business needs, you gain more control over the outcome and ensure that your business is not dependent on the decisions of others. ",{"type":40,"tag":161,"props":2261,"children":2262},{},[2263],{"type":50,"value":2264},"The business is at the centre, and your software should reflect that.",{"type":40,"tag":91,"props":2266,"children":2267},{},[],{"type":40,"tag":95,"props":2269,"children":2271},{"id":2270},"when-plugins-might-be-a-bad-choice",[2272],{"type":50,"value":2273},"When plugins might be a bad choice?",{"type":40,"tag":46,"props":2275,"children":2276},{},[2277,2279],{"type":50,"value":2278},"Using plugins in your projects can be a tempting shortcut, but it's important to understand the potential risks it entails when the system grows. ",{"type":40,"tag":161,"props":2280,"children":2281},{},[2282],{"type":50,"value":2283},"While those can add useful features and save development time, they can also make the system difficult to modify or generate more unexpected problems over time.",{"type":40,"tag":46,"props":2285,"children":2286},{},[2287],{"type":50,"value":2288},"Of course, it's unlikely that you can completely avoid external dependencies, but you can try to minimize the system's reliance on any of them. In my experience, many projects that have relied heavily on plugins have encountered scalability and flexibility issues as they have grown.",{"type":40,"tag":1962,"props":2290,"children":2292},{":items":2291},"[\"https://cdn.pragmate.dev/wp-content/uploads/2023/03/63e8cafb-3fda-492a-9019-45747c17b0d7.png\"]",[],{"type":40,"tag":46,"props":2294,"children":2295},{},[2296],{"type":50,"value":2297},"You might think using popular plugins won't harm your system, but I used to believe the same until I experienced the issues they can cause, even for simple tasks. So, here are the top reasons why I avoid using plugins:",{"type":40,"tag":536,"props":2299,"children":2300},{},[2301,2311,2321,2331],{"type":40,"tag":540,"props":2302,"children":2303},{},[2304,2309],{"type":40,"tag":161,"props":2305,"children":2306},{},[2307],{"type":50,"value":2308},"Database Optimization",{"type":50,"value":2310},": The plugin works well with a small database, but when it grows, it becomes unusable even in the simplest things. Example: Yoast",{"type":40,"tag":540,"props":2312,"children":2313},{},[2314,2319],{"type":40,"tag":161,"props":2315,"children":2316},{},[2317],{"type":50,"value":2318},"User first, developer second",{"type":50,"value":2320},": Plugins are overloaded with many features that you mostly won’t use. With features that look instead of work well. Example: Ninja Forms",{"type":40,"tag":540,"props":2322,"children":2323},{},[2324,2329],{"type":40,"tag":161,"props":2325,"children":2326},{},[2327],{"type":50,"value":2328},"Front-end Optimization",{"type":50,"value":2330},": Most of the plugins load tons of CSS and JS that are slightly used. Those loads tons of code for providing super simple things.",{"type":40,"tag":540,"props":2332,"children":2333},{},[2334,2339],{"type":40,"tag":161,"props":2335,"children":2336},{},[2337],{"type":50,"value":2338},"UX",{"type":50,"value":2340},": The plugins are something that make dashboard hell when it comes to UX. Tons of notifications, widgets, columns, different settings layouts what makes clients lost there.",{"type":40,"tag":46,"props":2342,"children":2343},{},[2344,2349],{"type":40,"tag":161,"props":2345,"children":2346},{},[2347],{"type":50,"value":2348},"To reduce these problems, it's important to prioritize business rules by creating the most crucial parts as custom solutions to match exact needs and using plugins as tools rather than the foundation of your solution.",{"type":50,"value":2350}," It is important to design the system in a way that allows changing plugins without touching your core business requirements.",{"type":40,"tag":91,"props":2352,"children":2353},{},[],{"type":40,"tag":95,"props":2355,"children":2357},{"id":2356},"how-to-decide-about-plugins-usage",[2358],{"type":50,"value":2359},"How to decide about plugins usage?",{"type":40,"tag":46,"props":2361,"children":2362},{},[2363],{"type":50,"value":2364},"I don't want to say \"don't use plugins at all\" because I don't mean this. You can use them as much as you want. But please always be mindful of their potential impact on your project, and always weigh up the benefits against the risks. So how to decide when and when not to use plugins in your app? I’ve created five rules that help me in this.",{"type":40,"tag":467,"props":2366,"children":2368},{"id":2367},"_1-focus-on-the-business",[2369],{"type":50,"value":2370},"#1 Focus on the Business.",{"type":40,"tag":46,"props":2372,"children":2373},{},[2374],{"type":50,"value":2375},"Try to build the system around your business rules rather than plugins. If the booking is the most crucial part of your success put more money and effort and build a booking calendar from scratch. It will be easier to make changes when the business grows. Do not try to hack plugin behaviour to fit your business requirements all it takes. If you need to do this in the first stages you can be sure that it will become even worse when the project grows.",{"type":40,"tag":467,"props":2377,"children":2379},{"id":2378},"_2-avoid-plugins-as-default-choice-approach",[2380],{"type":50,"value":2381},"#2 Avoid \"plugins as default choice\" approach.",{"type":40,"tag":46,"props":2383,"children":2384},{},[2385],{"type":50,"value":2386},"Try to implement some requirements yourself especially when those are really simple. It ensures that the code does only things that are really needed and that’s super useful when things don’t go as planned. There is no need to install a plugin for adding GTM when you can do it yourself even simpler in the code.",{"type":40,"tag":467,"props":2388,"children":2390},{"id":2389},"_3-have-a-clear-logic-reason-for-using-plugins",[2391],{"type":50,"value":2392},"#3 Have a clear logic reason for using plugins.",{"type":40,"tag":46,"props":2394,"children":2395},{},[2396],{"type":50,"value":2397},"It is good to use plugin-driven development when building MVP because quality is less important than time. It is also fine to use plugins that you really trust. But if you install a plugin without putting any effort to check how can you do it yourself - the reason is laziness - that’s wrong.",{"type":40,"tag":467,"props":2399,"children":2401},{"id":2400},"_4-be-responsible-for-your-decisions",[2402],{"type":50,"value":2403},"#4 Be responsible for your decisions.",{"type":40,"tag":46,"props":2405,"children":2406},{},[2407],{"type":50,"value":2408},"If you recommend using a plugin for a specific feature - you’re responsible for this no matter if someone else has created it. You can’t clear yourself in case of problems blaming mainly plugin X. Client is not interested in it if you recommended and decided to use it.",{"type":40,"tag":467,"props":2410,"children":2412},{"id":2411},"_5-use-plugin-as-tools",[2413],{"type":50,"value":2414},"#5 Use plugin as tools.",{"type":40,"tag":46,"props":2416,"children":2417},{},[2418],{"type":50,"value":2419},"If you use plugins, try to use them in a way that will allow easy switching when something changes. Try to use some of SOLID principles as your weapon.",{"type":40,"tag":91,"props":2421,"children":2422},{},[],{"type":40,"tag":95,"props":2424,"children":2426},{"id":2425},"what-will-you-get-in-return",[2427],{"type":50,"value":2428},"What will you get in return?",{"type":40,"tag":46,"props":2430,"children":2431},{},[2432],{"type":50,"value":2433},"Adopting a new approach can be overwhelming, especially in the beginning when costs may seem excessive. This is because many elements need to be developed from scratch, resulting in a higher price point. Moreover, the WP market is filled with cheap alternatives that implies plugins and poor architecture, allowing them to complete tasks much cheaper. While it's true that WP competition is high, but… Just try!",{"type":40,"tag":46,"props":2435,"children":2436},{},[2437,2442],{"type":40,"tag":161,"props":2438,"children":2439},{},[2440],{"type":50,"value":2441},"Create your own workflow, use the KISS principle, collect ideas, and snippets, build your components library, improve them with every project and make things easier over time.",{"type":50,"value":2443}," After a few projects, you’ll have building blocks that you’ll be able to create highly scalable and plugin-free architecture.  As a result, you get the following items:",{"type":40,"tag":536,"props":2445,"children":2446},{},[2447,2452,2457,2462],{"type":40,"tag":540,"props":2448,"children":2449},{},[2450],{"type":50,"value":2451},"Business rules are less dependent on external factors.",{"type":40,"tag":540,"props":2453,"children":2454},{},[2455],{"type":50,"value":2456},"You’re not responsible for someone’s else work.",{"type":40,"tag":540,"props":2458,"children":2459},{},[2460],{"type":50,"value":2461},"Your system is better prepared to change.",{"type":40,"tag":540,"props":2463,"children":2464},{},[2465],{"type":50,"value":2466},"You can sleep better.",{"type":40,"tag":91,"props":2468,"children":2469},{},[],{"type":40,"tag":95,"props":2471,"children":2472},{"id":2019},[2473],{"type":50,"value":2022},{"type":40,"tag":46,"props":2475,"children":2476},{},[2477,2479,2484],{"type":50,"value":2478},"Building projects without relying heavily on plugins has been a game-changer for me. It has simplified development and sped up the process, but ",{"type":40,"tag":161,"props":2480,"children":2481},{},[2482],{"type":50,"value":2483},"it has also improved a sense of responsibility in me and my team",{"type":50,"value":2485},". Clients appreciate this approach and it has helped us gain their trust.",{"type":40,"tag":46,"props":2487,"children":2488},{},[2489,2491,2496],{"type":50,"value":2490},"Don't get me wrong, ",{"type":40,"tag":161,"props":2492,"children":2493},{},[2494],{"type":50,"value":2495},"plugins have their place",{"type":50,"value":2497},", but minimizing their usage and being mindful of their impact can make all the difference in building scalable, big and successful projects.",{"title":7,"searchDepth":333,"depth":333,"links":2499},[2500,2501,2502,2503,2510,2511],{"id":2145,"depth":333,"text":2148},{"id":2208,"depth":333,"text":2211},{"id":2270,"depth":333,"text":2273},{"id":2356,"depth":333,"text":2359,"children":2504},[2505,2506,2507,2508,2509],{"id":2367,"depth":342,"text":2370},{"id":2378,"depth":342,"text":2381},{"id":2389,"depth":342,"text":2392},{"id":2400,"depth":342,"text":2403},{"id":2411,"depth":342,"text":2414},{"id":2425,"depth":333,"text":2428},{"id":2019,"depth":333,"text":2022},"content:wordpress:do-you-need-plugins.md","wordpress/do-you-need-plugins.md","wordpress/do-you-need-plugins",{"_path":2516,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":2517,"description":2518,"head":2519,"tags":2529,"links":2530,"chapters":2532,"created":2528,"body":2534,"_type":1379,"_id":2929,"_source":1381,"_file":2930,"_stem":2931,"_extension":1384},"/environment/homebrew","How to use Homebrew to improve your development workflow?","One of the biggest problems when using MAMP as a local environment for WordPress projects is the risk that I need to pay for non-identical environments. How Homebrew allows to pay less?",{"title":2520,"link":2521,"meta":2524},"How to use Homebrew to improve your development workflow? | pragmate.dev",[2522],{"rel":14,"href":2523},"https://pragmate.dev/environment/homebrew/",[2525,2526,2527],{"name":18,"content":19},{"name":21,"content":22},{"name":24,"content":2528},"2023-03-09",{"time":1401,"level":31},{"solution":2531},"#solution",[2533],"/environment/homebrew/",{"type":37,"children":2535,"toc":2920},[2536,2541,2546,2549,2552,2558,2580,2585,2588,2594,2599,2612,2617,2620,2626,2631,2637,2642,2704,2709,2715,2720,2758,2764,2769,2903,2906,2911,2916],{"type":40,"tag":41,"props":2537,"children":2540},{"thumbnail":2538,"url":2539},"https://cdn.pragmate.dev/wp-content/uploads/2023/03/4be23198-d859-4ba2-aa85-3ef8fb05e342.jpg.webp","https://www.youtube-nocookie.com/embed/oYvCC9qiXDo",[],{"type":40,"tag":46,"props":2542,"children":2543},{},[2544],{"type":50,"value":2545},"I'll tell the story of how I had to pay for this first time, and how a pint of a beer can help you in similar cases. I promise - it won't make you drunk!",{"type":40,"tag":87,"props":2547,"children":2548},{},[],{"type":40,"tag":91,"props":2550,"children":2551},{},[],{"type":40,"tag":95,"props":2553,"children":2555},{"id":2554},"when-homebrew-is-useful",[2556],{"type":50,"value":2557},"When Homebrew is useful?",{"type":40,"tag":46,"props":2559,"children":2560},{},[2561,2563,2570,2572,2578],{"type":50,"value":2562},"It was a few years ago when I had to work on a ",{"type":40,"tag":53,"props":2564,"children":2567},{"href":2565,"rel":2566},"https://www.shopware.com/en/",[57],[2568],{"type":50,"value":2569},"Shopware",{"type":50,"value":2571}," project. Many things there just didn’t work as they should - for example the Docker image that was recommended choice. No matter how hard I tried it just didn’t want to work correctly on my machine as well as on several others. Finally, due to a lack of experience in this, I’ve decided to skip Docker and use my ",{"type":40,"tag":53,"props":2573,"children":2575},{"href":2574},"/wordpress/environment/mamp-installation/",[2576],{"type":50,"value":2577},"default stack for the local environment",{"type":50,"value":2579}," - MAMP.",{"type":40,"tag":46,"props":2581,"children":2582},{},[2583],{"type":50,"value":2584},"However, during the advanced stage of development (almost the most important), I was unable to import the database from the server to my local environment due to slightly different versions (long story short). Although this may not have been an issue in most cases, the Shopware database was complex, making it a significant problem. Unfortunately, MAMP Pro didn't allow me to switch MySQL versions, so I had to find an alternative solution that won't break other projects. This is a classic problem of isolation that arises when not using Docker. Fortunately, I discovered how powerful Homebrew is.",{"type":40,"tag":91,"props":2586,"children":2587},{},[],{"type":40,"tag":95,"props":2589,"children":2591},{"id":2590},"what-is-homebrew",[2592],{"type":50,"value":2593},"What is Homebrew?",{"type":40,"tag":46,"props":2595,"children":2596},{},[2597],{"type":50,"value":2598},"Homebrew is a command-line package manager for MacOS. It is a great tool for developers who need to manage multiple environments or work with different versions of command line tools.",{"type":40,"tag":536,"props":2600,"children":2601},{},[2602,2607],{"type":40,"tag":540,"props":2603,"children":2604},{},[2605],{"type":50,"value":2606},"It allows creating and managing isolated environments for different projects, without having to worry about conflicts between different versions of dependencies.",{"type":40,"tag":540,"props":2608,"children":2609},{},[2610],{"type":50,"value":2611},"It allows installing and managing multiple versions of the same packages or switching between them as needed.",{"type":40,"tag":46,"props":2613,"children":2614},{},[2615],{"type":50,"value":2616},"There is no need now to know how to install MySQL, PHP, Ruby, Python, GIT, and Yarn and check the documentation for every one of them - Homebrew does this for me. I request and I get what I need. That’s something that I expect from the software.",{"type":40,"tag":91,"props":2618,"children":2619},{},[],{"type":40,"tag":95,"props":2621,"children":2623},{"id":2622},"how-to-use-homebrew",[2624],{"type":50,"value":2625},"How to use Homebrew?",{"type":40,"tag":46,"props":2627,"children":2628},{},[2629],{"type":50,"value":2630},"So how to use the power of Homebrew to boost your productivity?",{"type":40,"tag":467,"props":2632,"children":2634},{"id":2633},"mysql-how-to-run-mysql-using-homebrew",[2635],{"type":50,"value":2636},"MySQL | How to run MySQL using Homebrew?",{"type":40,"tag":46,"props":2638,"children":2639},{},[2640],{"type":50,"value":2641},"I use MySQL 5.7 for most of the projects because that's the version that is by default available in MAMP. Let's assume that it is an incorrect version for the Shopware project because I need to have 8.0. So how to run this version using Homebrew and solve my problems with Shopware?",{"type":40,"tag":277,"props":2643,"children":2645},{"className":488,"code":2644,"language":490,"meta":7,"style":7},"brew install mysql\nbrew link mysql\nbrew services start mysql\n",[2646],{"type":40,"tag":130,"props":2647,"children":2648},{"__ignoreMap":7},[2649,2667,2683],{"type":40,"tag":287,"props":2650,"children":2651},{"class":289,"line":290},[2652,2657,2662],{"type":40,"tag":287,"props":2653,"children":2654},{"style":500},[2655],{"type":50,"value":2656},"brew",{"type":40,"tag":287,"props":2658,"children":2659},{"style":505},[2660],{"type":50,"value":2661}," install",{"type":40,"tag":287,"props":2663,"children":2664},{"style":505},[2665],{"type":50,"value":2666}," mysql\n",{"type":40,"tag":287,"props":2668,"children":2669},{"class":289,"line":333},[2670,2674,2679],{"type":40,"tag":287,"props":2671,"children":2672},{"style":500},[2673],{"type":50,"value":2656},{"type":40,"tag":287,"props":2675,"children":2676},{"style":505},[2677],{"type":50,"value":2678}," link",{"type":40,"tag":287,"props":2680,"children":2681},{"style":505},[2682],{"type":50,"value":2666},{"type":40,"tag":287,"props":2684,"children":2685},{"class":289,"line":342},[2686,2690,2695,2700],{"type":40,"tag":287,"props":2687,"children":2688},{"style":500},[2689],{"type":50,"value":2656},{"type":40,"tag":287,"props":2691,"children":2692},{"style":505},[2693],{"type":50,"value":2694}," services",{"type":40,"tag":287,"props":2696,"children":2697},{"style":505},[2698],{"type":50,"value":2699}," start",{"type":40,"tag":287,"props":2701,"children":2702},{"style":505},[2703],{"type":50,"value":2666},{"type":40,"tag":46,"props":2705,"children":2706},{},[2707],{"type":50,"value":2708},"It's super simple. I need to find and install the package I need (#1), create a symlink (#2) and start MySQL service (#3). That's all! Then I can import the database I need without any problem and with no impact on other projects that I had on my machine.",{"type":40,"tag":467,"props":2710,"children":2712},{"id":2711},"php-how-to-switch-php-version",[2713],{"type":50,"value":2714},"PHP | How to switch PHP version?",{"type":40,"tag":46,"props":2716,"children":2717},{},[2718],{"type":50,"value":2719},"Another frequent case that I need to handle is switching PHP version.",{"type":40,"tag":277,"props":2721,"children":2723},{"className":488,"code":2722,"language":490,"meta":7,"style":7},"brew install php@5.6\nbrew link php@5.6\n",[2724],{"type":40,"tag":130,"props":2725,"children":2726},{"__ignoreMap":7},[2727,2743],{"type":40,"tag":287,"props":2728,"children":2729},{"class":289,"line":290},[2730,2734,2738],{"type":40,"tag":287,"props":2731,"children":2732},{"style":500},[2733],{"type":50,"value":2656},{"type":40,"tag":287,"props":2735,"children":2736},{"style":505},[2737],{"type":50,"value":2661},{"type":40,"tag":287,"props":2739,"children":2740},{"style":505},[2741],{"type":50,"value":2742}," php@5.6\n",{"type":40,"tag":287,"props":2744,"children":2745},{"class":289,"line":333},[2746,2750,2754],{"type":40,"tag":287,"props":2747,"children":2748},{"style":500},[2749],{"type":50,"value":2656},{"type":40,"tag":287,"props":2751,"children":2752},{"style":505},[2753],{"type":50,"value":2678},{"type":40,"tag":287,"props":2755,"children":2756},{"style":505},[2757],{"type":50,"value":2742},{"type":40,"tag":467,"props":2759,"children":2761},{"id":2760},"format-how-to-install-libraries-after-format",[2762],{"type":50,"value":2763},"Format | How to install libraries after format?",{"type":40,"tag":46,"props":2765,"children":2766},{},[2767],{"type":50,"value":2768},"It's so easy that I use it for installing almost all additional libraries on my Mac. Yarn, Composer Node, WP CLI - most of the libraries that I often use can be easily installed without spending time searching docs of each library. That’s something that I like a lot.",{"type":40,"tag":277,"props":2770,"children":2772},{"className":488,"code":2771,"language":490,"meta":7,"style":7},"brew install php\nbrew install mysql\nbrew install git\nbrew install node\nbrew install composer\nbrew install yarn\nbrew install mailhog\nbrew install wp-cli\n",[2773],{"type":40,"tag":130,"props":2774,"children":2775},{"__ignoreMap":7},[2776,2792,2807,2823,2839,2855,2871,2887],{"type":40,"tag":287,"props":2777,"children":2778},{"class":289,"line":290},[2779,2783,2787],{"type":40,"tag":287,"props":2780,"children":2781},{"style":500},[2782],{"type":50,"value":2656},{"type":40,"tag":287,"props":2784,"children":2785},{"style":505},[2786],{"type":50,"value":2661},{"type":40,"tag":287,"props":2788,"children":2789},{"style":505},[2790],{"type":50,"value":2791}," php\n",{"type":40,"tag":287,"props":2793,"children":2794},{"class":289,"line":333},[2795,2799,2803],{"type":40,"tag":287,"props":2796,"children":2797},{"style":500},[2798],{"type":50,"value":2656},{"type":40,"tag":287,"props":2800,"children":2801},{"style":505},[2802],{"type":50,"value":2661},{"type":40,"tag":287,"props":2804,"children":2805},{"style":505},[2806],{"type":50,"value":2666},{"type":40,"tag":287,"props":2808,"children":2809},{"class":289,"line":342},[2810,2814,2818],{"type":40,"tag":287,"props":2811,"children":2812},{"style":500},[2813],{"type":50,"value":2656},{"type":40,"tag":287,"props":2815,"children":2816},{"style":505},[2817],{"type":50,"value":2661},{"type":40,"tag":287,"props":2819,"children":2820},{"style":505},[2821],{"type":50,"value":2822}," git\n",{"type":40,"tag":287,"props":2824,"children":2825},{"class":289,"line":351},[2826,2830,2834],{"type":40,"tag":287,"props":2827,"children":2828},{"style":500},[2829],{"type":50,"value":2656},{"type":40,"tag":287,"props":2831,"children":2832},{"style":505},[2833],{"type":50,"value":2661},{"type":40,"tag":287,"props":2835,"children":2836},{"style":505},[2837],{"type":50,"value":2838}," node\n",{"type":40,"tag":287,"props":2840,"children":2841},{"class":289,"line":360},[2842,2846,2850],{"type":40,"tag":287,"props":2843,"children":2844},{"style":500},[2845],{"type":50,"value":2656},{"type":40,"tag":287,"props":2847,"children":2848},{"style":505},[2849],{"type":50,"value":2661},{"type":40,"tag":287,"props":2851,"children":2852},{"style":505},[2853],{"type":50,"value":2854}," composer\n",{"type":40,"tag":287,"props":2856,"children":2857},{"class":289,"line":368},[2858,2862,2866],{"type":40,"tag":287,"props":2859,"children":2860},{"style":500},[2861],{"type":50,"value":2656},{"type":40,"tag":287,"props":2863,"children":2864},{"style":505},[2865],{"type":50,"value":2661},{"type":40,"tag":287,"props":2867,"children":2868},{"style":505},[2869],{"type":50,"value":2870}," yarn\n",{"type":40,"tag":287,"props":2872,"children":2873},{"class":289,"line":377},[2874,2878,2882],{"type":40,"tag":287,"props":2875,"children":2876},{"style":500},[2877],{"type":50,"value":2656},{"type":40,"tag":287,"props":2879,"children":2880},{"style":505},[2881],{"type":50,"value":2661},{"type":40,"tag":287,"props":2883,"children":2884},{"style":505},[2885],{"type":50,"value":2886}," mailhog\n",{"type":40,"tag":287,"props":2888,"children":2889},{"class":289,"line":386},[2890,2894,2898],{"type":40,"tag":287,"props":2891,"children":2892},{"style":500},[2893],{"type":50,"value":2656},{"type":40,"tag":287,"props":2895,"children":2896},{"style":505},[2897],{"type":50,"value":2661},{"type":40,"tag":287,"props":2899,"children":2900},{"style":505},[2901],{"type":50,"value":2902}," wp-cli\n",{"type":40,"tag":91,"props":2904,"children":2905},{},[],{"type":40,"tag":46,"props":2907,"children":2908},{},[2909],{"type":50,"value":2910},"Finally, this simple package manager helped me save the rest of the hair on my head while working on Shopware. It helped me to pay almost nothing for the risk that I took initially using MAMP. I've managed to finish a problematic project without exposing the client to additional costs.",{"type":40,"tag":46,"props":2912,"children":2913},{},[2914],{"type":50,"value":2915},"So, if you as me, sticking to simple local servers like MAMP and troubleshooting environment configurations or finding a tool that allows for ruling and managing other tools - Homebrew may be the solution. Of course, Homebrew doesn't replace the power of Docker, but it's a useful alternative nonetheless.",{"type":40,"tag":1363,"props":2917,"children":2918},{},[2919],{"type":50,"value":1367},{"title":7,"searchDepth":333,"depth":333,"links":2921},[2922,2923,2924],{"id":2554,"depth":333,"text":2557},{"id":2590,"depth":333,"text":2593},{"id":2622,"depth":333,"text":2625,"children":2925},[2926,2927,2928],{"id":2633,"depth":342,"text":2636},{"id":2711,"depth":342,"text":2714},{"id":2760,"depth":342,"text":2763},"content:environment:homebrew.md","environment/homebrew.md","environment/homebrew",{"_path":2933,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":2934,"description":2935,"head":2936,"tags":2946,"links":2948,"chapters":2950,"created":2945,"body":2951,"_type":1379,"_id":3367,"_source":1381,"_file":3368,"_stem":3369,"_extension":1384},"/wordpress/environment/mamp-installation","The power of simplicity: How to setup WordPress with MAMP","How to simply and quickly create a local environment for WordPress? Why don't I choose more modern solutions?",{"title":2937,"link":2938,"meta":2941},"The power of simplicity: How to setup WordPress with MAMP | pragmate.dev",[2939],{"rel":14,"href":2940},"https://pragmate.dev/wordpress/environment/mamp-installation/",[2942,2943,2944],{"name":18,"content":19},{"name":21,"content":22},{"name":24,"content":2945},"2023-03-01",{"time":30,"level":31,"stack":2947},[1403],{"solution":2949},"#how-to-install-wordpress",[2574],{"type":37,"children":2952,"toc":3357},[2953,2958,2970,2973,2976,2982,2987,3031,3053,3056,3062,3082,3088,3139,3144,3150,3183,3186,3192,3258,3262,3265,3271,3276,3280,3330,3335,3338,3342,3347,3352],{"type":40,"tag":46,"props":2954,"children":2955},{},[2956],{"type":50,"value":2957},"I like simplicity. I just like it in many aspects, not only related to work, but also in communication and overall approach to life. Usually, I first try to look for the simplest solutions that allow me to feel safe in a given situation and understand what is really happening, and only then do I look for more complex options that will help me develop.",{"type":40,"tag":46,"props":2959,"children":2960},{},[2961,2963,2969],{"type":50,"value":2962},"Even if I make a mistake, I will make it when everything seems to be simple, and that's important, especially when learning something new. That's exactly what happened with the choice of one of the simplest yet most valuable tools for me, which is ",{"type":40,"tag":130,"props":2964,"children":2966},{"className":2965},[],[2967],{"type":50,"value":2968},"MAMP",{"type":50,"value":145},{"type":40,"tag":87,"props":2971,"children":2972},{},[],{"type":40,"tag":91,"props":2974,"children":2975},{},[],{"type":40,"tag":95,"props":2977,"children":2979},{"id":2978},"what-are-the-wordpress-requirements",[2980],{"type":50,"value":2981},"What are the WordPress requirements?",{"type":40,"tag":46,"props":2983,"children":2984},{},[2985],{"type":50,"value":2986},"Let's start by analyzing what we really need for work, that is, what are the system requirements needed to install WordPress? Honestly, I admit that there aren't many of them and they're not too high.",{"type":40,"tag":2029,"props":2988,"children":2989},{},[2990,3002,3014,3026],{"type":40,"tag":540,"props":2991,"children":2992},{},[2993,3000],{"type":40,"tag":53,"props":2994,"children":2997},{"href":2995,"rel":2996},"https://make.wordpress.org/hosting/handbook/server-environment/#web-server",[57],[2998],{"type":50,"value":2999},"WebServer",{"type":50,"value":3001},": Apache / nginx",{"type":40,"tag":540,"props":3003,"children":3004},{},[3005,3012],{"type":40,"tag":53,"props":3006,"children":3009},{"href":3007,"rel":3008},"https://make.wordpress.org/hosting/handbook/server-environment/#php",[57],[3010],{"type":50,"value":3011},"PHP",{"type":50,"value":3013},": >= 7.4",{"type":40,"tag":540,"props":3015,"children":3016},{},[3017,3024],{"type":40,"tag":53,"props":3018,"children":3021},{"href":3019,"rel":3020},"https://make.wordpress.org/hosting/handbook/server-environment/#database",[57],[3022],{"type":50,"value":3023},"Database",{"type":50,"value":3025},": MySQL / MariaDB",{"type":40,"tag":540,"props":3027,"children":3028},{},[3029],{"type":50,"value":3030},"HTTPS (recommended)",{"type":40,"tag":46,"props":3032,"children":3033},{},[3034,3036,3042,3044,3051],{"type":50,"value":3035},"Most hosting services can easily handle these requirements by default, and if for some reason you need to provide more specific details, they are all described in ",{"type":40,"tag":53,"props":3037,"children":3039},{"href":2995,"rel":3038},[57],[3040],{"type":50,"value":3041},"this place",{"type":50,"value":3043},". Pay particular attention to the section on ",{"type":40,"tag":53,"props":3045,"children":3048},{"href":3046,"rel":3047},"https://make.wordpress.org/hosting/handbook/server-environment/#php-extensions",[57],[3049],{"type":50,"value":3050},"PHP extensions",{"type":50,"value":3052},", which are important for everything to work properly.",{"type":40,"tag":91,"props":3054,"children":3055},{},[],{"type":40,"tag":95,"props":3057,"children":3059},{"id":3058},"mamp-as-a-local-environment-for-wordpress",[3060],{"type":50,"value":3061},"MAMP as a local environment for WordPress",{"type":40,"tag":46,"props":3063,"children":3064},{},[3065,3071,3073,3080],{"type":40,"tag":53,"props":3066,"children":3069},{"href":3067,"rel":3068},"https://www.mamp.info/en/mamp-pro/mac/",[57],[3070],{"type":50,"value":2968},{"type":50,"value":3072}," is a simple solution that allows for easy setup of a local environment based on the popular ",{"type":40,"tag":53,"props":3074,"children":3077},{"href":3075,"rel":3076},"https://en.wikipedia.org/wiki/LAMP_software_bundle",[57],[3078],{"type":50,"value":3079},"LAMP",{"type":50,"value":3081}," (Linux, Apache, MySQL, PHP) stack, and by default, it meets the previously described requirements. Creating a new infrastructure for WordPress is extremely easy and boils down to just a few clicks, without the need for specialized knowledge in server management.",{"type":40,"tag":467,"props":3083,"children":3085},{"id":3084},"pros",[3086],{"type":50,"value":3087},"Pros",{"type":40,"tag":2029,"props":3089,"children":3090},{},[3091,3101,3111],{"type":40,"tag":540,"props":3092,"children":3093},{},[3094,3099],{"type":40,"tag":161,"props":3095,"children":3096},{},[3097],{"type":50,"value":3098},"Simplicity",{"type":50,"value":3100},": Minimal configuration such as creating a host, enabling SSL support, or changing the PHP version usually only requires a few clicks while still allowing for greater configurations if needed.",{"type":40,"tag":540,"props":3102,"children":3103},{},[3104,3109],{"type":40,"tag":161,"props":3105,"children":3106},{},[3107],{"type":50,"value":3108},"Transparency",{"type":50,"value":3110},": The user interface is focused on what's most important. It displays only a few of the most necessary options by default, and if we want to do something more, we switch to expert mode and voila - we can change things as we like!",{"type":40,"tag":540,"props":3112,"children":3113},{},[3114,3119,3121,3128,3130,3137],{"type":40,"tag":161,"props":3115,"children":3116},{},[3117],{"type":50,"value":3118},"Plug&Play",{"type":50,"value":3120},": By default, it provides many useful tools that we can simply enable if we need them. Want to use ",{"type":40,"tag":53,"props":3122,"children":3125},{"href":3123,"rel":3124},"https://github.com/mailhog/MailHog",[57],[3126],{"type":50,"value":3127},"Mailhog",{"type":50,"value":3129},"? Just turn it on. ",{"type":40,"tag":53,"props":3131,"children":3134},{"href":3132,"rel":3133},"https://xdebug.org/",[57],[3135],{"type":50,"value":3136},"Xdebug",{"type":50,"value":3138},"? Check the box in the settings. SSL? Check one box and it's done.",{"type":40,"tag":46,"props":3140,"children":3141},{},[3142],{"type":50,"value":3143},"I must mention the mentoring benefits. Because of its simplicity, it's just faster and easier to focus on specifics when teaching young developers how to use WordPress, rather than on details and why our Docker isn't working properly. The solution simply works for everyone.",{"type":40,"tag":467,"props":3145,"children":3147},{"id":3146},"cons",[3148],{"type":50,"value":3149},"Cons",{"type":40,"tag":2029,"props":3151,"children":3152},{},[3153,3163,3173],{"type":40,"tag":540,"props":3154,"children":3155},{},[3156,3161],{"type":40,"tag":161,"props":3157,"children":3158},{},[3159],{"type":50,"value":3160},"Izolation",{"type":50,"value":3162},": Or rather, the lack of it. This environment is rather global and besides a few basic settings for a specific host, we won't be able to do much. It's not a solution for those who require full environment compliance or those who have many diverse projects requiring different configurations.",{"type":40,"tag":540,"props":3164,"children":3165},{},[3166,3171],{"type":40,"tag":161,"props":3167,"children":3168},{},[3169],{"type":50,"value":3170},"Scalability",{"type":50,"value":3172},": Or rather, the lack of it. This solution is not suitable for projects with more advanced architecture. I wouldn't rely on it for microservices.",{"type":40,"tag":540,"props":3174,"children":3175},{},[3176,3181],{"type":40,"tag":161,"props":3177,"children":3178},{},[3179],{"type":50,"value":3180},"Optimization",{"type":50,"value":3182},": In the vast majority of cases, the local server works fast, but more advanced systems with very large databases can slow down.",{"type":40,"tag":91,"props":3184,"children":3185},{},[],{"type":40,"tag":95,"props":3187,"children":3189},{"id":3188},"how-to-install-mamp",[3190],{"type":50,"value":3191},"How to install MAMP?",{"type":40,"tag":46,"props":3193,"children":3194},{},[3195,3197,3204,3206,3213,3215,3221,3223,3229,3231,3237,3239,3244,3246,3250,3251,3256],{"type":50,"value":3196},"We download the software from the ",{"type":40,"tag":53,"props":3198,"children":3201},{"href":3199,"rel":3200},"https://www.mamp.info/en/downloads/",[57],[3202],{"type":50,"value":3203},"producer's website",{"type":50,"value":3205},", buy a license, and install it. For less demanding users, there is a ",{"type":40,"tag":53,"props":3207,"children":3210},{"href":3208,"rel":3209},"https://www.mamp.info/en/mamp/mac/",[57],[3211],{"type":50,"value":3212},"free option",{"type":50,"value":3214}," with limited capabilities. After starting, I recommend setting the default ports in the ",{"type":40,"tag":130,"props":3216,"children":3218},{"className":3217},[],[3219],{"type":50,"value":3220},"Ports & User",{"type":50,"value":3222}," section, selecting ",{"type":40,"tag":3224,"props":3225,"children":3226},"em",{},[3227],{"type":50,"value":3228},"Allow network access to MySQL only for this Mac",{"type":50,"value":3230}," in the ",{"type":40,"tag":130,"props":3232,"children":3234},{"className":3233},[],[3235],{"type":50,"value":3236},"MySQL",{"type":50,"value":3238}," section, and choosing ",{"type":40,"tag":3224,"props":3240,"children":3241},{},[3242],{"type":50,"value":3243},"CGI",{"type":50,"value":3245}," mode and turning on ",{"type":40,"tag":3224,"props":3247,"children":3248},{},[3249],{"type":50,"value":3136},{"type":50,"value":3230},{"type":40,"tag":130,"props":3252,"children":3254},{"className":3253},[],[3255],{"type":50,"value":3011},{"type":50,"value":3257}," section.",{"type":40,"tag":1962,"props":3259,"children":3261},{":items":3260},"[\"https://cdn.pragmate.dev/wp-content/uploads/2023/03/f51a8026-4bd4-4d85-a90f-27071de511ff.jpg\",\"https://cdn.pragmate.dev/wp-content/uploads/2023/03/4bb961cf-7c9e-4f81-a7db-771eeb8daa7f.jpg\",\"https://cdn.pragmate.dev/wp-content/uploads/2023/03/fa0841db-8e3c-494b-b245-c5b9c8caac15.jpg\"]",[],{"type":40,"tag":91,"props":3263,"children":3264},{},[],{"type":40,"tag":95,"props":3266,"children":3268},{"id":3267},"how-to-install-wordpress",[3269],{"type":50,"value":3270},"How to install WordPress?",{"type":40,"tag":46,"props":3272,"children":3273},{},[3274],{"type":50,"value":3275},"How to configure a local server and launch a new WordPress instance using MAMP Pro? The process is simple and consists of a few steps:",{"type":40,"tag":1962,"props":3277,"children":3279},{":items":3278},"[\"https://cdn.pragmate.dev/wp-content/uploads/2023/03/a6629d3c-18d1-4dcf-8c1c-6504f6076208.jpg\",\"https://cdn.pragmate.dev/wp-content/uploads/2023/03/1ccaddc2-2e6d-4fc3-9247-d408952f5c21.jpg\",\"https://cdn.pragmate.dev/wp-content/uploads/2023/03/72a2e2b2-1ad9-4713-a2ce-6c8d1521c9b3.jpg\",\"https://cdn.pragmate.dev/wp-content/uploads/2023/03/c73a72e1-a476-4042-af26-d8799227790d.jpg\",\"https://cdn.pragmate.dev/wp-content/uploads/2023/03/07b8f66e-5c6b-425c-aff1-596378c2ad0f.jpg\"]",[],{"type":40,"tag":536,"props":3281,"children":3282},{},[3283,3288,3293,3298,3303,3308,3320,3325],{"type":40,"tag":540,"props":3284,"children":3285},{},[3286],{"type":50,"value":3287},"Create a new host using the \"+\" button at the bottom of the interface.",{"type":40,"tag":540,"props":3289,"children":3290},{},[3291],{"type":50,"value":3292},"Set up a test domain.",{"type":40,"tag":540,"props":3294,"children":3295},{},[3296],{"type":50,"value":3297},"Select \"Generate SSL\" option.",{"type":40,"tag":540,"props":3299,"children":3300},{},[3301],{"type":50,"value":3302},"Choose the main directory for the project.",{"type":40,"tag":540,"props":3304,"children":3305},{},[3306],{"type":50,"value":3307},"Select the PHP version you want to use in the \"General\" tab.",{"type":40,"tag":540,"props":3309,"children":3310},{},[3311,3318],{"type":40,"tag":53,"props":3312,"children":3315},{"href":3313,"rel":3314},"https://wordpress.org/download/",[57],[3316],{"type":50,"value":3317},"Download",{"type":50,"value":3319}," WordPress files and upload them to the selected directory.",{"type":40,"tag":540,"props":3321,"children":3322},{},[3323],{"type":50,"value":3324},"Create a new database in the \"Database\" tab.",{"type":40,"tag":540,"props":3326,"children":3327},{},[3328],{"type":50,"value":3329},"Save the settings, start the server, and open the website.",{"type":40,"tag":46,"props":3331,"children":3332},{},[3333],{"type":50,"value":3334},"We have configured our local environment and are ready to proceed with the installation process.",{"type":40,"tag":91,"props":3336,"children":3337},{},[],{"type":40,"tag":95,"props":3339,"children":3340},{"id":2019},[3341],{"type":50,"value":2022},{"type":40,"tag":46,"props":3343,"children":3344},{},[3345],{"type":50,"value":3346},"Can you use MAMP in your project? Analyzing the advantages and disadvantages, the answer is: it depends. In my case, it was suitable for most of the WordPress-based websites I worked on, even the more advanced ones. It was rare for something not to work, and the risk associated with non-uniform project environments usually paid off.",{"type":40,"tag":46,"props":3348,"children":3349},{},[3350],{"type":50,"value":3351},"I assume that many hardcore programmers will consider this approach outdated and unacceptable due to its drawbacks. I am also aware of the consequences of using a less scalable and non-isolated environment, but it simply works for me.",{"type":40,"tag":46,"props":3353,"children":3354},{},[3355],{"type":50,"value":3356},"Learning about Docker's capabilities and ways of creating an environment is one of my learning goals, but not right now. At the moment, I value simplicity and reliability more, especially regarding topics that I am not well-versed in. That is why MAMP PRO is my default choice.",{"title":7,"searchDepth":333,"depth":333,"links":3358},[3359,3360,3364,3365,3366],{"id":2978,"depth":333,"text":2981},{"id":3058,"depth":333,"text":3061,"children":3361},[3362,3363],{"id":3084,"depth":342,"text":3087},{"id":3146,"depth":342,"text":3149},{"id":3188,"depth":333,"text":3191},{"id":3267,"depth":333,"text":3270},{"id":2019,"depth":333,"text":2022},"content:wordpress:environment:mamp-installation.md","wordpress/environment/mamp-installation.md","wordpress/environment/mamp-installation",{"_path":3371,"_dir":2069,"_draft":6,"_partial":6,"_locale":7,"title":3372,"description":3373,"head":3374,"tags":3384,"chapters":3386,"created":3383,"thumb":3388,"body":3389,"_type":1379,"_id":3693,"_source":1381,"_file":3694,"_stem":3695,"_extension":1384},"/wordpress/why-not-to-use","Why not use WordPress? Top 5 negatively overhyped opinions.","There are plenty of reasons discussed in the web community for not developing WordPress. But... I can't entirely agree with many of them. What are my top 5 most malicious opinions about WordPress and why I don't agree with them?",{"title":3375,"link":3376,"meta":3379},"Why not use WordPress? Top 5 negatively overhyped opinions. | pragmate.dev",[3377],{"rel":14,"href":3378},"https://pragmate.dev/wordpress/why-not-to-use/",[3380,3381,3382],{"name":18,"content":19},{"name":21,"content":22},{"name":24,"content":3383},"2023-02-21",{"time":30,"level":31,"stack":3385},[1403],[3387],"/wordpress/why-not-to-use/","hack",{"type":37,"children":3390,"toc":3686},[3391,3397,3405,3417,3454,3465,3470,3480,3483,3489,3497,3502,3507,3528,3545,3550,3553,3559,3567,3577,3582,3587,3597,3600,3606,3614,3626,3631,3639,3644,3647,3653,3661,3666,3670,3675],{"type":40,"tag":95,"props":3392,"children":3394},{"id":3393},"_1-performance",[3395],{"type":50,"value":3396},"#1 Performance",{"type":40,"tag":2006,"props":3398,"children":3399},{},[3400],{"type":40,"tag":46,"props":3401,"children":3402},{},[3403],{"type":50,"value":3404},"WordPress is slow.",{"type":40,"tag":46,"props":3406,"children":3407},{},[3408,3410,3415],{"type":50,"value":3409},"Most common as well as most annoying. I’ve been already working on many optimisation cases and believe me - most of them lead to one simple conclusion. ",{"type":40,"tag":161,"props":3411,"children":3412},{},[3413],{"type":50,"value":3414},"The software does what we tell them to do so if WordPress is slow, that's because someone has forced it to do so.",{"type":50,"value":3416}," This can be caused by a number of factors, but there are three most common:",{"type":40,"tag":2029,"props":3418,"children":3419},{},[3420,3432,3443],{"type":40,"tag":540,"props":3421,"children":3422},{},[3423,3425,3430],{"type":50,"value":3424},"“",{"type":40,"tag":161,"props":3426,"children":3427},{},[3428],{"type":50,"value":3429},"Plugin Driven Development",{"type":50,"value":3431},"” - There are already plugins for everything and that’s something that many developers like most. Need to implement multilingual for e-commerce that has 5 products? Let’s use WPML. Security concerns? Let’s use WordFence. Facebook sharing button? Plugin! Of course, it must be the one that provides 80 other sharing buttons that we won’t ever use.",{"type":40,"tag":540,"props":3433,"children":3434},{},[3435,3436,3441],{"type":50,"value":3424},{"type":40,"tag":161,"props":3437,"children":3438},{},[3439],{"type":50,"value":3440},"What the eyes don’t see, the heart doesn’t regret",{"type":50,"value":3442},"” - Querying database 10 000 times in one template? What’s the problem? Installing 15 huge visual dependencies for something that we can do from scratch with a small effort? Sounds fine. Responsive images? Who needs them?",{"type":40,"tag":540,"props":3444,"children":3445},{},[3446,3447,3452],{"type":50,"value":3424},{"type":40,"tag":161,"props":3448,"children":3449},{},[3450],{"type":50,"value":3451},"I need everything",{"type":50,"value":3453},"” Need to make money? Let’s add as many ads as possible. Let's also add Hotjar, Facebook Pixel, Google Optimize and 10 other tracking scripts because SEO company said that's required.",{"type":40,"tag":46,"props":3455,"children":3456},{},[3457,3459,3464],{"type":50,"value":3458},"There is nothing wrong if they happen for achieving a specific goal. For example, when we build MVP so time and price are more important than quality. I also don't want to say that we should not use any external solutions at all. If we use only carefully selected solutions that are really needed and do not slow down the system - that's ok. Unfortunately, in most cases, ",{"type":40,"tag":161,"props":3460,"children":3461},{},[3462],{"type":50,"value":3463},"someone didn't want to think about the consequences and do their job well so as a result of using the techniques described above they get a system slow by default",{"type":50,"value":145},{"type":40,"tag":46,"props":3466,"children":3467},{},[3468],{"type":50,"value":3469},"Due to this, the optimization process became the process of digging in a big ball of mud and removing tons of plugins whose features are used maybe 20%, rewriting major theme parts, optimizing database queries and reducing the number of external visual libraries or external integrations. Those processes should be taken care of from the beginning of development, not when the page is deployed and the client has already paid.",{"type":40,"tag":46,"props":3471,"children":3472},{},[3473,3475],{"type":50,"value":3474},"When someone deliberately forces the site to do more than it can handle, such as running too many plugins or customizations that are not optimized for performance - we can't be surprised that the system works slowly. And complaining about such cases is super annoying because it’s blaming something that  is completely in our hands. It’s like blaming Fiat 500 for driving slowly if someone filled it with 500 kg of weight. ",{"type":40,"tag":161,"props":3476,"children":3477},{},[3478],{"type":50,"value":3479},"That’s our fault that we don’t think about what we’re doing, not WordPress.",{"type":40,"tag":91,"props":3481,"children":3482},{},[],{"type":40,"tag":95,"props":3484,"children":3486},{"id":3485},"_2-security",[3487],{"type":50,"value":3488},"#2 Security",{"type":40,"tag":2006,"props":3490,"children":3491},{},[3492],{"type":40,"tag":46,"props":3493,"children":3494},{},[3495],{"type":50,"value":3496},"WordPress is not secure.",{"type":40,"tag":46,"props":3498,"children":3499},{},[3500],{"type":50,"value":3501},"While it is true that WordPress may be less secure by default due to its open-source nature, I do believe that it can be secure enough to allow us to feel confident about our website's security. It's also true that many WordPress pages have experienced malware attacks, but this is not surprising given that more than 40% of websites use this CMS.",{"type":40,"tag":46,"props":3503,"children":3504},{},[3505],{"type":50,"value":3506},"In my experience, many \"hacking\" cases are often caused by careless or reckless behaviour. For example, once a large website that was supposed to be \"strongly secured with plugins\" was hacked because it shared FTP with smaller pages that no one bothered to secure. Another incident occurred because of a \"no need to change passwords\" policy, and yet another because of using numerous untested plugins.",{"type":40,"tag":46,"props":3508,"children":3509},{},[3510,3512,3518,3520,3526],{"type":50,"value":3511},"If we rely too heavily on plugins for everything, we may be less secure, as there is more code that may contain security vulnerabilities. Similarly, if we do not change passwords frequently or set inappropriate directory permissions because someone somewhere wrote that ",{"type":40,"tag":130,"props":3513,"children":3515},{"className":3514},[],[3516],{"type":50,"value":3517},"777",{"type":50,"value":3519}," permissions should solve our issue with the plugin ",{"type":40,"tag":130,"props":3521,"children":3523},{"className":3522},[],[3524],{"type":50,"value":3525},"X",{"type":50,"value":3527},", we risk making our website less secure.",{"type":40,"tag":46,"props":3529,"children":3530},{},[3531,3536,3538,3543],{"type":40,"tag":161,"props":3532,"children":3533},{},[3534],{"type":50,"value":3535},"Ultimately, the level of security of our website depends on our actions, regardless of the CMS we use.",{"type":50,"value":3537}," Our house also might be insecure if we won’t take attention to this.  Installing a security plugin and then setting directory privileges to ",{"type":40,"tag":130,"props":3539,"children":3541},{"className":3540},[],[3542],{"type":50,"value":3517},{"type":50,"value":3544}," is like buying secure window blinds for our house and leaving them open. That’s not their fault if we were being robbed.",{"type":40,"tag":46,"props":3546,"children":3547},{},[3548],{"type":50,"value":3549},"We have many tools at our disposal to make our website infrastructure more secure, but the most important one is our brain. If we don't use it, we can't be confident in our website's security no matter what CMS we use.",{"type":40,"tag":91,"props":3551,"children":3552},{},[],{"type":40,"tag":95,"props":3554,"children":3556},{"id":3555},"_3-purpose",[3557],{"type":50,"value":3558},"#3 Purpose",{"type":40,"tag":2006,"props":3560,"children":3561},{},[3562],{"type":40,"tag":46,"props":3563,"children":3564},{},[3565],{"type":50,"value":3566},"WordPress is only for simple blogs.",{"type":40,"tag":46,"props":3568,"children":3569},{},[3570,3572],{"type":50,"value":3571},"I often hear people blame performance, security, maintenance processes, and other factors when asked why WordPress isn't suitable for more complex websites. However, ",{"type":40,"tag":161,"props":3573,"children":3574},{},[3575],{"type":50,"value":3576},"I believe that the success of a website depends on our approach and decisions, not on the limitations of the platform.",{"type":40,"tag":46,"props":3578,"children":3579},{},[3580],{"type":50,"value":3581},"Coca-Cola has invented a cure for morphine addiction, bubble wrap supposes to be wallpaper and Listerine was originally marketed as a floor cleaner. And what success have they become? Although WordPress was initially intended for blogging, it has evolved into a powerful ecosystem that allows us to create almost anything we can imagine. Of course, if we for example rely too heavily on plugins without taking care of the architecture and best practices from the beginning, we may run into issues with larger projects. That's obvious. But if we make well-thought-out decisions, we can achieve big results.",{"type":40,"tag":46,"props":3583,"children":3584},{},[3585],{"type":50,"value":3586},"I and the team spent the past year developing a website that was originally intended to be a simple blog but expanded into something much bigger. We faced challenges due to the previous developers' use of techniques described in #1, but we overcame them by setting the bar high from the beginning and prioritizing quality and scalability. Through hard work and dedication, we designed a system that handles millions of views (per month), entries, and unique users, and does it really well! We've also successfully developed many CRM systems or other bigger applications using WordPress. And we're sure that it was worth it.",{"type":40,"tag":46,"props":3588,"children":3589},{},[3590,3592],{"type":50,"value":3591},"Our success is a testament to the fact that WordPress can be used for much more than just simple blogs - it all depends on us and comes down to our approach and decision-making. ",{"type":40,"tag":161,"props":3593,"children":3594},{},[3595],{"type":50,"value":3596},"I'm sure that if we understand what we're doing and what impact our decisions have, we are able to achieve great results not only with blogs.",{"type":40,"tag":91,"props":3598,"children":3599},{},[],{"type":40,"tag":95,"props":3601,"children":3603},{"id":3602},"_4-maintenance",[3604],{"type":50,"value":3605},"#4 Maintenance",{"type":40,"tag":2006,"props":3607,"children":3608},{},[3609],{"type":40,"tag":46,"props":3610,"children":3611},{},[3612],{"type":50,"value":3613},"WordPress is hard in maintaining.",{"type":40,"tag":46,"props":3615,"children":3616},{},[3617,3619,3624],{"type":50,"value":3618},"Maintaining a website can be challenging, but with the right approach, it doesn't have to be. While it's easy to blame WordPress or incompatible plugins for maintenance issues, ",{"type":40,"tag":161,"props":3620,"children":3621},{},[3622],{"type":50,"value":3623},"it's important to understand that our website's success ultimately relies on our actions.",{"type":50,"value":3625}," For instance, if we overload our website with too many plugins, we can't expect it to run smoothly/",{"type":40,"tag":46,"props":3627,"children":3628},{},[3629],{"type":50,"value":3630},"However, based on my experience, implementing a solid architecture from the beginning can make maintenance and updates a breeze. With a well-thought-out structure, we can confidently click the \"update\" button without fear of negative consequences.",{"type":40,"tag":2006,"props":3632,"children":3633},{},[3634],{"type":40,"tag":46,"props":3635,"children":3636},{},[3637],{"type":50,"value":3638},"Głębokość dupy w jakiej się znajdujesz podczas sesji jest wprost proporcjonalna do długości chuja jakiego położyłeś na semestr.",{"type":40,"tag":46,"props":3640,"children":3641},{},[3642],{"type":50,"value":3643},"So, let's focus on building a solid foundation and taking control of our website's success, and not on blaming WordPress for things that are in our hands.",{"type":40,"tag":91,"props":3645,"children":3646},{},[],{"type":40,"tag":95,"props":3648,"children":3650},{"id":3649},"_5-uniqueness",[3651],{"type":50,"value":3652},"#5 Uniqueness",{"type":40,"tag":2006,"props":3654,"children":3655},{},[3656],{"type":40,"tag":46,"props":3657,"children":3658},{},[3659],{"type":50,"value":3660},"WordPress is not unique.",{"type":40,"tag":46,"props":3662,"children":3663},{},[3664],{"type":50,"value":3665},"Let's analyze the CNN's of Lebron James throwing his record-breaking point. Pay attention to the people who take photos, and basically what devices they take them with. It's not hard to find Apple devices there. So do you blame Apple for their iPhones because those are not unique? Do you blame the people there? I'm sure that not. So why you're blaming WordPress for things that are in your hands?",{"type":40,"tag":1962,"props":3667,"children":3669},{":items":3668},"[\"https://cdn.pragmate.dev/wp-content/uploads/2023/02/ec60dd2a-27a0-4928-9183-5ec8e652ca27.jpg\",\"https://cdn.pragmate.dev/wp-content/uploads/2023/02/1b075b46-8aea-43ee-a991-e0c8c0e417a5.jpg\"]",[],{"type":40,"tag":46,"props":3671,"children":3672},{},[3673],{"type":50,"value":3674},"If uniqueness is so important to you - why won't you create something that is really unique? Does WordPress stop you? In my opinion, do not, unless you decide to use ThemeForest and Avada theme that has been used thousand times. You can build a website with React, Vue or Angular. You can add as many visual effects as possible. You can create something significantly outstanding if you have a great designer or idea for interesting components.",{"type":40,"tag":46,"props":3676,"children":3677},{},[3678,3680,3685],{"type":50,"value":3679},"Based on my experience - SKY IS THE LIMIT - and ",{"type":40,"tag":161,"props":3681,"children":3682},{},[3683],{"type":50,"value":3684},"it's up to you how unique the page is",{"type":50,"value":145},{"title":7,"searchDepth":333,"depth":333,"links":3687},[3688,3689,3690,3691,3692],{"id":3393,"depth":333,"text":3396},{"id":3485,"depth":333,"text":3488},{"id":3555,"depth":333,"text":3558},{"id":3602,"depth":333,"text":3605},{"id":3649,"depth":333,"text":3652},"content:wordpress:why-not-to-use.md","wordpress/why-not-to-use.md","wordpress/why-not-to-use",1784897553364]