
INSERT INTO wp_terms (name, slug) VALUES ('GP Services', 'gp-services');
SET @cat_term_id = LAST_INSERT_ID();
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES (@cat_term_id, 'category', '');
SET @cat_id = LAST_INSERT_ID();


INSERT INTO wp_posts (ID, post_author, post_date, post_date_gmt, post_content, post_title, post_status, post_type, post_name, post_modified, post_modified_gmt)
VALUES (1000, 1, '2026-01-25 00:28:42', '2026-01-25 00:28:42', '<h2>Introduction to GP Services</h2>
<p>Welcome to our comprehensive guide on GP Services. This detailed article provides essential information.</p>

<h2>Key Information</h2>
<p>Understanding GP Services is crucial for success.</p>

<h3>Important Points</h3>
<ul>
<li>First essential concept</li>
<li>Second important element</li>
<li>Third critical factor</li>
</ul>

<h2>Conclusion</h2>
<p>Understanding GP Services is essential for success.</p><p>Additional information about GP Services.</p><p>Additional information about GP Services.</p><p>Additional information about GP Services.</p><p>Additional information about GP Services.</p><p>Additional information about GP Services.</p><p>Additional information about GP Services.</p><p>Additional information about GP Services.</p><p>Additional information about GP Services.</p><p>Additional information about GP Services.</p><p>Additional information about GP Services.</p>', 'Complete Guide to GP Services: Everything You Need to Know (Part 1)', 'publish', 'post', 'complete-guide-to-gp-services:-everything-you-need-to-know-(part-1)', '2026-01-25 00:28:42', '2026-01-25 00:28:42');

INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES (1000, @cat_id);
UPDATE wp_term_taxonomy SET count = count + 1 WHERE term_taxonomy_id = @cat_id;


INSERT INTO wp_posts (ID, post_author, post_date, post_date_gmt, post_content, post_title, post_status, post_type, post_name, post_modified, post_modified_gmt)
VALUES (1001, 1, '2026-02-28 00:28:42', '2026-02-28 00:28:42', '<h2>Introduction to GP Services</h2>
<p>Welcome to our comprehensive guide on GP Services. This detailed article provides essential information.</p>

<h2>Key Information</h2>
<p>Understanding GP Services is crucial for success.</p>

<h3>Important Points</h3>
<ul>
<li>First essential concept</li>
<li>Second important element</li>
<li>Third critical factor</li>
</ul>

<h2>Conclusion</h2>
<p>Understanding GP Services is essential for success.</p><p>Additional information about GP Services.</p><p>Additional information about GP Services.</p><p>Additional information about GP Services.</p><p>Additional information about GP Services.</p><p>Additional information about GP Services.</p><p>Additional information about GP Services.</p><p>Additional information about GP Services.</p><p>Additional information about GP Services.</p><p>Additional information about GP Services.</p><p>Additional information about GP Services.</p>', 'Complete Guide to GP Services: Everything You Need to Know (Part 2)', 'publish', 'post', 'complete-guide-to-gp-services:-everything-you-need-to-know-(part-2)', '2026-02-28 00:28:42', '2026-02-28 00:28:42');

INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES (1001, @cat_id);
UPDATE wp_term_taxonomy SET count = count + 1 WHERE term_taxonomy_id = @cat_id;


INSERT INTO wp_terms (name, slug) VALUES ('Emergency Care', 'emergency-care');
SET @cat_term_id = LAST_INSERT_ID();
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES (@cat_term_id, 'category', '');
SET @cat_id = LAST_INSERT_ID();


INSERT INTO wp_posts (ID, post_author, post_date, post_date_gmt, post_content, post_title, post_status, post_type, post_name, post_modified, post_modified_gmt)
VALUES (1002, 1, '2026-03-04 00:28:42', '2026-03-04 00:28:42', '<h2>Introduction to Emergency Care</h2>
<p>Welcome to our comprehensive guide on Emergency Care. This detailed article provides essential information.</p>

<h2>Key Information</h2>
<p>Understanding Emergency Care is crucial for success.</p>

<h3>Important Points</h3>
<ul>
<li>First essential concept</li>
<li>Second important element</li>
<li>Third critical factor</li>
</ul>

<h2>Conclusion</h2>
<p>Understanding Emergency Care is essential for success.</p><p>Additional information about Emergency Care.</p><p>Additional information about Emergency Care.</p><p>Additional information about Emergency Care.</p><p>Additional information about Emergency Care.</p><p>Additional information about Emergency Care.</p><p>Additional information about Emergency Care.</p><p>Additional information about Emergency Care.</p><p>Additional information about Emergency Care.</p><p>Additional information about Emergency Care.</p><p>Additional information about Emergency Care.</p>', 'Complete Guide to Emergency Care: Everything You Need to Know (Part 1)', 'publish', 'post', 'complete-guide-to-emergency-care:-everything-you-need-to-know-(part-1)', '2026-03-04 00:28:42', '2026-03-04 00:28:42');

INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES (1002, @cat_id);
UPDATE wp_term_taxonomy SET count = count + 1 WHERE term_taxonomy_id = @cat_id;


INSERT INTO wp_posts (ID, post_author, post_date, post_date_gmt, post_content, post_title, post_status, post_type, post_name, post_modified, post_modified_gmt)
VALUES (1003, 1, '2026-02-07 00:28:42', '2026-02-07 00:28:42', '<h2>Introduction to Emergency Care</h2>
<p>Welcome to our comprehensive guide on Emergency Care. This detailed article provides essential information.</p>

<h2>Key Information</h2>
<p>Understanding Emergency Care is crucial for success.</p>

<h3>Important Points</h3>
<ul>
<li>First essential concept</li>
<li>Second important element</li>
<li>Third critical factor</li>
</ul>

<h2>Conclusion</h2>
<p>Understanding Emergency Care is essential for success.</p><p>Additional information about Emergency Care.</p><p>Additional information about Emergency Care.</p><p>Additional information about Emergency Care.</p><p>Additional information about Emergency Care.</p><p>Additional information about Emergency Care.</p><p>Additional information about Emergency Care.</p><p>Additional information about Emergency Care.</p><p>Additional information about Emergency Care.</p><p>Additional information about Emergency Care.</p><p>Additional information about Emergency Care.</p>', 'Complete Guide to Emergency Care: Everything You Need to Know (Part 2)', 'publish', 'post', 'complete-guide-to-emergency-care:-everything-you-need-to-know-(part-2)', '2026-02-07 00:28:42', '2026-02-07 00:28:42');

INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES (1003, @cat_id);
UPDATE wp_term_taxonomy SET count = count + 1 WHERE term_taxonomy_id = @cat_id;
