<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
	<channel>
		<title>Author at Infinum</title>
		<atom:link href="https://infinum.com/blog/author/ivan-ruzevic/feed/" rel="self" type="application/rss+xml" />
		<link></link>
		<description>Building digital products</description>
		<lastBuildDate>Thu, 23 Apr 2026 13:14:19 +0000</lastBuildDate>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>

					<item>
				<image>
					<url>41674https://infinum.com/uploads/2023/08/Project-estimates-avoid-bankruptcy-min.webp</url>
				</image>
				<title>How to Plan a Web Development Project Without Breaking the Budget</title>
				<link>https://infinum.com/blog/how-to-plan-a-web-development-project/</link>
				<pubDate>Wed, 23 Aug 2023 10:05:00 +0000</pubDate>
				<dc:creator>Ivan Ružević</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=41674</guid>
				<description>
					<![CDATA[<p>If you’re wondering how to plan a web development project that won’t leave you broke due to unexpected fees and hidden costs, we have a few tips to share.</p>
<p>The post <a href="https://infinum.com/blog/how-to-plan-a-web-development-project/">How to Plan a Web Development Project Without Breaking the Budget</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-272"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-92">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-95"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-93">
	<p	class='typography typography--size-36-text js-typography block-paragraph__paragraph'
	data-id='es-94'
	>
	<strong>Budget overruns can and do happen on digital product development projects. We have a few tips to share if you’re wondering how to plan a web development project that won’t leave you broke due to unexpected fees and hidden costs.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-98"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-96">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-97'
	>
	Have you ever been shocked by a phone or energy bill that was higher than expected? Hidden costs and unexpected fees are frustrating, especially if you&#8217;re a business owner.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-101"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-99">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-100'
	>
	When you engage in a web development project, you are more likely than not to encounter problems or delays that are sometimes hard to pinpoint. It’s also not uncommon for these projects to go over budget. Sometimes the reason is out of your hands, but other times, this can easily be prevented by acting at the right time and making smart decisions. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-104"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-102">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-103'
	>
	During my more than 15 years of experience working with WordPress, I was met with a wide range of projects – some good, some bad, and some downright ugly. In this article, I’ll pinpoint the usual suspects that often raise the overall costs of a web development project and share my advice on avoiding them. Let&#8217;s delve into how to plan a web development project so that you avoid headaches, unwelcome surprises, and unexpected costs.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-107"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-105">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-106'
	>
	How to plan a web development project in 5 steps</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-110"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-108">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-109'
	>
	<li><a href="#research">Research your web development agency</a></li><li><a href="#technology">Research the web development technology</a></li><li><a href="#brief">Provide a detailed web development project brief</a></li><li><a href="#agency">Listen to your web development agency</a></li><li><a href="#budget">Be cautious about spending too much on your web development budget</a></li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-113"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-111">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-112'
	>
	What’s the project?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-116"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-114">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-115'
	>
	Let’s illustrate this with an imaginary project. Say your company produces high-quality speakers you have spent years developing and perfecting. You want a website to showcase your product and attract potential customers and investors.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-119"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-117">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-118'
	>
	Considering your business goals, a simple website that provides basic information about the product, like countless others, may not be enough. You desire something custom that distinguishes your product from the competition and catches people&#8217;s attention. After some research, you are set on the idea that your website should offer e-commerce functionality and provide an in-depth comparison of your speakers with your competitors.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-122"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-120">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-121'
	>
	This type of project requires more advanced web development and potentially includes some hurdles along the way.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-125"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-123">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-124'
	>
	How to ensure a successful start for your web development project</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-128"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-126">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-127'
	>
	Putting your ideas down onto paper, and turning your website ideas into a reality, can seem like a daunting task. Here’s a short list of things to remember when building your brand, product, or service website. Of course, this list isn’t exhaustive, but these are some of the most important things to consider for any web development project.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-131"
	 data-animation='slideFade' data-animation-target='inner-items'>
				<div class="wrapper__anchor" id="research"></div>
	
			<div class="block-heading" data-id="es-129">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-130'
	>
	Research your web development agency</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-134"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-132">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-133'
	>
	Sometimes, you may come across agencies that offer cheaper services or know individuals who claim to &#8220;make websites&#8221;. While it may seem like an attractive option, I assure you that this type of engagement will cost you more in the long run. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-137"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-135">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-136'
	>
	This approach may be suitable if starting on a limited budget. However, implementing any changes becomes time-consuming as your company grows and evolves. Solo developers or small agencies may not have the necessary resources to support your growing company. They also might work with a &#8220;let&#8217;s make this fast and fix it later&#8221; mindset, which can lead to website crashes, code problems, legacy issues, and more.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-140"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-138">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-139'
	>
	To make sure you choose your future development partner wisely, <a href="https://infinum.com/blog/digital-product-development-company-questions/" target="_blank" rel="noreferrer noopener">we’ve prepared a list of questions</a> to help you select.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-143"
	 data-animation='slideFade' data-animation-target='inner-items'>
				<div class="wrapper__anchor" id="technology"></div>
	
			<div class="block-heading" data-id="es-141">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-142'
	>
	Research the web development technology</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-146"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-144">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-145'
	>
	One of the key factors that can determine the success or failure of your project is the technology stack used to build your website. Sometimes, companies opt for trendy or cutting-edge technologies without fully understanding their implications. While it may seem exciting to use the latest tools, it can lead to compatibility issues, limited developer expertise, and increased development time and costs.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-148"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-147'
	>
	<strong>If you&#8217;re unsure about the technology decisions, don&#8217;t hesitate to consult with experienced professionals or seek advice from reliable sources.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-151"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-149">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-150'
	>
	It&#8217;s essential to thoroughly research the technology options available and choose ones that align with your business requirements and long-term goals. Ensure that you and your development team clearly understand the technology choices and their potential limitations. Consider factors such as scalability, security, ease of maintenance, and community support. This is also an excellent time to research the <a href="https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it" target="_blank" rel="noreferrer noopener">YAGNI (You Aren&#8217;t Gonna Need It) principle</a>. Trust me, you will thank me later.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-154"
	 data-animation='slideFade' data-animation-target='inner-items'>
				<div class="wrapper__anchor" id="brief"></div>
	
			<div class="block-heading" data-id="es-152">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-153'
	>
	Provide a detailed web development project brief</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-157"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-155">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-156'
	>
	A common pitfall in your role as a client is not providing <a href="https://infinum.com/blog/what-is-a-project-brief/">a comprehensive and detailed project brief</a> to the development/design team. Without a clear roadmap and understanding of your expectations, the chances of miscommunication and divergent results increase significantly.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-160"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-158">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-159'
	>
	A good project brief should include:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-163"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-161">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-162'
	>
	<li>a comprehensive description of your website&#8217;s features</li><li>design guidelines</li><li>target audience</li><li>desired functionalities</li><li>project timelines</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-165"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-164'
	>
	<strong>A well-defined project scope will help the development team deliver the expected outcome and make it easier to track progress and identify any deviations early in the development process. </strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-168"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-166">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-167'
	>
	However, if you’re worried you won’t be able to come up with all the details yourself, any good agency will know how to help you figure these things out early on. At Infinum, we prefer to kick off projects with <a href="https://infinum.com/blog/product-discovery-workshops-glossary/" target="_blank" rel="noreferrer noopener">product discovery workshops</a>, in which we build the plan and project outline together. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-171"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-169">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-170'
	>
	Good agencies will always be there to support you. After all, it’s part of the service you’re paying for. Of course, it&#8217;s important to remember that you must bring expertise to the table about your brand or product so that the <a href="https://infinum.com/blog/two-truths-and-a-lie-strategy/" target="_blank" rel="noreferrer noopener">product strategy</a> we map out matches your business goals and ultimately brings you value.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-174"
	 data-animation='slideFade' data-animation-target='inner-items'>
				<div class="wrapper__anchor" id="agency"></div>
	
			<div class="block-heading" data-id="es-172">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-173'
	>
	Listen to your web development agency</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-177"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-175">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-176'
	>
	While you may have a clear vision for your website, it&#8217;s crucial to listen to the advice and recommendations of the agency you&#8217;ve hired. As experts in their field, they can provide valuable insights and suggestions that can enhance your project&#8217;s success.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-180"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-178">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-179'
	>
	Engage in open and transparent communication with your development team. Be receptive to their feedback and ideas, and work collaboratively to find the best solutions for your project. Sometimes, clients can be rigid in their demands, but balancing your vision and the agency’s expertise is essential.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-183"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-181">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-182'
	>
	For example, a feature will be finished in approximately 30 days. If your agency proposes a minor alteration to the design and functionality that could reduce the time to 10 days, it is advisable to consider that option. You have chosen the agency based on their references and expertise, and you can trust that they wouldn&#8217;t suggest a change unless it is the best course of action. Remember, the development team wants your project to succeed just as much as you do, so fostering a cooperative working relationship will lead to better results.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-186"
	 data-animation='slideFade' data-animation-target='inner-items'>
				<div class="wrapper__anchor" id="budget"></div>
	
			<div class="block-heading" data-id="es-184">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-185'
	>
	Be cautious about spending too much on your web development budget</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-189"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-187">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-188'
	>
	When embarking on a significant project like building a new website, it&#8217;s wise not to invest all your resources at once. Instead, together with the project team, devise <a href="https://infinum.com/blog/story-points-agile/" target="_blank" rel="noreferrer noopener">a plan for an iterative approach</a> and break your project into manageable phases. This allows you to assess the progress, receive feedback, and make adjustments before moving on to the next phase.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-191"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-190'
	>
	<strong>By dividing the project into smaller milestones, you have better control over the budget and can make informed decisions based on the outcomes of each phase. </strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-194"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-192">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-193'
	>
	This approach also enables you to validate the project&#8217;s direction and make necessary course corrections early in the process. It also minimizes the risk of pouring substantial resources into a project that might not yield the desired results. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-197"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-195">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-196'
	>
	Bumps in the road you may not have thought about (yet)</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-200"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-198">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-199'
	>
	Typically, it&#8217;s not the primary features that deplete your project funds – since you probably planned them beforehand – but the concealed details you or your agency overlooked during the initial estimate. Selecting your agency carefully will likely eliminate the need to be concerned about this, but conducting your research beforehand is always a good idea.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-204"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-201">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-202'
	>
	<strong>Inadequate security measures</strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-203'
	>
	Neglecting to implement robust security protocols can expose your website and sensitive user data to potential threats. Data breaches and cyber-attacks can have severe financial and reputational consequences for your company.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-208"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-205">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-206'
	>
	<strong><strong>Poor performance optimization</strong></strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-207'
	>
	Ignoring performance optimization can result in slow-loading webpages, leading to a higher bounce rate and dissatisfied users. Website speed and responsiveness are critical factors in user experience and search engine rankings.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-212"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-209">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-210'
	>
	<strong>Lack of mobile responsiveness</strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-211'
	>
	In today&#8217;s mobile-oriented world, having a website not optimized for mobile devices can be a significant setback. A large portion of your audience may access your website through smartphones and tablets, so ensuring mobile responsiveness is vital.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-216"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-213">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-214'
	>
	<strong>Underestimating content creation</strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-215'
	>
	Clients often underestimate the time and effort required for content creation. Developing high-quality, engaging, and SEO-friendly content can be time-consuming. Delays in content submission can hold up the entire website development process. If you require multi-language support, multiply this by the number of languages you need. </p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-220"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-217">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-218'
	>
	<strong><strong>Overlooking backup and recovery plans</strong></strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-219'
	>
	Website data loss can be disastrous for a business. You should ensure proper backup and recovery plans to safeguard your website and its data. </p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-224"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-221">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-222'
	>
	<strong><strong><strong>Overlooking ongoing maintenance</strong></strong></strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-223'
	>
	<a href="https://infinum.com/blog/code-audit/" target="_blank" rel="noreferrer noopener">A website requires regular maintenance</a>, including software updates, security patches, and content updates. You should be prepared for the ongoing commitment to keeping your website running smoothly.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-228"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-225">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-226'
	>
	<strong>Rushing the launch</strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-227'
	>
	Launching a website prematurely without thorough testing can lead to embarrassing glitches and negatively impact your brand reputation.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-232"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-229">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-230'
	>
	<strong><strong>Accessibility</strong></strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-231'
	>
	<a href="https://infinum.com/blog/digital-product-accessibility/" target="_blank" rel="noreferrer noopener">By investing in accessibility</a>, more people can use your website. It&#8217;s important to keep in mind that regulations regarding accessibility are on the way. It&#8217;s generally more costly and less effective to add accessibility features retroactively.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-235"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-233">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-234'
	>
	This is how we do it</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-238"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-236">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-237'
	>
	At Infinum, we understand the significance of well-executed projects and their impact on your company&#8217;s financial health. Here&#8217;s how we ensure project success:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-242"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-239">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-240'
	>
	<strong><strong><strong>Comprehensive analysis</strong></strong></strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-241'
	>
	We conduct an in-depth analysis of your business goals and requirements to recommend the most suitable technology stack and development approach before we even start.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-246"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-243">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-244'
	>
	<strong>Collaborative planning</strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-245'
	>
	We work closely with you to create a detailed project brief, breaking down the project into achievable milestones and setting realistic timelines. <a href="https://infinum.com/blog/what-to-expect-from-a-discovery-workshop/" target="_blank" rel="noreferrer noopener">This is called a workshop</a>.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-250"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-247">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-248'
	>
	<strong>Transparent communication</strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-249'
	>
	Our team values open and transparent communication, ensuring you are regularly updated on the project&#8217;s progress and involved in decision-making. In essence, you will know everything that is happening at all times.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-254"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-251">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-252'
	>
	<strong>Iterative development</strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-253'
	>
	By following an iterative development process, we deliver incremental results, enabling you to provide feedback and make adjustments throughout the project. Sprints, planning, <a href="https://infinum.com/blog/agile-principles-in-f1/" target="_blank" rel="noreferrer noopener">working in an agile way</a>, we do it all.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-258"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-255">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-256'
	>
	<strong><strong>Rigorous testing</strong></strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-257'
	>
	<a href="https://infinum.com/blog/improve-qa-testing-process/" target="_blank" rel="noreferrer noopener">We prioritize rigorous testing and quality assurance</a> to identify and rectify issues before the website&#8217;s launch, ensuring a seamless user experience.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-261"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-259">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-260'
	>
	How to plan a web development project, the smart way</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-264"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-262">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-263'
	>
	Creating a great product takes time. By conducting thorough research and choosing your agency wisely, you can avoid the pitfalls of low-cost, inexperienced options. If you are serious about your business, avoid rushing to the finish line.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-267"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-265">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-266'
	>
	We’ve identified some of the most common issues on<a href="https://infinum.com/mobile-web-apps/"> web development projects</a> and what you can do to anticipate and prevent them. Thorough research, prioritizing clear project briefs, open communication, and incremental development ensure better alignment with your team, reduce misunderstandings, allow for timely adjustments, and in the end, save you money. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-270"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-268">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-269'
	>
	No one likes hidden fees and unexpected costs. If you want to ensure you don’t break the bank with your next web development project but rather invest wisely – <a href="https://infinum.com/contact/" target="_blank" rel="noreferrer noopener">drop us a line, and let’s talk</a>.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/how-to-plan-a-web-development-project/">How to Plan a Web Development Project Without Breaking the Budget</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>8130https://infinum.com/uploads/2018/04/the-ups-and-downs-of-creating-a-decoupled-wordpress-0.webp</url>
				</image>
				<title>The Ups and Downs of Creating a Decoupled WordPress</title>
				<link>https://infinum.com/blog/the-ups-and-downs-of-creating-a-decoupled-wordpress/</link>
				<pubDate>Wed, 11 Apr 2018 13:00:00 +0000</pubDate>
				<dc:creator>Ivan Ružević</dc:creator>
				<guid isPermaLink="false">https://infinum.com/the-capsized-eight/the-ups-and-downs-of-creating-a-decoupled-wordpress/</guid>
				<description>
					<![CDATA[<p>What decoupled WordPress actually is and how it should be used with (or without) WordPress REST API. </p>
<p>The post <a href="https://infinum.com/blog/the-ups-and-downs-of-creating-a-decoupled-wordpress/">The Ups and Downs of Creating a Decoupled WordPress</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-425"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-273">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-276"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-274">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-275'
	>
	Ever since the REST API was included in the core of WordPress, there’s been a lot of talk about using it for decoupled WordPress (sometimes known as headless WordPress). In this article, we’ll delve a little deeper into this topic, explaining what decoupled WordPress actually is and how it should be used with (or without) WordPress REST API. We’ll also reveal some interesting surprises we’ve encountered while trying to implement it.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-279"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-277">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-278'
	>
	Decoupled WordPress introduction</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-282"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-280">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-281'
	>
	In its original form, WordPress is a full-fledged content management system (CMS). It comes equipped with a working admin interface for content entering and editing the frontend that displays it. It also includes a backend system written in PHP with various APIs that handle database interaction, user authentication, routing, and more.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-285"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-283">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-284'
	>
	On the other hand, decoupled WordPress uses WordPress as a sort of a model and controller bundled together that handles data manipulation, and database interaction, while REST API Controller provides a way to interact with the view layer using various API endpoints. In addition to MVC separation, we can (for security reasons or speed improvements) place the JS App on a separate server like in the schema below:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-288"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-286"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-287">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2018/04/shrine-s320180320-16228-14c6qag20180320-16228-irx46f20180320-16228-1hutbwo.webp"
					class="image__img block-media__image-img"
					alt=""
										height="423"
															width="705"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-291"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-289">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-290'
	>
	<a href="https://developer.wordpress.org/rest-api/">REST API</a> was bundled into the WordPress core since version 4.4. However, endpoints for posts, comments, terms, users, meta, and settings appeared later in version 4.7.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-294"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-292">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-293'
	>
	What WordPress REST API allows you to do is to interact with your WordPress installation remotely by sending and receiving JSON objects.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-297"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-295">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-296'
	>
	The ideal use case for this is a simple single-page application. Another advantage of REST API is that you can use any popular view framework or library to display your frontend. For example, React, Vue, Angular are just a few options in a sea of popular view libraries and frameworks.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-300"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-298">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-299'
	>
	Thanks to this feature, you can have the backend part on one server, which can be optimized for server-side tasks (faster disk, optimized database interactions, etc.). Then, your front is served from another server, giving you a good separation of concerns.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-303"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-301">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-302'
	>
	Creating a simple website using REST API</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-306"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-304">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-305'
	>
	We wanted to determine how to use WordPress REST API for building a simple website with React on the frontend. We were testing whether we’d get better performance when decoupling the front from the backend. In our case, we didn’t really need all the REST API functionality, such as editing, creating and deleting posts or uploading media files. We wanted to retain the CMS ability so our colleagues in marketing, who usually add and edit content, wouldn’t have to ping developers to update the site.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-309"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-307">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-308'
	>
	We first encountered the strange WordPress lagging REST API on a client site, where we used the custom endpoints to get the list of locations on a Google map, alongside other meta information created using the Advanced Custom Fields Pro plugin. It turned out that the time to first byte (TTFB), which is used as an indication of the responsiveness of a web server or other network resource, was more than 3 seconds.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-312"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-310">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-311'
	>
	After investigating, we realized the default REST API calls were actually really slow, especially when we “burdened” the site with additional plugins.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-315"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-313">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-314'
	>
	As an initial test case, we created a default WordPress installation with version 4.9.4, using <a href="https://varyingvagrantvagrants.org/docs/en-US/">Varying Vagrant Vagrants</a> running on PHP 7.0.27 and MySQL 15.1 (Distrib 10.1.31-MariaDB). Using <a href="https://wordpress.org/themes/twentyseventeen/">Twenty Seventeen</a> theme, without any pages and only sample posts, the postman app gave a loading time of 47 ms for a response size of 2.16 KB. This isn’t bad—but in the real world, you won’t have only one post on your site. So we added some more default posts, importing them from the wordpress.org <strong>Theme Review Teams repository</strong>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-318"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-316">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-317'
	>
	In this case, the load times increased to 161 ms, and the response size was 41.63 KB. The timings in Chrome were a bit slower with 261 ms, and the TTFB was 173.76 ms. That was for just ten posts.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-321"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-319">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-320'
	>
	We were curious to see how adding additional plugins would influence the response times. The plugins we used, in no order of relevance, were:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-324"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-322">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-323'
	>
	<li>Advanced Custom Fields</li><li>Akismet Anti-Spam</li><li>All In One SEO Pack</li><li>bbPress</li><li>Contact Form 7</li><li>Google XML Sitemaps</li><li>Hello Dolly</li><li>Jetpack by WordPress.com</li><li>Limit Login Attempts</li><li>Theme Check</li><li>TinyMCE Advanced</li><li>WooCommerce</li><li>Wordfence Security</li><li>WordPress Importer</li><li>WP Super Cache</li><li>Yoast</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-327"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-325">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-326'
	>
	We encountered some interesting results. The postman app now gave the load time of 1970 ms for 41.9 KB of response size. Chrome’s load time was 1.25 s (TTFB was 1.25 s, content was downloaded in 3.96 ms). Just to retrieve a simple list of posts. No taxonomy, no user data, no additional meta fields.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-330"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-328">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-329'
	>
	Reasons for the long REST API response times</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-333"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-331">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-332'
	>
	Why were response times so long? For one, accessing REST API on the default WordPress will load the entire WordPress to serve the endpoints, even though it’s not used—and the more plugins you add, the worse things get. The default REST controller <a href="https://developer.wordpress.org/reference/classes/wp_rest_controller/">WP_REST_Controller</a> is a really big class that does a lot more than necessary when building a simple web page. It handles routes registering, permission checks, creating and deleting items, etc.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-336"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-334">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-335'
	>
	One workaround could be to create a custom REST controller, which will only serve the content and handle permissions and authorization. Unfortunately, we haven’t tested if this would have any impact on the performance.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-339"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-337">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-338'
	>
	Another workaround we implemented was to load only the bare minimum of WordPress and store our data in a transient, from which we’ll fetch using a custom page.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-342"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-340">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-341'
	>
	Transients</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-345"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-343">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-344'
	>
	Transient API is used to store certain data in the options table in your database for a specific period of time. You can set an expiration time for a transient. After this date, the transient will be deleted from the database, or you can store it permanently and use post save or update hooks to manually delete and recreate it. It is a powerful tool WordPress uses to cache things, such as plugin versions, theme versions, and other data. Here is one of the major advantages of transients: When using a caching plugin, transients will be stored in memory, and when requested, data will be pulled from it instead of querying a database to fetch it—which is even faster. In addition to being really fast, it can hold up to 4GB of data in it; and 4GB JSON string is really, really a lot.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-348"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-346">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-347'
	>
	Minimal WordPress load</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-351"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-349">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-350'
	>
	To load the bare minimum necessary for WordPress to work, you need to add just one line—either in your <code>wp-config.php</code> file or, better yet, in a custom file you’ll use in your plugin or in your theme:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-353"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #005cc5;">define</span><span class="token">(</span><span class="token"> </span><span class="token" style="color: #005cc5;">’SHORTINIT’</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">true</span><span class="token"> </span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-356"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-354">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-355'
	>
	A quick look in the wp-settings.php reveals that if this constant is set to true, most of the WordPress won’t be loaded. Any additional WordPress functionality would have to be added manually, but it pays off.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-359"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-357">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-358'
	>
	What we created was a file called <code>wp-config-simple.php</code> that looks like this:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-361"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">?</span><span class="token" style="color: #005cc5;">php</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> This constant loads only the minimal version of WordPress.</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">define</span><span class="token">(</span><span class="token"> </span><span class="token" style="color: #005cc5;">’SHORTINIT’</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">true</span><span class="token"> </span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> We need the wp-load.php to fetch the pages.</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">$</span><span class="token" style="color: #24292e;">parse_uri</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">explode</span><span class="token">(</span><span class="token"> </span><span class="token" style="color: #005cc5;">’wp</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">content’</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #24292e;">$</span><span class="token" style="color: #24292e;">_SERVER</span><span class="token">[</span><span class="token" style="color: #005cc5;">’SCRIPT_FILENAME’</span><span class="token">]</span><span class="token"> </span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">require_once</span><span class="token">(</span><span class="token"> </span><span class="token" style="color: #24292e;">$</span><span class="token" style="color: #24292e;">parse_uri</span><span class="token">[</span><span class="token" style="color: #005cc5;">0</span><span class="token">]</span><span class="token"> </span><span class="token" style="color: #d73a49;">.</span><span class="token"> </span><span class="token" style="color: #005cc5;">’wp</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">load</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">php’</span><span class="token"> </span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-364"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-362">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-363'
	>
	This in turn only calls the initial <code>wp-load.php</code> file necessary for pages and posts. Then we can include other files needed for other WordPress functionalities.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-367"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-365">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-366'
	>
	Caching pages</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-370"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-368">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-369'
	>
	The complete solution to this is a plugin called Decoupled JSON content.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-373"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-371">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-372'
	>
	This plugin will cache the pages and posts in a transient, and its JSON content can then be fetched by accessing a file that will serve this JSON. For instance, the page<code>http://local.wordpress.test/wp-content/plugins/decoupled-json-content/page/rest-routes/page.php?slug=blog&amp;type=page</code> will give you the following JSON:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-375"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-json github-light" data-language="json" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">ID</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #005cc5;">703</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">post_author</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">1</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">post_date</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">2011-05-20 18:51:43</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">post_date_gmt</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">2011-05-21 01:51:43</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">post_content</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Use this static Page to test the Theme’s handling of the Blog Posts Index page. If the site is set to display a static Page on the Front Page, and this Page is set to display the Blog Posts Index, then this text should not appear.</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">post_title</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Blog</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">post_excerpt</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">post_status</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">publish</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">comment_status</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">open</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">ping_status</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">closed</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">post_password</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">post_name</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">blog</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">to_ping</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">pinged</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">post_modified</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">2011-05-20 18:51:43</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">post_modified_gmt</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">2011-05-21 01:51:43</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">post_content_filtered</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">post_parent</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">guid</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">https://wpthemetestdata.wordpress.com/?page_id=703</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">menu_order</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">post_type</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">page</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">post_mime_type</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">comment_count</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">0</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">filter</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">raw</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">custom_fields</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">_wp_page_template</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token">[</span><span class="token">
</span></span><span class="line"><span class="token">      </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">default</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">}</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">template</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-378"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-376">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-377'
	>
	Aside from default post/pages routes, there are also custom menus routes and several hooks, which can be used to extend the functionality of the plugin: Add custom post types, override various post formats, change custom fields and more.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-381"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-379">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-380'
	>
	The way to use this in an app would be to fetch the data using the above URL, changing the <code>slug</code> and the <code>type</code> based on what you need to fetch, and store it in your application state (using Redux, or better yet MobX in case of React). Whenever data is needed, it can be pulled from the store. However, it’s important to take extra care to ensure new data is being fetched when the content changes on the WordPress side. This concerns the JS App, which we will cover in another article.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-384"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-382">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-383'
	>
	Testing it out</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-387"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-385">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-386'
	>
	When we accessed the JSON data using the above method, we noticed a drastic decrease in load times. We conducted testing in Chrome, where we could see the total response time and the TTFB separately. We tested response times ten times in a row, first without plugins and then with the plugins added. Also, we tested the response for a list of posts and for a single post.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-390"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-388">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-389'
	>
	The results of the test are illustrated in the tables below:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-393"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-391"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-392">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2018/03/the-ups-and-downs-of-creating-a-decoupled-wordpress-1.webp"
					class="image__img block-media__image-img"
					alt=""
										height="600"
															width="1000"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-396"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-394"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-395">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2018/03/the-ups-and-downs-of-creating-a-decoupled-wordpress-2.webp"
					class="image__img block-media__image-img"
					alt=""
										height="600"
															width="1000"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-399"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-397">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-398'
	>
	As you can see, there is a drastic difference.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-402"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-400">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-401'
	>
	There are some limitations that should be taken into account. For now, you can only retrieve data. Storing and creating isn’t handled by the decoupled content plugin. Also, since the plugin directly calls <code>wp-load.php</code>, it won’t work on non-standard installations of WordPress such as <a href="https://roots.io/bedrock/">bedrock</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-405"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-403">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-404'
	>
	Conclusion</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-408"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-406">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-407'
	>
	Is WordPress REST ready? Yes and no.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-411"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-409">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-410'
	>
	REST API is great because it can be used to create fully-fledged apps—creating, retrieving, updating and deleting the data. The downside is its speed. You’ll either have to create a custom controller, which is something we need to test or sacrifice the speed of your app.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-414"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-412">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-413'
	>
	Obviously, creating an app is different than creating a classic website. You probably won’t need all the plugins we installed. But if you just need the data for presentational purposes, caching data and serving it in a custom file seems like the perfect solution at the moment.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-417"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-415">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-416'
	>
	You may be wondering, “What’s the point? Couldn’t we just create a regular WordPress theme using good old PHP?” Sure we can. Not only that, but we have an excellent <a href="https://github.com/infinum/wp-boilerplate">boilerplate</a> that uses object-oriented programming principle, namespacing and autoloading, along with some caching tricks to make a site as performant as possible. But with Gutenberg around the corner, front-end frameworks are getting really popular with the WordPress community, so this is something to keep in mind.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-420"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-418">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-419'
	>
	We hope you found this article helpful and interesting. Feel free to comment and share your thoughts.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-423"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-421">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-422'
	>
	For more details on the test data check <a href="https://github.com/iruzevic/wordpress-rest-transient">this link</a>.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/the-ups-and-downs-of-creating-a-decoupled-wordpress/">The Ups and Downs of Creating a Decoupled WordPress</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
		
	</channel>
</rss>