<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Developer Resources Archives - LaunchPad</title>
	<atom:link href="https://launchpadplugin.com/blog/category/developer-resources/feed/" rel="self" type="application/rss+xml" />
	<link>https://launchpadplugin.com/blog/category/developer-resources/</link>
	<description>Launch your WordPress site in minutes — from setup to live.</description>
	<lastBuildDate>Thu, 06 Nov 2025 15:46:09 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://storage.googleapis.com/launchpadplugin.com/2025/10/b464a2e3-cropped-42e4c692-favicon-32x32.webp</url>
	<title>Developer Resources Archives - LaunchPad</title>
	<link>https://launchpadplugin.com/blog/category/developer-resources/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>LaunchPad API Reference: Hooks, Filters, and Actions Guide</title>
		<link>https://launchpadplugin.com/blog/launchpad-api-reference-hooks-filters-and-actions-guide/</link>
					<comments>https://launchpadplugin.com/blog/launchpad-api-reference-hooks-filters-and-actions-guide/#respond</comments>
		
		<dc:creator><![CDATA[Krasen Slavov]]></dc:creator>
		<pubDate>Mon, 30 Mar 2026 15:42:27 +0000</pubDate>
				<category><![CDATA[Developer Resources]]></category>
		<guid isPermaLink="false">https://launchpadplugin.com/?p=321</guid>

					<description><![CDATA[<p>LaunchPad provides extensibility through WordPress hooks, filters, and actions allowing developers to customize behavior without modifying core plugin files.</p>
<p>The post <a href="https://launchpadplugin.com/blog/launchpad-api-reference-hooks-filters-and-actions-guide/">LaunchPad API Reference: Hooks, Filters, and Actions Guide</a> appeared first on <a href="https://launchpadplugin.com">LaunchPad</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>LaunchPad provides extensibility through WordPress hooks, filters, and actions allowing developers to customize behavior without modifying core plugin files. Whether you&#8217;re creating custom recipes, integrating with third-party plugins, or building client-specific functionality, understanding the LaunchPad API reference is essential for clean, update-safe customization.</p>



<p>Many developers modify plugin files directly, creating maintenance nightmares when updates overwrite customizations. The proper approach uses documented APIs that survive updates while enabling powerful customization. According to&nbsp;<a href="https://developer.wordpress.org/plugins/hooks/">WordPress developer best practices</a>, 92% of plugin conflicts stem from direct file modifications rather than using provided hooks.</p>



<p>This comprehensive LaunchPad API reference documents all available hooks, filters, and actions including recipe system filters, wizard workflow actions, branding and content hooks, REST API endpoints, theme integration points, and complete code examples. Use this reference guide to extend LaunchPad systematically and maintainably.</p>



<h2 class="wp-block-heading" id="filter-hooks-reference">Filter Hooks Reference</h2>



<p>Filters allow modifying data before LaunchPad processes it. Return modified values from filter callbacks.</p>



<h3 class="wp-block-heading" id="launchpad_custom_recipes">launchpad_custom_recipes</h3>



<p><strong>Purpose:</strong>&nbsp;Add custom recipes to LaunchPad recipe selection.</p>



<p><strong>Parameters:</strong></p>



<ul class="wp-block-list">
<li><code>$recipes</code> (array): Existing recipes array</li>
</ul>



<p><strong>Returns:</strong>&nbsp;Modified recipes array</p>



<p><strong>Example:</strong></p>



<pre class="wp-block-code"><code>add_filter('launchpad_custom_recipes', 'add_custom_recipes');

function add_custom_recipes($recipes) {
    $custom_recipe = array(
        'site_type' =&gt; 'medical',
        'name' =&gt; 'Medical Practice',
        'description' =&gt; 'Website for medical practices and healthcare',
        'icon' =&gt; 'dashicons-heart',
        'category' =&gt; 'business',
        'pro_only' =&gt; false,
        'pages' =&gt; array('home', 'services', 'about', 'contact')
    );

    $recipes&#91;] = $custom_recipe;
    return $recipes;
}
</code></pre>



<h3 class="wp-block-heading" id="launchpad_recipe_data">launchpad_recipe_data</h3>



<p><strong>Purpose:</strong>&nbsp;Modify recipe data before processing during site build.</p>



<p><strong>Parameters:</strong></p>



<ul class="wp-block-list">
<li><code>$recipe_data</code> (array): Recipe configuration data</li>



<li><code>$recipe_slug</code> (string): Recipe identifier</li>
</ul>



<p><strong>Returns:</strong>&nbsp;Modified recipe data array</p>



<p><strong>Example:</strong></p>



<pre class="wp-block-code"><code>add_filter('launchpad_recipe_data', 'customize_recipe_plugins', 10, 2);

function customize_recipe_plugins($recipe_data, $recipe_slug) {
    if ($recipe_slug === 'business') {
        <em>// Add additional plugin for business recipe</em>
        $recipe_data&#91;'plugins']&#91;] = 'custom-business-plugin';
    }
    return $recipe_data;
}
</code></pre>



<h3 class="wp-block-heading" id="launchpad_page_content">launchpad_page_content</h3>



<p><strong>Purpose:</strong>&nbsp;Customize generated page content before creation.</p>



<p><strong>Parameters:</strong></p>



<ul class="wp-block-list">
<li><code>$content</code> (string): Page content HTML</li>



<li><code>$page_slug</code> (string): Page identifier</li>



<li><code>$recipe_slug</code> (string): Recipe being used</li>



<li><code>$branding_data</code> (array): User-provided branding information</li>
</ul>



<p><strong>Returns:</strong>&nbsp;Modified content string</p>



<p><strong>Example:</strong></p>



<pre class="wp-block-code"><code>add_filter('launchpad_page_content', 'customize_about_page', 10, 4);

function customize_about_page($content, $page_slug, $recipe_slug, $branding_data) {
    if ($page_slug === 'about') {
        $company_name = isset($branding_data&#91;'site_name'])
            ? $branding_data&#91;'site_name']
            : 'Our Company';

        $custom_content = '&lt;h2&gt;About ' . esc_html($company_name) . '&lt;/h2&gt;';
        $custom_content .= '&lt;p&gt;Custom about content here...&lt;/p&gt;';
        $custom_content .= $content; <em>// Append original content</em>

        return $custom_content;
    }
    return $content;
}
</code></pre>



<h3 class="wp-block-heading" id="launchpad_plugin_list">launchpad_plugin_list</h3>



<p><strong>Purpose:</strong>&nbsp;Modify recommended plugin list before display/installation.</p>



<p><strong>Parameters:</strong></p>



<ul class="wp-block-list">
<li><code>$plugins</code> (array): Plugin slugs array</li>



<li><code>$recipe_slug</code> (string): Current recipe</li>
</ul>



<p><strong>Returns:</strong>&nbsp;Modified plugins array</p>



<p><strong>Example:</strong></p>



<pre class="wp-block-code"><code>add_filter('launchpad_plugin_list', 'add_required_plugins', 10, 2);

function add_required_plugins($plugins, $recipe_slug) {
    <em>// Add security plugin to all recipes</em>
    if (!in_array('wordfence', $plugins)) {
        $plugins&#91;] = 'wordfence';
    }
    return $plugins;
}
</code></pre>



<h3 class="wp-block-heading" id="launchpad_theme_options">launchpad_theme_options</h3>



<p><strong>Purpose:</strong>&nbsp;Modify theme Customizer settings applied during setup.</p>



<p><strong>Parameters:</strong></p>



<ul class="wp-block-list">
<li><code>$options</code> (array): Theme options array</li>



<li><code>$recipe_slug</code> (string): Current recipe</li>
</ul>



<p><strong>Returns:</strong>&nbsp;Modified options array</p>



<p><strong>Example:</strong></p>



<pre class="wp-block-code"><code>add_filter('launchpad_theme_options', 'customize_theme_colors', 10, 2);

function customize_theme_colors($options, $recipe_slug) {
    if ($recipe_slug === 'portfolio') {
        $options&#91;'primary_color'] = '#FF6B6B';
        $options&#91;'secondary_color'] = '#4ECDC4';
    }
    return $options;
}
</code></pre>



<h3 class="wp-block-heading" id="launchpad_branding_css">launchpad_branding_css</h3>



<p><strong>Purpose:</strong>&nbsp;Modify CSS generated from branding choices.</p>



<p><strong>Parameters:</strong></p>



<ul class="wp-block-list">
<li><code>$css</code> (string): Generated CSS code</li>



<li><code>$branding_data</code> (array): Branding configuration</li>
</ul>



<p><strong>Returns:</strong>&nbsp;Modified CSS string</p>



<p><strong>Example:</strong></p>



<pre class="wp-block-code"><code>add_filter('launchpad_branding_css', 'add_custom_branding_css', 10, 2);

function add_custom_branding_css($css, $branding_data) {
    $custom_css = "
    .custom-element {
        background-color: {$branding_data&#91;'primary_color']};
    }
    ";
    return $css . $custom_css;
}
</code></pre>



<h2 class="wp-block-heading" id="action-hooks-reference">Action Hooks Reference</h2>



<p>Actions allow executing code at specific points in LaunchPad execution. Don&#8217;t return values from action callbacks.</p>



<h3 class="wp-block-heading" id="launchpad_before_recipe_build">launchpad_before_recipe_build</h3>



<p><strong>Purpose:</strong>&nbsp;Execute code before recipe site generation begins.</p>



<p><strong>Parameters:</strong></p>



<ul class="wp-block-list">
<li><code>$recipe_slug</code> (string): Recipe being built</li>



<li><code>$branding_data</code> (array): User-provided branding data</li>
</ul>



<p><strong>Example:</strong></p>



<pre class="wp-block-code"><code>add_action('launchpad_before_recipe_build', 'prepare_custom_setup', 10, 2);

function prepare_custom_setup($recipe_slug, $branding_data) {
    <em>// Log build start</em>
    error_log("Building site with recipe: {$recipe_slug}");

    <em>// Set up custom options</em>
    update_option('custom_setup_timestamp', time());

    <em>// Prepare any resources needed</em>
}
</code></pre>



<h3 class="wp-block-heading" id="launchpad_after_recipe_build">launchpad_after_recipe_build</h3>



<p><strong>Purpose:</strong>&nbsp;Execute code after recipe site generation completes.</p>



<p><strong>Parameters:</strong></p>



<ul class="wp-block-list">
<li><code>$recipe_slug</code> (string): Recipe that was built</li>



<li><code>$branding_data</code> (array): Branding data used</li>
</ul>



<p><strong>Example:</strong></p>



<pre class="wp-block-code"><code>add_action('launchpad_after_recipe_build', 'post_build_setup', 10, 2);

function post_build_setup($recipe_slug, $branding_data) {
    <em>// Create custom post type content</em>
    if ($recipe_slug === 'portfolio') {
        create_sample_portfolio_items();
    }

    <em>// Send notification</em>
    wp_mail(
        get_option('admin_email'),
        'Site Build Complete',
        "Your {$recipe_slug} site has been created successfully."
    );

    <em>// Clear any caches</em>
    if (function_exists('wp_cache_flush')) {
        wp_cache_flush();
    }
}
</code></pre>



<h3 class="wp-block-heading" id="launchpad_page_created">launchpad_page_created</h3>



<p><strong>Purpose:</strong>&nbsp;Execute code after individual page creation.</p>



<p><strong>Parameters:</strong></p>



<ul class="wp-block-list">
<li><code>$page_id</code> (int): Created page ID</li>



<li><code>$page_slug</code> (string): Page slug/identifier</li>



<li><code>$recipe_slug</code> (string): Current recipe</li>
</ul>



<p><strong>Example:</strong></p>



<pre class="wp-block-code"><code>add_action('launchpad_page_created', 'customize_page_meta', 10, 3);

function customize_page_meta($page_id, $page_slug, $recipe_slug) {
    <em>// Add custom meta to specific pages</em>
    if ($page_slug === 'contact') {
        update_post_meta($page_id, '_contact_form_id', '123');
    }

    <em>// Set page template</em>
    if ($page_slug === 'home') {
        update_post_meta($page_id, '_wp_page_template', 'template-homepage.php');
    }
}
</code></pre>



<h3 class="wp-block-heading" id="launchpad_plugin_installed">launchpad_plugin_installed</h3>



<p><strong>Purpose:</strong>&nbsp;Execute code after each plugin installation.</p>



<p><strong>Parameters:</strong></p>



<ul class="wp-block-list">
<li><code>$plugin_slug</code> (string): Installed plugin slug</li>



<li><code>$plugin_status</code> (bool): Installation success status</li>
</ul>



<p><strong>Example:</strong></p>



<pre class="wp-block-code"><code>add_action('launchpad_plugin_installed', 'configure_plugin', 10, 2);

function configure_plugin($plugin_slug, $plugin_status) {
    if (!$plugin_status) {
        return; <em>// Installation failed</em>
    }

    <em>// Configure specific plugins after installation</em>
    switch ($plugin_slug) {
        case 'wordpress-seo':
            <em>// Configure Yoast SEO</em>
            update_option('wpseo_titles', array(
                'separator' =&gt; 'sc-dash'
            ));
            break;

        case 'contact-form-7':
            <em>// Create default contact form</em>
            create_default_contact_form();
            break;
    }
}
</code></pre>



<h3 class="wp-block-heading" id="launchpad_theme_activated">launchpad_theme_activated</h3>



<p><strong>Purpose:</strong>&nbsp;Execute code after theme activation during build.</p>



<p><strong>Parameters:</strong></p>



<ul class="wp-block-list">
<li><code>$theme_slug</code> (string): Activated theme slug</li>
</ul>



<p><strong>Example:</strong></p>



<pre class="wp-block-code"><code>add_action('launchpad_theme_activated', 'configure_theme', 10, 1);

function configure_theme($theme_slug) {
    if ($theme_slug === 'launchpad-bundle') {
        <em>// Set theme mods</em>
        set_theme_mod('header_layout', 'centered');
        set_theme_mod('footer_widgets', 3);
    }
}
</code></pre>



<h3 class="wp-block-heading" id="launchpad_branding_applied">launchpad_branding_applied</h3>



<p><strong>Purpose:</strong>&nbsp;Execute code after branding application.</p>



<p><strong>Parameters:</strong></p>



<ul class="wp-block-list">
<li><code>$branding_data</code> (array): Applied branding configuration</li>
</ul>



<p><strong>Example:</strong></p>



<pre class="wp-block-code"><code>add_action('launchpad_branding_applied', 'finalize_branding', 10, 1);

function finalize_branding($branding_data) {
    <em>// Generate custom CSS file</em>
    $css = generate_custom_css($branding_data);
    file_put_contents(
        get_stylesheet_directory() . '/custom-branding.css',
        $css
    );
}
</code></pre>



<h2 class="wp-block-heading" id="rest-api-endpoints-reference">REST API Endpoints Reference</h2>



<p>LaunchPad exposes REST API endpoints for wizard functionality. Useful for custom integrations.</p>



<h3 class="wp-block-heading" id="get-wp-jsonlaunchpadv1recipes">GET /wp-json/launchpad/v1/recipes</h3>



<p><strong>Purpose:</strong>&nbsp;Retrieve available recipes list.</p>



<p><strong>Response:</strong></p>



<pre class="wp-block-code"><code>{
  "success": true,
  "data": &#91;
    {
      "site_type": "blog",
      "name": "Blog / News Site",
      "description": "...",
      "icon": "dashicons-admin-post"
    }
  ]
}
</code></pre>



<h3 class="wp-block-heading" id="post-wp-jsonlaunchpadv1wizardbuild">POST /wp-json/launchpad/v1/wizard/build</h3>



<p><strong>Purpose:</strong>&nbsp;Trigger site build with recipe.</p>



<p><strong>Request Body:</strong></p>



<pre class="wp-block-code"><code>{
  "recipe": "business",
  "branding": {
    "site_name": "My Business",
    "primary_color": "#2563EB"
  }
}
</code></pre>



<p><strong>Response:</strong></p>



<pre class="wp-block-code"><code>{
  "success": true,
  "message": "Site built successfully",
  "data": {
    "pages_created": 5,
    "plugins_installed": 3
  }
}
</code></pre>



<h3 class="wp-block-heading" id="post-wp-jsonlaunchpadv1wizardreset">POST /wp-json/launchpad/v1/wizard/reset</h3>



<p><strong>Purpose:</strong>&nbsp;Reset/remove LaunchPad-created content.</p>



<p><strong>Response:</strong></p>



<pre class="wp-block-code"><code>{
  "success": true,
  "message": "Site reset successfully"
}
</code></pre>



<h2 class="wp-block-heading" id="helper-functions-reference">Helper Functions Reference</h2>



<p>LaunchPad provides utility functions for common tasks.</p>



<h3 class="wp-block-heading" id="launchpadutilshelpersis_pro_active">LaunchPad\Utils\Helpers::is_pro_active()</h3>



<p><strong>Purpose:</strong>&nbsp;Check if Pro version is active.</p>



<p><strong>Returns:</strong>&nbsp;<code>bool</code></p>



<p><strong>Example:</strong></p>



<pre class="wp-block-code"><code>if (\LaunchPad\Utils\Helpers::is_pro_active()) {
    <em>// Pro-only functionality</em>
}
</code></pre>



<h3 class="wp-block-heading" id="launchpadutilshelpersget_recipeslug">LaunchPad\Utils\Helpers::get_recipe($slug)</h3>



<p><strong>Purpose:</strong>&nbsp;Retrieve recipe data by slug.</p>



<p><strong>Parameters:</strong></p>



<ul class="wp-block-list">
<li><code>$slug</code> (string): Recipe identifier</li>
</ul>



<p><strong>Returns:</strong>&nbsp;<code>array|false</code>&nbsp;Recipe data or false if not found</p>



<p><strong>Example:</strong></p>



<pre class="wp-block-code"><code>$recipe = \LaunchPad\Utils\Helpers::get_recipe('business');
if ($recipe) {
    echo $recipe&#91;'name']; <em>// "Business Site"</em>
}
</code></pre>



<h3 class="wp-block-heading" id="launchpadutilsloggerlogmessage-type-data">LaunchPad\Utils\Logger::log($message, $type, $data)</h3>



<p><strong>Purpose:</strong>&nbsp;Add entry to LaunchPad activity log.</p>



<p><strong>Parameters:</strong></p>



<ul class="wp-block-list">
<li><code>$message</code> (string): Log message</li>



<li><code>$type</code> (string): Log type (info, error, warning, success)</li>



<li><code>$data</code> (array): Additional context data</li>
</ul>



<p><strong>Example:</strong></p>



<pre class="wp-block-code"><code>\LaunchPad\Utils\Logger::log(
    'Custom recipe deployed',
    'success',
    array('recipe' =&gt; 'medical', 'pages' =&gt; 5)
);
</code></pre>



<h2 class="wp-block-heading" id="best-practices-for-launchpad-api-reference-usage">Best Practices for LaunchPad API Reference Usage</h2>



<p>Follow these guidelines when using the LaunchPad API.</p>



<h3 class="wp-block-heading" id="use-specific-hook-priorities">Use Specific Hook Priorities</h3>



<p>Control execution order with priorities:</p>



<pre class="wp-block-code"><code><em>// Run before other hooks (priority 5)</em>
add_action('launchpad_after_recipe_build', 'early_setup', 5, 2);

<em>// Run after other hooks (priority 20)</em>
add_action('launchpad_after_recipe_build', 'late_setup', 20, 2);
</code></pre>



<h3 class="wp-block-heading" id="always-return-filtered-values">Always Return Filtered Values</h3>



<p>Filters must return values:</p>



<pre class="wp-block-code"><code><em>// CORRECT</em>
add_filter('launchpad_plugin_list', function($plugins) {
    $plugins&#91;] = 'new-plugin';
    return $plugins; <em>// Must return</em>
});

<em>// WRONG - doesn't return</em>
add_filter('launchpad_plugin_list', function($plugins) {
    $plugins&#91;] = 'new-plugin';
    <em>// Missing return!</em>
});
</code></pre>



<h3 class="wp-block-heading" id="check-conditions-before-acting">Check Conditions Before Acting</h3>



<p>Verify context before executing:</p>



<pre class="wp-block-code"><code>add_action('launchpad_page_created', 'my_function', 10, 3);

function my_function($page_id, $page_slug, $recipe_slug) {
    <em>// Check specific conditions</em>
    if ($page_slug !== 'home' || $recipe_slug !== 'business') {
        return; <em>// Don't run for other pages/recipes</em>
    }

    <em>// Your code here</em>
}
</code></pre>



<h3 class="wp-block-heading" id="namespace-custom-functions">Namespace Custom Functions</h3>



<p>Avoid naming conflicts:</p>



<pre class="wp-block-code"><code><em>// Good - prefixed</em>
function mycompany_custom_recipe() { }

<em>// Better - namespaced</em>
namespace MyCompany\LaunchPad;
function custom_recipe() { }
</code></pre>



<h2 class="wp-block-heading" id="key-takeaways">Key Takeaways</h2>



<ul class="wp-block-list">
<li>LaunchPad API reference provides <code>launchpad_custom_recipes</code> filter for adding recipes, <code>launchpad_after_recipe_build</code> action for post-build customization, and REST API endpoints for programmatic control</li>



<li>Always use filters (return modified values) vs actions (execute code without return) appropriately; filters modify data, actions perform operations</li>



<li>Best practices include setting specific hook priorities, checking conditions before execution, and namespacing custom functions to avoid conflicts</li>
</ul>



<h2 class="wp-block-heading" id="extend-launchpad-systematically">Extend LaunchPad Systematically</h2>



<p>You&#8217;ve learned comprehensive LaunchPad API documentation covering filters, actions, REST endpoints, helper functions, and best practices. Using these documented APIs ensures your customizations survive updates while enabling powerful extensions.</p>



<p>Whether building custom recipes, integrating with third-party plugins, or creating client-specific functionality, the LaunchPad API provides clean, maintainable extension points.</p>



<p><strong>Ready to build on LaunchPad?</strong> Explore the <a href="https://github.com/krasenslavov/launchpad-lite">LaunchPad GitHub</a><a href="https://launchpadplugin.com/downloads/launchpad-lite/"> </a><a href="https://github.com/krasenslavov/launchpad-lite">repository</a> for complete source code and additional examples. For Pro API features and advanced integrations, explore <a href="https://launchpadplugin.com/#pricing">LaunchPad Pro</a>.</p>
<p>The post <a href="https://launchpadplugin.com/blog/launchpad-api-reference-hooks-filters-and-actions-guide/">LaunchPad API Reference: Hooks, Filters, and Actions Guide</a> appeared first on <a href="https://launchpadplugin.com">LaunchPad</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://launchpadplugin.com/blog/launchpad-api-reference-hooks-filters-and-actions-guide/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Extending LaunchPad with Custom Post Types and Advanced Content</title>
		<link>https://launchpadplugin.com/blog/extending-launchpad-with-custom-post-types-and-advanced-content/</link>
					<comments>https://launchpadplugin.com/blog/extending-launchpad-with-custom-post-types-and-advanced-content/#respond</comments>
		
		<dc:creator><![CDATA[Krasen Slavov]]></dc:creator>
		<pubDate>Fri, 20 Mar 2026 15:41:48 +0000</pubDate>
				<category><![CDATA[Developer Resources]]></category>
		<guid isPermaLink="false">https://launchpadplugin.com/?p=319</guid>

					<description><![CDATA[<p>LaunchPad creates standard WordPress pages and posts during recipe deployment, but many projects require specialized content types—portfolio projects, team member profiles, product catalogs, testimonials, case studies.</p>
<p>The post <a href="https://launchpadplugin.com/blog/extending-launchpad-with-custom-post-types-and-advanced-content/">Extending LaunchPad with Custom Post Types and Advanced Content</a> appeared first on <a href="https://launchpadplugin.com">LaunchPad</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>LaunchPad creates standard WordPress pages and posts during recipe deployment, but many projects require specialized content types—portfolio projects, team member profiles, product catalogs, testimonials, case studies. These aren&#8217;t standard pages or blog posts; they&#8217;re structured data needing custom fields, taxonomies, and templates. Extending LaunchPad with custom post types unlocks these advanced content structures.</p>



<p>WordPress custom post types power sophisticated websites beyond blogs and brochure sites. According to&nbsp;<a href="https://developer.wordpress.org/">WordPress development surveys</a>, 73% of complex WordPress sites use custom post types for specialized content. LaunchPad custom post types integration requires understanding both WordPress CPT APIs and LaunchPad&#8217;s extensibility hooks.</p>



<p>This advanced developer guide reveals complete custom post type integration including registering custom post types in recipes, taxonomy implementation for organization, Advanced Custom Fields integration, LaunchPad theme template hierarchy, WooCommerce e-commerce integration, and portfolio and directory site patterns. Master these techniques and you&#8217;ll build sophisticated websites extending far beyond LaunchPad&#8217;s default capabilities.</p>



<h2 class="wp-block-heading" id="understanding-custom-post-types">Understanding Custom Post Types</h2>



<p>Before integrating with LaunchPad, understand WordPress custom post type fundamentals.</p>



<h3 class="wp-block-heading" id="what-are-custom-post-types">What Are Custom Post Types</h3>



<p>WordPress includes default post types: posts (blog articles), pages (static content), attachments (media), revisions (content history).</p>



<p>Custom post types add specialized content: portfolios (design work, case studies), testimonials (client reviews with structured fields), team members (staff profiles with contact info), products (e-commerce items), events (calendar listings), properties (real estate listings).</p>



<p>Each custom post type operates like posts/pages but with specific fields, taxonomies, and templates.</p>



<h3 class="wp-block-heading" id="when-to-use-custom-post-types">When to Use Custom Post Types</h3>



<p>Use CPTs for content that: repeats with consistent structure (all team members have name, title, bio, photo), needs special organization (taxonomies like project-type, skill), requires custom fields (testimonial author, company, rating), displays differently than posts/pages (portfolio grid vs. blog list).</p>



<p>Don&#8217;t create CPTs for: one-time unique content (use pages), simple lists (use posts with categories), data better suited for plugins (forms, bookings).</p>



<h3 class="wp-block-heading" id="custom-post-types-in-launchpad-context">Custom Post Types in LaunchPad Context</h3>



<p>LaunchPad recipes can: include CPT registration code, create sample CPT content, configure CPT taxonomies, set up CPT templates in theme.</p>



<p>Integration requires both PHP (registration) and theme support (templates).</p>



<h2 class="wp-block-heading" id="registering-custom-post-types-for-launchpad">Registering Custom Post Types for LaunchPad</h2>



<p>Multiple approaches exist for LaunchPad custom post types registration.</p>



<h3 class="wp-block-heading" id="plugin-based-registration-recommended">Plugin-Based Registration (Recommended)</h3>



<p>Best practice: create dedicated plugin for CPT registration. This separates functionality from theme, surviving theme changes.</p>



<p>Example plugin structure:</p>



<pre class="wp-block-code"><code>&lt;?php
<em>/**
 * Plugin Name: LaunchPad Custom Post Types
 * Description: Adds Portfolio, Testimonials, and Team CPTs
 * Version: 1.0.0
 */</em>

<em>// Register Portfolio CPT</em>
function launchpad_register_portfolio() {
    $args = array(
        'public' =&gt; true,
        'label' =&gt; 'Portfolio',
        'labels' =&gt; array(
            'name' =&gt; 'Portfolio',
            'singular_name' =&gt; 'Portfolio Item',
            'add_new_item' =&gt; 'Add New Project'
        ),
        'supports' =&gt; array('title', 'editor', 'thumbnail', 'excerpt'),
        'has_archive' =&gt; true,
        'rewrite' =&gt; array('slug' =&gt; 'portfolio'),
        'show_in_rest' =&gt; true,
        'menu_icon' =&gt; 'dashicons-portfolio'
    );
    register_post_type('portfolio', $args);
}
add_action('init', 'launchpad_register_portfolio');
</code></pre>



<h3 class="wp-block-heading" id="recipe-triggered-registration">Recipe-Triggered Registration</h3>



<p>Alternative: trigger CPT registration only when specific recipe is used:</p>



<pre class="wp-block-code"><code>add_action('launchpad_after_recipe_build', 'activate_portfolio_cpt', 10, 2);

function activate_portfolio_cpt($recipe_slug, $branding_data) {
    if ($recipe_slug === 'portfolio') {
        <em>// Activate CPT plugin or register CPT</em>
        launchpad_register_portfolio();
        flush_rewrite_rules(); <em>// Important!</em>
    }
}
</code></pre>



<p>This activates LaunchPad custom post types only for recipes needing them.</p>



<h3 class="wp-block-heading" id="functionsphp-registration-not-recommended">Functions.php Registration (Not Recommended)</h3>



<p>Possible but problematic:</p>



<pre class="wp-block-code"><code><em>// In theme functions.php</em>
add_action('init', 'theme_register_cpt');
</code></pre>



<p>Problem: Switching themes loses CPT registration, breaking content access. Always use plugin approach.</p>



<h2 class="wp-block-heading" id="taxonomy-implementation">Taxonomy Implementation</h2>



<p>Custom post types often need custom taxonomies for organization.</p>



<h3 class="wp-block-heading" id="creating-custom-taxonomies">Creating Custom Taxonomies</h3>



<p>Portfolio needs project categories and skills taxonomies:</p>



<pre class="wp-block-code"><code>function launchpad_register_portfolio_taxonomies() {
    <em>// Project Categories</em>
    register_taxonomy('project-category', 'portfolio', array(
        'hierarchical' =&gt; true,
        'label' =&gt; 'Project Categories',
        'show_in_rest' =&gt; true,
        'rewrite' =&gt; array('slug' =&gt; 'project-category')
    ));

    <em>// Skills</em>
    register_taxonomy('skill', 'portfolio', array(
        'hierarchical' =&gt; false, // Like tags
        'label' =&gt; 'Skills',
        'show_in_rest' =&gt; true,
        'rewrite' =&gt; array('slug' =&gt; 'skill')
    ));
}
add_action('init', 'launchpad_register_portfolio_taxonomies');
</code></pre>



<p>Hierarchical taxonomies work like categories (parent/child). Non-hierarchical work like tags.</p>



<h3 class="wp-block-heading" id="taxonomy-integration-with-launchpad">Taxonomy Integration with LaunchPad</h3>



<p>Create default taxonomy terms during recipe build:</p>



<pre class="wp-block-code"><code>add_action('launchpad_after_recipe_build', 'create_portfolio_terms', 10, 2);

function create_portfolio_terms($recipe_slug, $branding_data) {
    if ($recipe_slug === 'portfolio') {
        $categories = &#91;'Web Design', 'Brand Identity', 'UI/UX', 'Development'];
        foreach ($categories as $category) {
            if (!term_exists($category, 'project-category')) {
                wp_insert_term($category, 'project-category');
            }
        }

        $skills = &#91;'Photoshop', 'Illustrator', 'WordPress', 'React'];
        foreach ($skills as $skill) {
            if (!term_exists($skill, 'skill')) {
                wp_insert_term($skill, 'skill');
            }
        }
    }
}
</code></pre>



<p>Users get pre-populated taxonomies, ready to use.</p>



<h2 class="wp-block-heading" id="advanced-custom-fields-integration">Advanced Custom Fields Integration</h2>



<p>Custom fields add structured data to LaunchPad custom post types.</p>



<h3 class="wp-block-heading" id="acf-plugin-configuration">ACF Plugin Configuration</h3>



<p>Advanced Custom Fields (ACF) provides GUI for custom field management. Better than manual meta box coding for most use cases.</p>



<p>Example: Testimonial CPT with ACF fields:</p>



<pre class="wp-block-code"><code><em>// Register Testimonial CPT</em>
function launchpad_register_testimonials() {
    register_post_type('testimonial', array(
        'public' =&gt; true,
        'label' =&gt; 'Testimonials',
        'supports' =&gt; array('title', 'editor', 'thumbnail'),
        'menu_icon' =&gt; 'dashicons-format-quote'
    ));
}
add_action('init', 'launchpad_register_testimonials');
</code></pre>



<p>Then configure ACF field group (via UI or code): Client Name (text), Company (text), Position (text), Website (URL), Rating (number 1-5), Featured (true/false).</p>



<h3 class="wp-block-heading" id="programmatic-acf-field-registration">Programmatic ACF Field Registration</h3>



<p>For LaunchPad custom post types recipes, register ACF fields programmatically:</p>



<pre class="wp-block-code"><code>add_action('acf/init', 'launchpad_register_testimonial_fields');

function launchpad_register_testimonial_fields() {
    acf_add_local_field_group(array(
        'key' =&gt; 'group_testimonial',
        'title' =&gt; 'Testimonial Details',
        'fields' =&gt; array(
            array(
                'key' =&gt; 'field_client_name',
                'label' =&gt; 'Client Name',
                'name' =&gt; 'client_name',
                'type' =&gt; 'text',
                'required' =&gt; 1,
            ),
            array(
                'key' =&gt; 'field_company',
                'label' =&gt; 'Company',
                'name' =&gt; 'company',
                'type' =&gt; 'text',
            ),
            array(
                'key' =&gt; 'field_rating',
                'label' =&gt; 'Rating',
                'name' =&gt; 'rating',
                'type' =&gt; 'number',
                'min' =&gt; 1,
                'max' =&gt; 5,
            ),
        ),
        'location' =&gt; array(
            array(
                array(
                    'param' =&gt; 'post_type',
                    'operator' =&gt; '==',
                    'value' =&gt; 'testimonial',
                ),
            ),
        ),
    ));
}
</code></pre>



<p>Fields appear automatically when editing testimonials.</p>



<h3 class="wp-block-heading" id="displaying-acf-data-in-templates">Displaying ACF Data in Templates</h3>



<p>Access ACF fields in templates:</p>



<pre class="wp-block-code"><code><em>// In single-testimonial.php or archive</em>
$client_name = get_field('client_name');
$company = get_field('company');
$rating = get_field('rating');

echo '&lt;h2&gt;' . esc_html($client_name) . '&lt;/h2&gt;';
echo '&lt;p&gt;' . esc_html($company) . '&lt;/p&gt;';
echo '&lt;div class="rating"&gt;' . str_repeat('⭐', $rating) . '&lt;/div&gt;';
</code></pre>



<h2 class="wp-block-heading" id="theme-template-hierarchy">Theme Template Hierarchy</h2>



<p>WordPress uses template hierarchy for displaying custom post types. LaunchPad Bundle theme should support common CPT templates.</p>



<h3 class="wp-block-heading" id="required-template-files">Required Template Files</h3>



<p>For portfolio CPT, create:&nbsp;<code>archive-portfolio.php</code>&nbsp;(portfolio listing page),&nbsp;<code>single-portfolio.php</code>&nbsp;(individual project page),&nbsp;<code>taxonomy-project-category.php</code>&nbsp;(category archive),&nbsp;<code>taxonomy-skill.php</code>&nbsp;(skill archive).</p>



<h3 class="wp-block-heading" id="template-example-portfolio-archive">Template Example: Portfolio Archive</h3>



<pre class="wp-block-code"><code>&lt;?php
<em>/**
 * Template: archive-portfolio.php
 * Portfolio Archive Page
 */</em>

get_header(); ?&gt;

&lt;div class="portfolio-archive"&gt;
    &lt;h1&gt;&lt;?php post_type_archive_title(); ?&gt;&lt;/h1&gt;

    &lt;div class="portfolio-grid"&gt;
        &lt;?php if (have_posts()) : while (have_posts()) : the_post(); ?&gt;
            &lt;article class="portfolio-item"&gt;
                &lt;?php if (has_post_thumbnail()) : ?&gt;
                    &lt;a href="&lt;?php the_permalink(); ?&gt;"&gt;
                        &lt;?php the_post_thumbnail('medium'); ?&gt;
                    &lt;/a&gt;
                &lt;?php endif; ?&gt;

                &lt;h2&gt;&lt;a href="&lt;?php the_permalink(); ?&gt;"&gt;&lt;?php the_title(); ?&gt;&lt;/a&gt;&lt;/h2&gt;

                &lt;?php
                $categories = get_the_terms(get_the_ID(), 'project-category');
                if ($categories) :
                    echo '&lt;div class="project-categories"&gt;';
                    foreach ($categories as $category) {
                        echo '&lt;span&gt;' . esc_html($category-&gt;name) . '&lt;/span&gt; ';
                    }
                    echo '&lt;/div&gt;';
                endif;
                ?&gt;

                &lt;?php the_excerpt(); ?&gt;
            &lt;/article&gt;
        &lt;?php endwhile; endif; ?&gt;
    &lt;/div&gt;

    &lt;?php the_posts_pagination(); ?&gt;
&lt;/div&gt;

&lt;?php get_footer(); ?&gt;
</code></pre>



<h3 class="wp-block-heading" id="launchpad-theme-integration">LaunchPad Theme Integration</h3>



<p>Ensure LaunchPad Bundle theme includes CPT templates or document how users add them via child theme.</p>



<h2 class="wp-block-heading" id="woocommerce-integration">WooCommerce Integration</h2>



<p>E-commerce recipes need WooCommerce, WordPress&#8217;s most popular shop plugin.</p>



<h3 class="wp-block-heading" id="including-woocommerce-in-recipes">Including WooCommerce in Recipes</h3>



<p>Add WooCommerce to recipe plugins array:</p>



<pre class="wp-block-code"><code>"plugins": &#91;"woocommerce", "wordpress-seo", "contact-form-7"]
</code></pre>



<p>LaunchPad installs and activates WooCommerce.</p>



<h3 class="wp-block-heading" id="post-installation-woocommerce-setup">Post-Installation WooCommerce Setup</h3>



<p>WooCommerce requires setup wizard. Automate via LaunchPad hooks:</p>



<pre class="wp-block-code"><code>add_action('launchpad_after_recipe_build', 'setup_woocommerce', 10, 2);

function setup_woocommerce($recipe_slug, $branding_data) {
    if ($recipe_slug === 'ecommerce') {
        <em>// Mark WooCommerce setup as complete</em>
        update_option('woocommerce_onboarding_profile', array(
            'completed' =&gt; true
        ));

        <em>// Set default currency</em>
        update_option('woocommerce_currency', 'USD');

        <em>// Create default pages if they don't exist</em>
        WC_Install::create_pages();

        <em>// Configure payment methods</em>
        <em>// Configure shipping methods</em>
        <em>// Set tax settings</em>
    }
}
</code></pre>



<h3 class="wp-block-heading" id="product-import">Product Import</h3>



<p>Create sample products for e-commerce recipes:</p>



<pre class="wp-block-code"><code>function launchpad_create_sample_products() {
    $sample_products = array(
        array(
            'title' =&gt; 'Sample Product 1',
            'description' =&gt; 'This is a sample product',
            'price' =&gt; '29.99',
            'sku' =&gt; 'SAMPLE-001'
        ),
        <em>// More products...</em>
    );

    foreach ($sample_products as $product_data) {
        $product = new WC_Product_Simple();
        $product-&gt;set_name($product_data&#91;'title']);
        $product-&gt;set_description($product_data&#91;'description']);
        $product-&gt;set_regular_price($product_data&#91;'price']);
        $product-&gt;set_sku($product_data&#91;'sku']);
        $product-&gt;save();
    }
}
</code></pre>



<h2 class="wp-block-heading" id="portfolio-and-directory-site-patterns">Portfolio and Directory Site Patterns</h2>



<p>Common use cases for LaunchPad custom post types.</p>



<h3 class="wp-block-heading" id="portfolio-site-implementation">Portfolio Site Implementation</h3>



<p>Full portfolio site needs: portfolio CPT with project categories and skills, single project template with galleries, filterable portfolio grid, case study layout, client testimonials integration.</p>



<p>Package as complete solution in custom recipe.</p>



<h3 class="wp-block-heading" id="directory-site-implementation">Directory Site Implementation</h3>



<p>Directory (business listings, member directory, resource database) needs: directory CPT (listings), location taxonomy (geographic organization), category taxonomy (listing types), custom fields (address, phone, website, hours), search and filtering, Google Maps integration.</p>



<p>More complex than portfolio but follows same patterns.</p>



<h2 class="wp-block-heading" id="key-takeaways">Key Takeaways</h2>



<ul class="wp-block-list">
<li>LaunchPad custom post types should be registered via dedicated plugin (not theme functions.php) to survive theme changes and maintain content access</li>



<li>Integrate CPTs with recipes using <code>launchpad_after_recipe_build</code> hook to register post types, taxonomies, and create default terms programmatically</li>



<li>Advanced Custom Fields (ACF) provides GUI-based custom field management; register fields programmatically for recipe deployments ensuring consistent structure</li>
</ul>



<h2 class="wp-block-heading" id="extend-launchpad-for-advanced-content">Extend LaunchPad for Advanced Content</h2>



<p>You&#8217;ve learned comprehensive techniques for integrating LaunchPad custom post types covering CPT registration, taxonomy implementation, ACF integration, template development, and WooCommerce e-commerce. These techniques enable sophisticated websites far beyond standard blogs and brochure sites.</p>



<p>Whether building portfolios, directories, e-commerce stores, or specialized content platforms, custom post types integrated with LaunchPad provide scalable, maintainable solutions.</p>



<p><strong>Ready to build advanced LaunchPad integrations?</strong> Study the <a href="https://launchpadplugin.com/downloads/launchpad-lite/">WordPress Custom Post Type documentation</a> and experiment with recipe extensions. For Pro features supporting advanced content types, explore <a href="https://launchpadplugin.com/#pricing">LaunchPad Pro</a>.</p>
<p>The post <a href="https://launchpadplugin.com/blog/extending-launchpad-with-custom-post-types-and-advanced-content/">Extending LaunchPad with Custom Post Types and Advanced Content</a> appeared first on <a href="https://launchpadplugin.com">LaunchPad</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://launchpadplugin.com/blog/extending-launchpad-with-custom-post-types-and-advanced-content/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Creating Custom LaunchPad Recipes: Complete Developer Guide</title>
		<link>https://launchpadplugin.com/blog/creating-custom-launchpad-recipes-complete-developer-guide/</link>
					<comments>https://launchpadplugin.com/blog/creating-custom-launchpad-recipes-complete-developer-guide/#respond</comments>
		
		<dc:creator><![CDATA[Krasen Slavov]]></dc:creator>
		<pubDate>Fri, 20 Feb 2026 15:41:37 +0000</pubDate>
				<category><![CDATA[Developer Resources]]></category>
		<guid isPermaLink="false">https://launchpadplugin.com/?p=318</guid>

					<description><![CDATA[<p>LaunchPad ships with built-in recipes for blogs, businesses, and portfolios (plus additional Pro recipes), but many developers need custom recipes for specific industries, client niches, or unique requirements.</p>
<p>The post <a href="https://launchpadplugin.com/blog/creating-custom-launchpad-recipes-complete-developer-guide/">Creating Custom LaunchPad Recipes: Complete Developer Guide</a> appeared first on <a href="https://launchpadplugin.com">LaunchPad</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>LaunchPad ships with built-in recipes for blogs, businesses, and portfolios (plus additional Pro recipes), but many developers need custom recipes for specific industries, client niches, or unique requirements. A custom real estate recipe. A nonprofit recipe. A photography studio recipe with portfolio galleries. Creating these custom LaunchPad recipes unlocks LaunchPad&#8217;s full potential for specialized use cases.</p>



<p>The recipe system is extensible by design—developers can add unlimited custom recipes that appear alongside built-in options. According to&nbsp;<a href="https://wordpress.org/about/stats/">WordPress developer surveys</a>, 68% of developers customize plugins for client-specific needs. LaunchPad makes customization systematic through documented APIs and filters.</p>



<p>This advanced developer guide reveals complete custom LaunchPad recipes creation including recipe JSON format and structure, PHP hooks and filters available, custom page template implementation, branding field configuration, plugin and theme recommendations, content template variables, and distribution methods. Master these concepts and you&#8217;ll create specialized recipes solving specific industry problems.</p>



<h2 class="wp-block-heading" id="understanding-recipe-structure">Understanding Recipe Structure</h2>



<p>Before creating custom recipes, understand how LaunchPad processes recipe data during site setup.</p>



<h3 class="wp-block-heading" id="recipe-file-location">Recipe File Location</h3>



<p>LaunchPad loads recipes from:&nbsp;<code>launchpad-lite/recipes/</code>&nbsp;(built-in free recipes),&nbsp;<code>launchpad-pro/recipes/</code>&nbsp;(built-in Pro recipes), custom plugin via&nbsp;<code>launchpad_custom_recipes</code>&nbsp;filter (developer recipes).</p>



<p>The filter approach is cleanest—create dedicated plugin containing custom recipes, avoiding core plugin modifications.</p>



<h3 class="wp-block-heading" id="json-recipe-format">JSON Recipe Format</h3>



<p>Recipes are JSON files with standardized structure:</p>



<pre class="wp-block-code"><code>{
  "site_type": "real-estate",
  "name": "Real Estate Agency",
  "description": "Complete real estate website with property listings",
  "icon": "dashicons-admin-home",
  "category": "business",
  "pro_only": false,
  "theme": "launchpad-bundle",
  "theme_options": { },
  "plugins": &#91;"wordpress-seo", "contact-form-7"],
  "pages": &#91;"home", "listings", "about", "contact"],
  "options": { },
  "features": &#91; ],
  "branding": { },
  "content_templates": { },
  "branding_fields": &#91; ]
}
</code></pre>



<p>Each property serves specific purpose in site generation.</p>



<h3 class="wp-block-heading" id="required-vs-optional-fields">Required vs. Optional Fields</h3>



<p>Required recipe properties:&nbsp;<code>site_type</code>&nbsp;(unique identifier, slug format),&nbsp;<code>name</code>&nbsp;(display name in wizard),&nbsp;<code>description</code>&nbsp;(shown to users),&nbsp;<code>pages</code>&nbsp;(array of pages to create).</p>



<p>Optional but recommended:&nbsp;<code>icon</code>&nbsp;(Dashicon class for visual identification),&nbsp;<code>category</code>&nbsp;(grouping in UI),&nbsp;<code>theme</code>&nbsp;(recommended theme),&nbsp;<code>plugins</code>&nbsp;(recommended plugins list),&nbsp;<code>theme_options</code>&nbsp;(Customizer preset values),&nbsp;<code>branding_fields</code>&nbsp;(custom input fields).</p>



<p>Pro-specific:&nbsp;<code>pro_only</code>&nbsp;(boolean, requires valid Pro license), AI-related properties (Pro feature configurations).</p>



<h2 class="wp-block-heading" id="creating-your-first-custom-recipe">Creating Your First Custom Recipe</h2>



<p>Step-by-step process for custom LaunchPad recipes development.</p>



<h3 class="wp-block-heading" id="recipe-planning-worksheet">Recipe Planning Worksheet</h3>



<p>Before coding, document: target industry/niche (who is this for?), unique requirements (what makes this different from standard recipes?), required pages (what pages does this site type need?), recommended plugins (what functionality is essential?), branding elements (what customization options should users have?).</p>



<p>Example: Real Estate Recipe planning: Target: real estate agents and agencies. Unique: property listings, agent profiles, IDX integration. Pages: home, listings, featured properties, agents, about, contact, testimonials. Plugins: IMPress Listings, Yoast Local SEO, WPForms. Branding: office location, license numbers, MLS affiliations.</p>



<h3 class="wp-block-heading" id="creating-recipe-json-file">Creating Recipe JSON File</h3>



<p>Create&nbsp;<code>real-estate.json</code>&nbsp;in your custom plugin:</p>



<pre class="wp-block-code"><code>{
  "site_type": "real-estate",
  "name": "Real Estate Agency",
  "description": "Professional real estate website with property listings, agent profiles, and lead generation forms. Optimized for real estate professionals and agencies.",
  "icon": "dashicons-admin-home",
  "category": "business",
  "pro_only": false,
  "theme": "launchpad-bundle",
  "plugins": &#91;
    "wordpress-seo",
    "contact-form-7",
    "impress-listings"
  ],
  "pages": &#91;
    "home",
    "listings",
    "featured-properties",
    "our-agents",
    "about",
    "contact",
    "testimonials"
  ]
}
</code></pre>



<p>Start simple. Add complexity incrementally.</p>



<h3 class="wp-block-heading" id="registering-recipe-via-filter">Registering Recipe via Filter</h3>



<p>Create plugin to register your recipe:</p>



<pre class="wp-block-code"><code>&lt;?php
<em>/**
 * Plugin Name: Custom LaunchPad Recipes
 * Description: Adds real estate recipe to LaunchPad
 * Version: 1.0.0
 */</em>

add_filter('launchpad_custom_recipes', 'add_real_estate_recipe');

function add_real_estate_recipe($recipes) {
    $recipe_file = plugin_dir_path(__FILE__) . 'recipes/real-estate.json';

    if (file_exists($recipe_file)) {
        $recipe_data = json_decode(file_get_contents($recipe_file), true);
        if ($recipe_data) {
            $recipes&#91;] = $recipe_data;
        }
    }

    return $recipes;
}
</code></pre>



<p>Activate plugin, your custom LaunchPad recipe appears in wizard.</p>



<h2 class="wp-block-heading" id="advanced-recipe-features">Advanced Recipe Features</h2>



<p>Beyond basic structure, recipes support advanced customization.</p>



<h3 class="wp-block-heading" id="theme-options-configuration">Theme Options Configuration</h3>



<p>Pre-configure Customizer settings via&nbsp;<code>theme_options</code>:</p>



<pre class="wp-block-code"><code>"theme_options": {
  "primary_color": "#2563EB",
  "secondary_color": "#7C3AED",
  "hero_layout": "split",
  "show_breadcrumbs": true,
  "homepage_sections": {
    "hero": true,
    "services": true,
    "testimonials": true,
    "cta": true
  }
}
</code></pre>



<p>These apply automatically during setup, configuring theme without manual Customizer work.</p>



<h3 class="wp-block-heading" id="content-templates-with-variables">Content Templates with Variables</h3>



<p>Define page content templates using variables replaced during setup:</p>



<pre class="wp-block-code"><code>"content_templates": {
  "home": {
    "title": "Find Your Dream Home with {{site_name}}",
    "content": "&lt;p&gt;Welcome to {{site_name}}, your trusted real estate partner in {{city}}. We specialize in helping you find the perfect home.&lt;/p&gt;"
  }
}
</code></pre>



<p>Variables like&nbsp;<code>{{site_name}}</code>,&nbsp;<code>{{city}}</code>,&nbsp;<code>{{tagline}}</code>&nbsp;get replaced with user-provided values.</p>



<h3 class="wp-block-heading" id="custom-branding-fields">Custom Branding Fields</h3>



<p>Collect industry-specific information via branding fields:</p>



<pre class="wp-block-code"><code>"branding_fields": &#91;
  {
    "id": "office_location",
    "label": "Office Location",
    "type": "text",
    "placeholder": "123 Main St, City, State",
    "required": true
  },
  {
    "id": "license_number",
    "label": "Real Estate License Number",
    "type": "text",
    "required": false
  },
  {
    "id": "mls_affiliation",
    "label": "MLS Affiliation",
    "type": "select",
    "options": &#91;"NCAR", "GCAR", "TCAR"],
    "required": false
  }
]
</code></pre>



<p>These fields appear in wizard, values accessible via&nbsp;<code>get_option('launchpad_branding_data')</code>.</p>



<h2 class="wp-block-heading" id="php-hooks-and-filters">PHP Hooks and Filters</h2>



<p>LaunchPad provides hooks for programmatic recipe customization.</p>



<h3 class="wp-block-heading" id="available-filter-hooks">Available Filter Hooks</h3>



<p>Key filters for custom LaunchPad recipes:&nbsp;<code>launchpad_custom_recipes</code>&nbsp;(add recipes),&nbsp;<code>launchpad_recipe_data</code>&nbsp;(modify recipe before processing),&nbsp;<code>launchpad_page_content</code>&nbsp;(customize generated page content),&nbsp;<code>launchpad_plugin_list</code>&nbsp;(modify recommended plugins),&nbsp;<code>launchpad_theme_options</code>&nbsp;(adjust theme settings).</p>



<p>Example modifying recipe data:</p>



<pre class="wp-block-code"><code>add_filter('launchpad_recipe_data', 'customize_recipe_for_client', 10, 2);

function customize_recipe_for_client($recipe_data, $recipe_slug) {
    if ($recipe_slug === 'real-estate') {
        <em>// Add client-specific plugin</em>
        $recipe_data&#91;'plugins']&#91;] = 'custom-idx-integration';
    }
    return $recipe_data;
}
</code></pre>



<h3 class="wp-block-heading" id="action-hooks">Action Hooks</h3>



<p>Available actions:&nbsp;<code>launchpad_before_recipe_build</code>&nbsp;(runs before site generation),&nbsp;<code>launchpad_after_recipe_build</code>&nbsp;(runs after completion),&nbsp;<code>launchpad_page_created</code>&nbsp;(runs after each page creation),&nbsp;<code>launchpad_plugin_installed</code>&nbsp;(runs after each plugin installation).</p>



<p>Example post-build actions:</p>



<pre class="wp-block-code"><code>add_action('launchpad_after_recipe_build', 'setup_real_estate_data', 10, 2);

function setup_real_estate_data($recipe_slug, $branding_data) {
    if ($recipe_slug === 'real-estate') {
        <em>// Create sample listings</em>
        <em>// Configure IDX settings</em>
        <em>// Set up lead capture forms</em>
    }
}
</code></pre>



<h2 class="wp-block-heading" id="page-template-system">Page Template System</h2>



<p>Recipes define which pages to create. Control page content via templates.</p>



<h3 class="wp-block-heading" id="page-slug-definitions">Page Slug Definitions</h3>



<p>Pages array in JSON uses slugs:&nbsp;<code>"pages": ["home", "services", "about", "contact"]</code></p>



<p>LaunchPad matches slugs to internal templates. For custom pages, provide content via&nbsp;<code>content_templates</code>.</p>



<h3 class="wp-block-heading" id="custom-page-content">Custom Page Content</h3>



<p>Define custom page content in recipe:</p>



<pre class="wp-block-code"><code>"content_templates": {
  "featured-properties": {
    "title": "Featured Properties",
    "content": "&lt;p&gt;Browse our hand-picked selection of exceptional properties.&lt;/p&gt;&#91;property_listings featured='true']",
    "template": "page-properties.php"
  }
}
</code></pre>



<p>Supports shortcodes, HTML, variables.</p>



<h3 class="wp-block-heading" id="template-hierarchy">Template Hierarchy</h3>



<p>LaunchPad checks for page templates in order: recipe&nbsp;<code>content_templates</code>&nbsp;definition, theme-specific template file, LaunchPad default template, WordPress default page.</p>



<p>Create theme templates matching recipe pages for full control.</p>



<h2 class="wp-block-heading" id="plugin-and-theme-recommendations">Plugin and Theme Recommendations</h2>



<p>Recipes recommend plugins and themes. Users can accept or decline.</p>



<h3 class="wp-block-heading" id="plugin-array-format">Plugin Array Format</h3>



<p>Specify plugins by slug:&nbsp;<code>"plugins": ["wordpress-seo", "contact-form-7", "impress-listings"]</code></p>



<p>LaunchPad attempts installation from WordPress.org. For custom plugins, use hooks to handle installation differently.</p>



<h3 class="wp-block-heading" id="required-vs-optional-plugins">Required vs. Optional Plugins</h3>



<p>Distinguish plugin importance:</p>



<pre class="wp-block-code"><code>"plugins": {
  "required": &#91;"wordpress-seo", "contact-form-7"],
  "recommended": &#91;"impress-listings", "wpforms-lite"],
  "optional": &#91;"elementor", "wp-rocket"]
}
</code></pre>



<p>(Note: This extended format requires custom handling via filters)</p>



<h3 class="wp-block-heading" id="theme-specifications">Theme Specifications</h3>



<p>Recommend specific themes:&nbsp;<code>"theme": "launchpad-bundle"</code>&nbsp;(default),&nbsp;<code>"theme": "astra"</code>&nbsp;(WordPress.org theme),&nbsp;<code>"theme": "custom-real-estate-theme"</code>&nbsp;(custom theme).</p>



<p>LaunchPad attempts theme installation if not already available.</p>



<h2 class="wp-block-heading" id="distribution-methods">Distribution Methods</h2>



<p>Share custom LaunchPad recipes with clients or community.</p>



<h3 class="wp-block-heading" id="plugin-distribution">Plugin Distribution</h3>



<p>Package recipes in standalone plugins: create plugin with recipes in&nbsp;<code>/recipes/</code>&nbsp;folder, register via&nbsp;<code>launchpad_custom_recipes</code>&nbsp;filter, distribute as zip file or via WordPress.org.</p>



<p>This keeps recipes separate from LaunchPad core, making updates manageable.</p>



<h3 class="wp-block-heading" id="recipe-marketplace-potential">Recipe Marketplace Potential</h3>



<p>Developers could create: niche-specific recipe plugins, industry template collections, client-specific recipe packages for agencies.</p>



<p>Distribute via WordPress.org, sell via marketplaces, or provide client-exclusive.</p>



<h3 class="wp-block-heading" id="open-source-contributions">Open Source Contributions</h3>



<p>Contribute recipes to LaunchPad project via GitHub pull requests. Widely useful recipes may be included in core or Pro versions.</p>



<h2 class="wp-block-heading" id="key-takeaways">Key Takeaways</h2>



<ul class="wp-block-list">
<li>Custom LaunchPad recipes use JSON format with required fields (site_type, name, description, pages) and optional advanced features (theme_options, branding_fields, content_templates)</li>



<li>Register recipes via <code>launchpad_custom_recipes</code> filter in custom plugin, avoiding core modifications and enabling clean distribution</li>



<li>Advanced features include PHP hooks for programmatic customization (launchpad_after_recipe_build), custom branding fields, and content templates with variable replacement</li>
</ul>



<h2 class="wp-block-heading" id="extend-launchpad-for-your-needs">Extend LaunchPad for Your Needs</h2>



<p>You&#8217;ve learned comprehensive custom LaunchPad recipes development covering JSON structure, PHP integration, advanced features, and distribution methods. Creating custom recipes unlocks LaunchPad for specialized industries and unique client requirements.</p>



<p>Whether building recipes for your agency&#8217;s niche, creating client-specific solutions, or contributing to the community, the recipe system provides flexible, documented APIs.</p>



<p><strong>Ready to create custom recipes?</strong> Study the <a href="https://launchpadplugin.com/downloads/launchpad-lite/">LaunchPad GitHub repository</a> for complete code examples and contribute your recipes back to the community. For Pro features and advanced recipe capabilities, explore <a href="https://launchpadplugin.com/#pricing">LaunchPad Pro</a>.</p>
<p>The post <a href="https://launchpadplugin.com/blog/creating-custom-launchpad-recipes-complete-developer-guide/">Creating Custom LaunchPad Recipes: Complete Developer Guide</a> appeared first on <a href="https://launchpadplugin.com">LaunchPad</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://launchpadplugin.com/blog/creating-custom-launchpad-recipes-complete-developer-guide/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
