preloader

Now Hiring: Are you a driven and motivated PHP (Laravel) Developer?

WP_speedUp_article_CitrusDev

How we found and fix slow API requests on a WordPress site

[vc_section full_width=”stretch_row” background_image=”6694″ background_position=”center center” lg_spacing=”padding_top:150;padding_bottom:150″ sm_spacing=”padding_top:50;padding_bottom:50″][vc_row][vc_column][tm_heading tag=”h1″ custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:700%20bold%20regular%3A700%3Anormal” font_weight=”700″ align=”center” text_color=”custom” custom_text_color=”#ffffff” animation=”none” font_size=”xs:28;lg:70″ line_height=”1.2″ max_width=”1100px” css=”.vc_custom_1667511925511{margin-bottom: 40px !important;}” sm_spacing=”margin_bottom:20″]How we found slow API requests on a WordPress site[/tm_heading][tm_heading custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”500″ align=”center” text_color=”custom” custom_text_color=”#ffffff” animation=”none” font_size=”xs:18;lg:34″ line_height=”1.1″ max_width=”740px”]and got more than x40 speed boost after making fixes[/tm_heading][/vc_column][/vc_row][/vc_section][vc_section lg_spacing=”margin_top:100;margin_bottom:100″ sm_spacing=”margin_top:50;margin_bottom:50″][vc_row][vc_column][tm_heading custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:700%20bold%20regular%3A700%3Anormal” font_weight=”700″ align=”center” text_color=”custom” custom_text_color=”#525252″ animation=”none” font_size=”xs:21;lg:36″ line_height=”1.2″ css=”.vc_custom_1667511915287{margin-bottom: 30px !important;}” sm_spacing=”margin_bottom:15″]Background[/tm_heading][/vc_column][/vc_row][vc_row][vc_column width=”1/2″][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:700%20bold%20regular%3A700%3Anormal” font_weight=”700″ xs_align=”center” text_color=”custom” custom_text_color=”#373f41″ animation=”none” font_size=”xs:16;lg:18″ line_height=”1.2″ css=”.vc_custom_1667511965963{margin-bottom: 30px !important;}” sm_spacing=”margin_bottom:20″]We are developing an educational platform that allows you to:[/tm_heading][vc_row_inner content_placement=”middle” lg_spacing=”margin_right:40;margin_bottom:16;padding_top:22;padding_bottom:22″ box_shadow=”0px 2px 10px rgba(218, 215, 215, 0.5);” border_radius=”6px” sm_spacing=”margin_right:0;margin_bottom:10;margin_left:0″][vc_column_inner width=”1/6″][tm_image image_size=”custom” align=”right” sm_align=”center” xs_align=”center” animation=”none” image=”6698″ image_size_width=”40″ image_size_height=”40″][/vc_column_inner][vc_column_inner width=”5/6″][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”400″ text_color=”custom” custom_text_color=”#373f41″ animation=”none” font_size=”lg:16″ line_height=”1.3″ max_width=”422px”]Сreate lesson presentations with slides with different types of content[/tm_heading][/vc_column_inner][/vc_row_inner][vc_row_inner content_placement=”middle” lg_spacing=”margin_right:40;margin_bottom:16;padding_top:22;padding_bottom:22″ box_shadow=”0px 2px 10px rgba(218, 215, 215, 0.5);” border_radius=”6px” sm_spacing=”margin_right:0;margin_bottom:10;margin_left:0″][vc_column_inner width=”1/6″][tm_image image_size=”custom” align=”right” sm_align=”center” xs_align=”center” animation=”none” image=”6701″ image_size_width=”40″ image_size_height=”40″][/vc_column_inner][vc_column_inner width=”5/6″][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”400″ text_color=”custom” custom_text_color=”#373f41″ animation=”none” font_size=”lg:16″ line_height=”1.3″ max_width=”422px”]Share them with other teachers[/tm_heading][/vc_column_inner][/vc_row_inner][vc_row_inner content_placement=”middle” lg_spacing=”margin_right:40;margin_bottom:16;padding_top:22;padding_bottom:22″ box_shadow=”0px 2px 10px rgba(218, 215, 215, 0.5);” border_radius=”6px” sm_spacing=”margin_right:0;margin_bottom:10;margin_left:0″][vc_column_inner width=”1/6″][tm_image image_size=”custom” align=”right” sm_align=”center” xs_align=”center” animation=”none” image=”6703″ image_size_width=”40″ image_size_height=”40″][/vc_column_inner][vc_column_inner width=”5/6″][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”400″ text_color=”custom” custom_text_color=”#373f41″ animation=”none” font_size=”lg:16″ line_height=”1.3″ max_width=”422px”]Clone and edit content to adapt to different age groups[/tm_heading][/vc_column_inner][/vc_row_inner][vc_row_inner content_placement=”middle” lg_spacing=”margin_right:40;padding_top:22;padding_bottom:22″ box_shadow=”0px 2px 10px rgba(218, 215, 215, 0.5);” border_radius=”6px” sm_spacing=”margin_right:0;margin_bottom:40;margin_left:0″][vc_column_inner width=”1/6″][tm_image image_size=”custom” align=”right” sm_align=”center” xs_align=”center” animation=”none” image=”6704″ image_size_width=”40″ image_size_height=”40″][/vc_column_inner][vc_column_inner width=”5/6″][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”400″ text_color=”custom” custom_text_color=”#373f41″ animation=”none” font_size=”lg:16″ line_height=”1.3″ max_width=”422px”]Show these presentations to students and receive feedback from them in the form of answers to questions[/tm_heading][/vc_column_inner][/vc_row_inner][/vc_column][vc_column width=”1/2″][tm_image image_size=”custom” animation=”none” image=”6696″ image_size_width=”540″ image_size_height=”226″ lg_spacing=”margin_bottom:35″][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”400″ text_color=”custom” custom_text_color=”#373f41″ animation=”none” font_size=”lg:16″ line_height=”1.4″ css=”.vc_custom_1667512056477{margin-bottom: 35px !important;}” sm_spacing=”margin_bottom:20″]All actions with content involve large amounts of data and active communication with the database.[/tm_heading][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:700%20bold%20regular%3A700%3Anormal” font_weight=”700″ text_color=”custom” custom_text_color=”#373f41″ animation=”none” font_size=”xs:16;lg:18″ line_height=”1.4″]Sometime after the test launch of the project, we found that the loading, saving, and cloning of lessons began to take too much time. This prompted us to study the problem in detail and search for solutions based on the identified bottlenecks.[/tm_heading][/vc_column][/vc_row][/vc_section][vc_row][vc_column][tm_heading tag=”h2″ custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:700%20bold%20regular%3A700%3Anormal” font_weight=”700″ align=”center” animation=”none” font_size=”xs:21;lg:36″ line_height=”1.4″ css=”.vc_custom_1667512107900{margin-bottom: 30px !important;}” sm_spacing=”margin_bottom:20″]Platform technical stack[/tm_heading][/vc_column][/vc_row][vc_section full_width=”stretch_row” background_color=”custom” lg_spacing=”margin_bottom:60;padding_top:60;padding_bottom:90″ custom_background_color=”#f6f3ee” sm_spacing=”padding_top:60;padding_bottom:60″][vc_row background_size=”contain” background_image=”6714″ background_position=”right center”][vc_column width=”1/2″][tm_heading tag=”h4″ custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:700%20bold%20regular%3A700%3Anormal” font_weight=”700″ text_color=”custom” custom_text_color=”#525252″ animation=”none” font_size=”lg:18″ line_height=”1.3″ css=”.vc_custom_1667398193003{margin-bottom: 20px !important;}”]Code[/tm_heading][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”400″ text_color=”custom” custom_text_color=”#373f41″ animation=”none” font_size=”lg:16″ line_height=”1.4″ max_width=”540px”]We used WordPress as the engine and the famous LearnDash plugin to implement the Learning Management System (LMS) functionality. This combination allowed the client to develop the necessary functionality and launch a demo to test the perception by end users in a short period of time. In the process of changing the requirements, we had to abandon most of the features that LearnDash provides and restructure the approach to creating content – replacing courses with lessons and lessons with slides.[/tm_heading][/vc_column][vc_column width=”1/2″][vc_row_inner lg_spacing=”padding_top:20;padding_bottom:50″][vc_column_inner width=”1/3″][tm_image image_size=”custom” animation=”none” image=”6718″ image_size_width=”160″ image_size_height=”45″ lg_spacing=”margin_top:50″ sm_spacing=”margin_top:0″][/vc_column_inner][vc_column_inner width=”1/3″][tm_image image_size=”custom” align=”center” animation=”none” image=”6719″ image_size_width=”160″ image_size_height=”45″ lg_spacing=”margin_top:100″ sm_spacing=”margin_top:15″][/vc_column_inner][vc_column_inner width=”1/3″][tm_image image_size=”custom” align=”right” animation=”none” image=”6720″ image_size_width=”160″ image_size_height=”45″ lg_spacing=”margin_top:50″ sm_spacing=”margin_top:15″][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row][/vc_section][vc_row lg_spacing=”margin_bottom:70″][vc_column width=”1/2″][tm_image animation=”none” image=”6727″][/vc_column][vc_column width=”1/2″][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”400″ text_color=”custom” custom_text_color=”#373f41″ animation=”none” font_size=”lg:16″ line_height=”1.4″ css=”.vc_custom_1667399781661{margin-top: 20px !important;}” max_width=”540px”]We chose Vue.js as the front-end framework, which allowed us to make the UI of the main functionality of the project responsive. That is to say, the functionality of the editor and the presentation of lessons. The peculiarity of the implementation lay in the construction of communication between the client and the server in the form of API requests. The requests are sent in large numbers due to the approach to managing posts in the selected CMS (WordPress), so reducing the number of requests was not possible. However, parallelization and asynchronous execution made it possible to achieve the desired results in performance.[/tm_heading][/vc_column][/vc_row][vc_row content_placement=”bottom” lg_spacing=”margin_bottom:100″][vc_column width=”1/2″][tm_heading tag=”h5″ custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:700%20bold%20regular%3A700%3Anormal” font_weight=”700″ text_color=”custom” custom_text_color=”#373f41″ animation=”none” el_class=”540px” font_size=”lg:18″ line_height=”1.2″ css=”.vc_custom_1667399775106{margin-bottom: 20px !important;}”]Server[/tm_heading][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”400″ text_color=”custom” custom_text_color=”#373f41″ animation=”none” font_size=”lg:16″ line_height=”1.4″ css=”.vc_custom_1667512765181{margin-top: 20px !important;}” max_width=”540px” sm_spacing=”margin_bottom:20″]The scalable architecture based on AWS allowed us to make sure that the server capacity was sufficient to process a large flow of users and guarantee decent performance at peak loads. However, this time the situation turned out to be so unpredictable that horizontal and vertical scaling did not give any better results.[/tm_heading][/vc_column][vc_column width=”1/2″][vc_row_inner background_size=”contain” background_image=”6733″ background_position=”left bottom”][vc_column_inner][tm_image image_size=”custom” align=”center” animation=”none” image=”6731″ image_size_width=”330″ image_size_height=”170″ lg_spacing=”margin_bottom:15″][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row][vc_section][vc_row][vc_column][tm_heading tag=”h2″ custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”700″ align=”center” text_color=”custom” custom_text_color=”#373f41″ animation=”none” font_size=”xs:21;lg:36″ line_height=”1.6″ max_width=”570px” css=”.vc_custom_1667512189879{margin-bottom: 30px !important;}”]Finding the problem and fixing it[/tm_heading][/vc_column][/vc_row][vc_row content_placement=”middle” lg_spacing=”margin_bottom:30″][vc_column width=”1/6″][tm_heading tag=”h4″ custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:700%20bold%20regular%3A700%3Anormal” text_color=”custom” custom_text_color=”#373f41″ animation=”none” font_size=”lg:18″ line_height=”1.4″]Problem[/tm_heading][/vc_column][vc_column width=”5/6″ offset=”vc_hidden-xs”][tm_image image_size=”custom” animation=”none” image=”6738″ image_size_width=”888″ image_size_height=”30″][/vc_column][/vc_row][vc_row lg_spacing=”margin_bottom:60″][vc_column width=”1/4″][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”400″ text_color=”custom” custom_text_color=”#373f41″ animation=”none” el_class=”finding-heading” font_size=”lg:16″ line_height=”1.4″]The initial description of the problem explained that the developed front-end lesson editor as well as the pages for editing records in the administrative panel were taking too long to load. The first thing that came to mind was that the admin panel was written in React and used API requests to fetch categories, taxonomies and tags. Our lesson editor also used API requests to read and write lesson content.[/tm_heading][/vc_column][vc_column width=”1/4″][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”400″ text_color=”custom” custom_text_color=”#373f41″ animation=”none” font_size=”lg:16″ line_height=”1.4″]After exploring the “network” tab in the browser dev tools, we found that all asynchronous requests to the server worked as expected, with the exception of API requests that took at least 3 seconds each. A detailed view of the request showed a high TTFB (time to first byte), indicating slowness on the backend or server-side.[/tm_heading][/vc_column][vc_column width=”1/4″][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”400″ text_color=”custom” custom_text_color=”#373f41″ animation=”none” font_size=”lg:16″ line_height=”1.4″]It was empirically calculated that no matter what actions the API endpoint performed, the result would always be the same – at least 3 seconds for processing, increasing to 5-6 seconds with the growth of the database.[/tm_heading][/vc_column][vc_column width=”1/4″][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”400″ text_color=”custom” custom_text_color=”#373f41″ animation=”none” font_size=”lg:16″ line_height=”1.4″]Of particular note, production turned out to be the slowest phase because it had the largest amount of data – posts and metadata for the posts. In order to verify that the load speed decreased as the amount of data increased, the production base was deployed in a test environment where we received confirmation of this theory.[/tm_heading][/vc_column][vc_column][tm_image animation=”none” image=”6749″ lg_spacing=”margin_top:60″ sm_spacing=”margin_top:20″][/vc_column][/vc_row][/vc_section][vc_section full_width=”stretch_row” background_image=”6753″ background_position=”center center” lg_spacing=”margin_bottom:160;padding_top:60;padding_bottom:60″ sm_spacing=”margin_bottom:80″][vc_row][vc_column][tm_heading custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:700%20bold%20regular%3A700%3Anormal” font_weight=”700″ text_color=”custom” custom_text_color=”#fe9400″ animation=”none” font_size=”xs:21;lg:36″ line_height=”1.2″ max_width=”517px” css=”.vc_custom_1667512467919{margin-bottom: 30px !important;}”]We constantly asked ourselves the same question:[/tm_heading][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”400″ text_color=”custom” custom_text_color=”#ffffff” animation=”none” font_size=”xs:21;lg:28″ line_height=”1.4″ max_width=”500px” css=”.vc_custom_1667512474901{margin-bottom: 30px !important;}”]Why is the speed of an API request that does not use the database when processing internal logic being affected by the size of the database?[/tm_heading][/vc_column][/vc_row][/vc_section][vc_section lg_spacing=”margin_bottom:100″ sm_spacing=”margin_bottom:60″][vc_row][vc_column][vc_row_inner content_placement=”middle” lg_spacing=”margin_bottom:25″][vc_column_inner width=”1/6″][tm_heading tag=”h4″ custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:700%20bold%20regular%3A700%3Anormal” text_color=”custom” custom_text_color=”#373f41″ animation=”none” font_size=”lg:18″ line_height=”1.4″]Solution[/tm_heading][/vc_column_inner][vc_column_inner width=”5/6″ offset=”vc_hidden-xs”][tm_image image_size=”custom” animation=”none” image=”6738″ image_size_width=”888″ image_size_height=”30″][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row][vc_row][vc_column width=”1/4″][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”400″ text_color=”custom” custom_text_color=”#373f41″ animation=”none” font_size=”lg:16″ line_height=”1.4″ max_width=”260px”]So, it was decided to turn off the plugins used one by one in order to find out their impact on the load speed. The first result came after the deactivation of the LearnDash plugin, the content of which is the basis of the entire platform. The processing speed of API requests was instantly 40 times faster! However, based on the impossibility of abandoning the plugin and resorting to the search for analogs, the investigation continued.[/tm_heading][/vc_column][vc_column width=”1/4″][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”400″ text_color=”custom” custom_text_color=”#373f41″ animation=”none” font_size=”lg:16″ line_height=”1.4″ max_width=”260px”]Going through the LearnDash plugin code, starting with initialization and including files, we commented on large blocks of code and checked their impact on the speed. Particular attention was paid to the REST API functionality, where the first hook appeared. By fully commenting out the use of the REST API by the plugin, the issue was resolved. However, this was also not a viable solution. Moving along the chain, we did find the reason for this behavior.[/tm_heading][/vc_column][vc_column width=”1/4″][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”400″ text_color=”custom” custom_text_color=”#373f41″ animation=”none” font_size=”lg:16″ line_height=”1.4″ max_width=”260px”]The LearnDash plugin was using the rest_api_init WordPress hook not only to register its own API endpoints and fields to them but also to include additional controllers with logic, one of which contained a huge unoptimized sequential selection from several tables in the database. Thus, regardless of the route API function, this selection was performed every time we sent an API request to the server (and, as mentioned above, a lot of requests are sent). The reason for this approach was not clear, however, a request for clarification was sent to the LearnDash plugin developers with the hope of a fix in future releases in mind.[/tm_heading][/vc_column][vc_column width=”1/4″][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”400″ text_color=”custom” custom_text_color=”#373f41″ animation=”none” font_size=”lg:16″ line_height=”1.4″ max_width=”260px”]The presence of a filter in the plugin code (provided by the LearnDash support team in response to our ticket) helped to fix the situation without problems and allow the exclusion of controllers loaded with logic before they were loaded. This is what we did for the problematic controller.[/tm_heading][/vc_column][/vc_row][/vc_section][vc_section full_width=”stretch_row” background_color=”custom” custom_background_color=”#f4f4f4″][vc_row][vc_column][vc_column_text][results][/vc_column_text][/vc_column][/vc_row][/vc_section][vc_section full_width=”stretch_row” background_image=”6757″ background_position=”center center” lg_spacing=”padding_top:90;padding_bottom:90″ sm_spacing=”padding_top:40;padding_bottom:40″][vc_row content_placement=”middle”][vc_column width=”1/2″][tm_heading custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:700%20bold%20regular%3A700%3Anormal” font_weight=”700″ text_color=”custom” custom_text_color=”#ffffff” animation=”none” font_size=”xs:21;lg:36″ line_height=”1.2″ max_width=”360px” sm_spacing=”margin_bottom:60″]Response from LearnDash dev team[/tm_heading][/vc_column][vc_column width=”1/2″][tm_image image_size=”custom” animation=”none” image=”6759″ image_size_width=”54″ image_size_height=”41″ lg_spacing=”margin_bottom:20″][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”400″ text_color=”custom” custom_text_color=”#ffffff” animation=”none” font_size=”xs:16;lg:20″ line_height=”1.1″ max_width=”540px” css=”.vc_custom_1667512528157{margin-bottom: 20px !important;}”]We have updated this and plan to release the changes in the next major release.[/tm_heading][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”400″ text_color=”custom” custom_text_color=”#ffffff” animation=”none” font_size=”xs:16;lg:20″ line_height=”1.1″ max_width=”540px” css=”.vc_custom_1667512535325{margin-bottom: 20px !important;}”]Thanks for your feedback – the dev team has taken those into consideration and also added their own improvements.[/tm_heading][/vc_column][/vc_row][/vc_section][vc_section full_width=”stretch_row” background_color=”custom” background_size=”contain” lg_spacing=”padding_top:100;padding_bottom:100″ custom_background_color=”#f7f3ef” background_image=”6569″ background_position=”right center” sm_spacing=”padding_top:50;padding_bottom:50″][vc_row content_placement=”middle”][vc_column width=”3/4″][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:700%20bold%20regular%3A700%3Anormal” font_weight=”700″ text_color=”custom” custom_text_color=”#373f41″ animation=”none” font_size=”xs:21;lg:36″ line_height=”1.3″ max_width=”788px” sm_spacing=”margin_bottom:60″]If you want our developers to analyze and research your WordPress website issues, please feel free to contact us anytime.[/tm_heading][/vc_column][vc_column width=”1/4″][tm_heading tag=”p” custom_google_font=”” google_fonts=”font_family:Montserrat%3Aregular%2C700|font_style:400%20regular%3A400%3Anormal” font_weight=”500″ text_color=”custom” custom_text_color=”#ffffff” animation=”none” font_size=”lg:14″ line_height=”1.2″]Contact us[/tm_heading][/vc_column][/vc_row][/vc_section]

Leave a Reply

Your email address will not be published. Required fields are marked *