<?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>wordpress hooks Archives - Backup Copilot</title>
	<atom:link href="https://backupcopilotplugin.com/blog/tag/wordpress-hooks/feed/" rel="self" type="application/rss+xml" />
	<link>https://backupcopilotplugin.com/blog/tag/wordpress-hooks/</link>
	<description>WordPress Backups Done Right</description>
	<lastBuildDate>Mon, 24 Nov 2025 11:17:04 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://storage.googleapis.com/backupcopilotplugin/2025/11/favicon-alt-150x150.png</url>
	<title>wordpress hooks Archives - Backup Copilot</title>
	<link>https://backupcopilotplugin.com/blog/tag/wordpress-hooks/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Backup Copilot Pro Developer Guide: Hooks, Filters, and Custom Integrations</title>
		<link>https://backupcopilotplugin.com/blog/backup-copilot-pro-developer-guide-hooks-filters-and-custom-integrations/</link>
		
		<dc:creator><![CDATA[Krasen Slavov]]></dc:creator>
		<pubDate>Mon, 15 Dec 2025 09:00:00 +0000</pubDate>
				<category><![CDATA[Developer Resources]]></category>
		<category><![CDATA[api reference]]></category>
		<category><![CDATA[custom integration]]></category>
		<category><![CDATA[developer guide]]></category>
		<category><![CDATA[plugin development]]></category>
		<category><![CDATA[wordpress hooks]]></category>
		<guid isPermaLink="false">https://backupcopilotplugin.com/?p=271</guid>

					<description><![CDATA[<p>Backup Copilot Pro provides dozens of WordPress hooks and filters enabling developers to customize backup behavior, add integrations, and extend functionality without modifying core code.</p>
<p>The post <a href="https://backupcopilotplugin.com/blog/backup-copilot-pro-developer-guide-hooks-filters-and-custom-integrations/">Backup Copilot Pro Developer Guide: Hooks, Filters, and Custom Integrations</a> appeared first on <a href="https://backupcopilotplugin.com">Backup Copilot</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><!-- @format --></p>
<p>Backup Copilot Pro provides dozens of WordPress hooks and filters enabling developers to customize backup behavior, add integrations, and extend functionality without modifying core code. This comprehensive developer reference documents all available hooks with practical examples for common customizations from Slack notifications to custom retention policies.</p>
<h2 id="plugin-architecture-overview">Plugin Architecture Overview</h2>
<p>Backup Copilot Pro follows WordPress plugin development standards with clearly defined extension points:</p>
<p><strong>Action Hooks</strong>: Fire at specific points in backup workflow allowing custom code execution (notifications, logging, external integrations).</p>
<p><strong>Filter Hooks</strong>: Modify data or behavior before processing (exclude files, customize metadata, adjust settings).</p>
<p><strong>API Functions</strong>: Helper functions for accessing plugin functionality programmatically.</p>
<p>All hooks follow <code>bkpc_*</code> naming convention for easy identification and avoiding conflicts.</p>
<h2 id="action-hooks-reference">Action Hooks Reference</h2>
<h3 id="bkpc_before_backup_create">bkpc_before_backup_create</h3>
<p>Fires immediately before backup creation starts.</p>
<p><strong>Parameters</strong>: &#8211; <code>$backup_type</code> (string): Type of backup (“full”, “database”, “files”) &#8211; <code>$options</code> (array): Backup options and settings</p>
<p><strong>Example &#8211; Log Backup Start</strong>:</p>
<div class="sourceCode" id="cb1">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;bkpc_before_backup_create&#39;</span><span class="ot">,</span> <span class="st">&#39;log_backup_start&#39;</span><span class="ot">,</span> <span class="dv">10</span><span class="ot">,</span> <span class="dv">2</span><span class="ot">);</span></span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true"></a></span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true"></a><span class="kw">function</span> log_backup_start<span class="ot">(</span><span class="kw">$backup_type</span><span class="ot">,</span> <span class="kw">$options</span><span class="ot">)</span> {</span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true"></a>    <span class="fu">error_log</span><span class="ot">(</span><span class="fu">sprintf</span><span class="ot">(</span></span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true"></a>        <span class="st">&#39;[Backup] Starting %s backup at %s&#39;</span><span class="ot">,</span></span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true"></a>        <span class="kw">$backup_type</span><span class="ot">,</span></span>
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true"></a>        current_time<span class="ot">(</span><span class="st">&#39;mysql&#39;</span><span class="ot">)</span></span>
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true"></a>    <span class="ot">));</span></span>
<span id="cb1-9"><a href="#cb1-9" aria-hidden="true"></a></span>
<span id="cb1-10"><a href="#cb1-10" aria-hidden="true"></a>    <span class="co">// Notify monitoring system</span></span>
<span id="cb1-11"><a href="#cb1-11" aria-hidden="true"></a>    wp_remote_post<span class="ot">(</span><span class="st">&#39;https://monitoring.example.com/backup-started&#39;</span><span class="ot">,</span> <span class="ot">[</span></span>
<span id="cb1-12"><a href="#cb1-12" aria-hidden="true"></a>        <span class="st">&#39;body&#39;</span> =&gt; <span class="ot">[</span></span>
<span id="cb1-13"><a href="#cb1-13" aria-hidden="true"></a>            <span class="st">&#39;site&#39;</span> =&gt; get_site_url<span class="ot">(),</span></span>
<span id="cb1-14"><a href="#cb1-14" aria-hidden="true"></a>            <span class="st">&#39;type&#39;</span> =&gt; <span class="kw">$backup_type</span><span class="ot">,</span></span>
<span id="cb1-15"><a href="#cb1-15" aria-hidden="true"></a>            <span class="st">&#39;timestamp&#39;</span> =&gt; <span class="fu">time</span><span class="ot">()</span></span>
<span id="cb1-16"><a href="#cb1-16" aria-hidden="true"></a>        <span class="ot">]</span></span>
<span id="cb1-17"><a href="#cb1-17" aria-hidden="true"></a>    <span class="ot">]);</span></span>
<span id="cb1-18"><a href="#cb1-18" aria-hidden="true"></a>}</span></code></pre>
</div>
<h3 id="bkpc_after_backup_create">bkpc_after_backup_create</h3>
<p>Fires after backup creation completes successfully.</p>
<p><strong>Parameters</strong>: &#8211; <code>$backup_uuid</code> (string): Unique backup identifier &#8211; <code>$backup_data</code> (array): Backup details (size, path, duration, etc.)</p>
<p><strong>Example &#8211; Slack Notification</strong>:</p>
<div class="sourceCode" id="cb2">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;bkpc_after_backup_create&#39;</span><span class="ot">,</span> <span class="st">&#39;notify_slack_backup_complete&#39;</span><span class="ot">,</span> <span class="dv">10</span><span class="ot">,</span> <span class="dv">2</span><span class="ot">);</span></span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true"></a></span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true"></a><span class="kw">function</span> notify_slack_backup_complete<span class="ot">(</span><span class="kw">$backup_uuid</span><span class="ot">,</span> <span class="kw">$backup_data</span><span class="ot">)</span> {</span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true"></a>    <span class="kw">$webhook_url</span> = <span class="st">&#39;https://hooks.slack.com/services/YOUR/WEBHOOK/URL&#39;</span><span class="ot">;</span></span>
<span id="cb2-5"><a href="#cb2-5" aria-hidden="true"></a></span>
<span id="cb2-6"><a href="#cb2-6" aria-hidden="true"></a>    <span class="kw">$message</span> = <span class="fu">sprintf</span><span class="ot">(</span></span>
<span id="cb2-7"><a href="#cb2-7" aria-hidden="true"></a>        <span class="st">&#39;:white_check_mark: Backup completed for %s\n&#39;</span> .</span>
<span id="cb2-8"><a href="#cb2-8" aria-hidden="true"></a>        <span class="st">&#39;Type: %s | Size: %s | Duration: %s seconds&#39;</span><span class="ot">,</span></span>
<span id="cb2-9"><a href="#cb2-9" aria-hidden="true"></a>        get_bloginfo<span class="ot">(</span><span class="st">&#39;name&#39;</span><span class="ot">),</span></span>
<span id="cb2-10"><a href="#cb2-10" aria-hidden="true"></a>        <span class="kw">$backup_data</span><span class="ot">[</span><span class="st">&#39;type&#39;</span><span class="ot">],</span></span>
<span id="cb2-11"><a href="#cb2-11" aria-hidden="true"></a>        size_format<span class="ot">(</span><span class="kw">$backup_data</span><span class="ot">[</span><span class="st">&#39;size&#39;</span><span class="ot">]),</span></span>
<span id="cb2-12"><a href="#cb2-12" aria-hidden="true"></a>        <span class="kw">$backup_data</span><span class="ot">[</span><span class="st">&#39;duration&#39;</span><span class="ot">]</span></span>
<span id="cb2-13"><a href="#cb2-13" aria-hidden="true"></a>    <span class="ot">);</span></span>
<span id="cb2-14"><a href="#cb2-14" aria-hidden="true"></a></span>
<span id="cb2-15"><a href="#cb2-15" aria-hidden="true"></a>    wp_remote_post<span class="ot">(</span><span class="kw">$webhook_url</span><span class="ot">,</span> <span class="ot">[</span></span>
<span id="cb2-16"><a href="#cb2-16" aria-hidden="true"></a>        <span class="st">&#39;body&#39;</span> =&gt; <span class="fu">json_encode</span><span class="ot">([</span><span class="st">&#39;text&#39;</span> =&gt; <span class="kw">$message</span><span class="ot">]),</span></span>
<span id="cb2-17"><a href="#cb2-17" aria-hidden="true"></a>        <span class="st">&#39;headers&#39;</span> =&gt; <span class="ot">[</span><span class="st">&#39;Content-Type&#39;</span> =&gt; <span class="st">&#39;application/json&#39;</span><span class="ot">]</span></span>
<span id="cb2-18"><a href="#cb2-18" aria-hidden="true"></a>    <span class="ot">]);</span></span>
<span id="cb2-19"><a href="#cb2-19" aria-hidden="true"></a>}</span></code></pre>
</div>
<h3 id="bkpc_backup_failed">bkpc_backup_failed</h3>
<p>Fires when backup fails for any reason.</p>
<p><strong>Parameters</strong>: &#8211; <code>$backup_uuid</code> (string): Backup identifier &#8211; <code>$error_message</code> (string): Error description &#8211; <code>$error_data</code> (array): Additional error context</p>
<p><strong>Example &#8211; Critical Error Alert</strong>:</p>
<div class="sourceCode" id="cb3">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;bkpc_backup_failed&#39;</span><span class="ot">,</span> <span class="st">&#39;alert_backup_failure&#39;</span><span class="ot">,</span> <span class="dv">10</span><span class="ot">,</span> <span class="dv">3</span><span class="ot">);</span></span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true"></a></span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true"></a><span class="kw">function</span> alert_backup_failure<span class="ot">(</span><span class="kw">$backup_uuid</span><span class="ot">,</span> <span class="kw">$error_message</span><span class="ot">,</span> <span class="kw">$error_data</span><span class="ot">)</span> {</span>
<span id="cb3-4"><a href="#cb3-4" aria-hidden="true"></a>    <span class="co">// Send critical alert to monitoring system</span></span>
<span id="cb3-5"><a href="#cb3-5" aria-hidden="true"></a>    wp_remote_post<span class="ot">(</span><span class="st">&#39;https://monitoring.example.com/alert&#39;</span><span class="ot">,</span> <span class="ot">[</span></span>
<span id="cb3-6"><a href="#cb3-6" aria-hidden="true"></a>        <span class="st">&#39;body&#39;</span> =&gt; <span class="fu">json_encode</span><span class="ot">([</span></span>
<span id="cb3-7"><a href="#cb3-7" aria-hidden="true"></a>            <span class="st">&#39;severity&#39;</span> =&gt; <span class="st">&#39;critical&#39;</span><span class="ot">,</span></span>
<span id="cb3-8"><a href="#cb3-8" aria-hidden="true"></a>            <span class="st">&#39;service&#39;</span> =&gt; <span class="st">&#39;wordpress_backup&#39;</span><span class="ot">,</span></span>
<span id="cb3-9"><a href="#cb3-9" aria-hidden="true"></a>            <span class="st">&#39;message&#39;</span> =&gt; <span class="kw">$error_message</span><span class="ot">,</span></span>
<span id="cb3-10"><a href="#cb3-10" aria-hidden="true"></a>            <span class="st">&#39;site&#39;</span> =&gt; get_site_url<span class="ot">(),</span></span>
<span id="cb3-11"><a href="#cb3-11" aria-hidden="true"></a>            <span class="st">&#39;backup_id&#39;</span> =&gt; <span class="kw">$backup_uuid</span><span class="ot">,</span></span>
<span id="cb3-12"><a href="#cb3-12" aria-hidden="true"></a>            <span class="st">&#39;context&#39;</span> =&gt; <span class="kw">$error_data</span></span>
<span id="cb3-13"><a href="#cb3-13" aria-hidden="true"></a>        <span class="ot">]),</span></span>
<span id="cb3-14"><a href="#cb3-14" aria-hidden="true"></a>        <span class="st">&#39;headers&#39;</span> =&gt; <span class="ot">[</span><span class="st">&#39;Content-Type&#39;</span> =&gt; <span class="st">&#39;application/json&#39;</span><span class="ot">]</span></span>
<span id="cb3-15"><a href="#cb3-15" aria-hidden="true"></a>    <span class="ot">]);</span></span>
<span id="cb3-16"><a href="#cb3-16" aria-hidden="true"></a></span>
<span id="cb3-17"><a href="#cb3-17" aria-hidden="true"></a>    <span class="co">// Email site administrator</span></span>
<span id="cb3-18"><a href="#cb3-18" aria-hidden="true"></a>    wp_mail<span class="ot">(</span></span>
<span id="cb3-19"><a href="#cb3-19" aria-hidden="true"></a>        get_option<span class="ot">(</span><span class="st">&#39;admin_email&#39;</span><span class="ot">),</span></span>
<span id="cb3-20"><a href="#cb3-20" aria-hidden="true"></a>        <span class="st">&#39;[CRITICAL] Backup Failed: &#39;</span> . get_bloginfo<span class="ot">(</span><span class="st">&#39;name&#39;</span><span class="ot">),</span></span>
<span id="cb3-21"><a href="#cb3-21" aria-hidden="true"></a>        <span class="fu">sprintf</span><span class="ot">(</span></span>
<span id="cb3-22"><a href="#cb3-22" aria-hidden="true"></a>            <span class="st">&quot;Backup %s failed with error:</span><span class="kw">\n\n</span><span class="st">%s</span><span class="kw">\n\n</span><span class="st">Time: %s&quot;</span><span class="ot">,</span></span>
<span id="cb3-23"><a href="#cb3-23" aria-hidden="true"></a>            <span class="kw">$backup_uuid</span><span class="ot">,</span></span>
<span id="cb3-24"><a href="#cb3-24" aria-hidden="true"></a>            <span class="kw">$error_message</span><span class="ot">,</span></span>
<span id="cb3-25"><a href="#cb3-25" aria-hidden="true"></a>            current_time<span class="ot">(</span><span class="st">&#39;mysql&#39;</span><span class="ot">)</span></span>
<span id="cb3-26"><a href="#cb3-26" aria-hidden="true"></a>        <span class="ot">)</span></span>
<span id="cb3-27"><a href="#cb3-27" aria-hidden="true"></a>    <span class="ot">);</span></span>
<span id="cb3-28"><a href="#cb3-28" aria-hidden="true"></a>}</span></code></pre>
</div>
<h3 id="bkpc_before_restore">bkpc_before_restore</h3>
<p>Fires before restore operation begins.</p>
<p><strong>Parameters</strong>: &#8211; <code>$backup_uuid</code> (string): Backup being restored &#8211; <code>$restore_options</code> (array): Restore settings (what to restore, overwrite options)</p>
<p><strong>Example &#8211; Pre-Restore Backup</strong>:</p>
<div class="sourceCode" id="cb4">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;bkpc_before_restore&#39;</span><span class="ot">,</span> <span class="st">&#39;create_pre_restore_backup&#39;</span><span class="ot">,</span> <span class="dv">10</span><span class="ot">,</span> <span class="dv">2</span><span class="ot">);</span></span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true"></a></span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true"></a><span class="kw">function</span> create_pre_restore_backup<span class="ot">(</span><span class="kw">$backup_uuid</span><span class="ot">,</span> <span class="kw">$restore_options</span><span class="ot">)</span> {</span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true"></a>    <span class="co">// Create safety backup before restore</span></span>
<span id="cb4-5"><a href="#cb4-5" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span><span class="fu">function_exists</span><span class="ot">(</span><span class="st">&#39;bkpc_create_backup&#39;</span><span class="ot">))</span> {</span>
<span id="cb4-6"><a href="#cb4-6" aria-hidden="true"></a>        <span class="kw">$safety_backup</span> = bkpc_create_backup<span class="ot">([</span></span>
<span id="cb4-7"><a href="#cb4-7" aria-hidden="true"></a>            <span class="st">&#39;type&#39;</span> =&gt; <span class="st">&#39;full&#39;</span><span class="ot">,</span></span>
<span id="cb4-8"><a href="#cb4-8" aria-hidden="true"></a>            <span class="st">&#39;metadata&#39;</span> =&gt; <span class="ot">[</span></span>
<span id="cb4-9"><a href="#cb4-9" aria-hidden="true"></a>                <span class="st">&#39;purpose&#39;</span> =&gt; <span class="st">&#39;pre_restore_safety&#39;</span><span class="ot">,</span></span>
<span id="cb4-10"><a href="#cb4-10" aria-hidden="true"></a>                <span class="st">&#39;restoring_backup&#39;</span> =&gt; <span class="kw">$backup_uuid</span></span>
<span id="cb4-11"><a href="#cb4-11" aria-hidden="true"></a>            <span class="ot">]</span></span>
<span id="cb4-12"><a href="#cb4-12" aria-hidden="true"></a>        <span class="ot">]);</span></span>
<span id="cb4-13"><a href="#cb4-13" aria-hidden="true"></a></span>
<span id="cb4-14"><a href="#cb4-14" aria-hidden="true"></a>        <span class="fu">error_log</span><span class="ot">(</span><span class="st">&#39;[Backup] Created pre-restore safety backup: &#39;</span> . <span class="kw">$safety_backup</span><span class="ot">[</span><span class="st">&#39;uuid&#39;</span><span class="ot">]);</span></span>
<span id="cb4-15"><a href="#cb4-15" aria-hidden="true"></a>    }</span>
<span id="cb4-16"><a href="#cb4-16" aria-hidden="true"></a>}</span></code></pre>
</div>
<h3 id="bkpc_after_restore">bkpc_after_restore</h3>
<p>Fires after restore operation completes.</p>
<p><strong>Parameters</strong>: &#8211; <code>$backup_uuid</code> (string): Restored backup ID &#8211; <code>$restore_summary</code> (array): What was restored and results</p>
<p><strong>Example &#8211; Clear Caches Post-Restore</strong>:</p>
<div class="sourceCode" id="cb5">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;bkpc_after_restore&#39;</span><span class="ot">,</span> <span class="st">&#39;clear_caches_after_restore&#39;</span><span class="ot">,</span> <span class="dv">10</span><span class="ot">,</span> <span class="dv">2</span><span class="ot">);</span></span>
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true"></a></span>
<span id="cb5-3"><a href="#cb5-3" aria-hidden="true"></a><span class="kw">function</span> clear_caches_after_restore<span class="ot">(</span><span class="kw">$backup_uuid</span><span class="ot">,</span> <span class="kw">$restore_summary</span><span class="ot">)</span> {</span>
<span id="cb5-4"><a href="#cb5-4" aria-hidden="true"></a>    <span class="co">// Clear WordPress object cache</span></span>
<span id="cb5-5"><a href="#cb5-5" aria-hidden="true"></a>    wp_cache_flush<span class="ot">();</span></span>
<span id="cb5-6"><a href="#cb5-6" aria-hidden="true"></a></span>
<span id="cb5-7"><a href="#cb5-7" aria-hidden="true"></a>    <span class="co">// Clear WP Rocket cache if active</span></span>
<span id="cb5-8"><a href="#cb5-8" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span><span class="fu">function_exists</span><span class="ot">(</span><span class="st">&#39;rocket_clean_domain&#39;</span><span class="ot">))</span> {</span>
<span id="cb5-9"><a href="#cb5-9" aria-hidden="true"></a>        rocket_clean_domain<span class="ot">();</span></span>
<span id="cb5-10"><a href="#cb5-10" aria-hidden="true"></a>    }</span>
<span id="cb5-11"><a href="#cb5-11" aria-hidden="true"></a></span>
<span id="cb5-12"><a href="#cb5-12" aria-hidden="true"></a>    <span class="co">// Clear W3 Total Cache if active</span></span>
<span id="cb5-13"><a href="#cb5-13" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span><span class="fu">function_exists</span><span class="ot">(</span><span class="st">&#39;w3tc_flush_all&#39;</span><span class="ot">))</span> {</span>
<span id="cb5-14"><a href="#cb5-14" aria-hidden="true"></a>        w3tc_flush_all<span class="ot">();</span></span>
<span id="cb5-15"><a href="#cb5-15" aria-hidden="true"></a>    }</span>
<span id="cb5-16"><a href="#cb5-16" aria-hidden="true"></a></span>
<span id="cb5-17"><a href="#cb5-17" aria-hidden="true"></a>    <span class="co">// Clear Cloudflare cache if configured</span></span>
<span id="cb5-18"><a href="#cb5-18" aria-hidden="true"></a>    <span class="kw">$cf_zone_id</span> = get_option<span class="ot">(</span><span class="st">&#39;cloudflare_zone_id&#39;</span><span class="ot">);</span></span>
<span id="cb5-19"><a href="#cb5-19" aria-hidden="true"></a>    <span class="kw">$cf_api_key</span> = get_option<span class="ot">(</span><span class="st">&#39;cloudflare_api_key&#39;</span><span class="ot">);</span></span>
<span id="cb5-20"><a href="#cb5-20" aria-hidden="true"></a></span>
<span id="cb5-21"><a href="#cb5-21" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span><span class="kw">$cf_zone_id</span> &amp;&amp; <span class="kw">$cf_api_key</span><span class="ot">)</span> {</span>
<span id="cb5-22"><a href="#cb5-22" aria-hidden="true"></a>        wp_remote_post<span class="ot">(</span><span class="st">&quot;https://api.cloudflare.com/client/v4/zones/</span><span class="kw">{$cf_zone_id}</span><span class="st">/purge_cache&quot;</span><span class="ot">,</span> <span class="ot">[</span></span>
<span id="cb5-23"><a href="#cb5-23" aria-hidden="true"></a>            <span class="st">&#39;headers&#39;</span> =&gt; <span class="ot">[</span></span>
<span id="cb5-24"><a href="#cb5-24" aria-hidden="true"></a>                <span class="st">&#39;Authorization&#39;</span> =&gt; <span class="st">&#39;Bearer &#39;</span> . <span class="kw">$cf_api_key</span><span class="ot">,</span></span>
<span id="cb5-25"><a href="#cb5-25" aria-hidden="true"></a>                <span class="st">&#39;Content-Type&#39;</span> =&gt; <span class="st">&#39;application/json&#39;</span></span>
<span id="cb5-26"><a href="#cb5-26" aria-hidden="true"></a>            <span class="ot">],</span></span>
<span id="cb5-27"><a href="#cb5-27" aria-hidden="true"></a>            <span class="st">&#39;body&#39;</span> =&gt; <span class="fu">json_encode</span><span class="ot">([</span><span class="st">&#39;purge_everything&#39;</span> =&gt; <span class="kw">true</span><span class="ot">])</span></span>
<span id="cb5-28"><a href="#cb5-28" aria-hidden="true"></a>        <span class="ot">]);</span></span>
<span id="cb5-29"><a href="#cb5-29" aria-hidden="true"></a>    }</span>
<span id="cb5-30"><a href="#cb5-30" aria-hidden="true"></a>}</span></code></pre>
</div>
<h3 id="bkpc_before_cloud_upload">bkpc_before_cloud_upload</h3>
<p>Fires before backup uploads to cloud storage.</p>
<p><strong>Parameters</strong>: &#8211; <code>$backup_uuid</code> (string): Backup being uploaded &#8211; <code>$provider</code> (string): Cloud provider ID &#8211; <code>$local_path</code> (string): Local backup file path</p>
<p><strong>Example &#8211; Virus Scan Before Upload</strong>:</p>
<div class="sourceCode" id="cb6">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;bkpc_before_cloud_upload&#39;</span><span class="ot">,</span> <span class="st">&#39;scan_backup_before_upload&#39;</span><span class="ot">,</span> <span class="dv">10</span><span class="ot">,</span> <span class="dv">3</span><span class="ot">);</span></span>
<span id="cb6-2"><a href="#cb6-2" aria-hidden="true"></a></span>
<span id="cb6-3"><a href="#cb6-3" aria-hidden="true"></a><span class="kw">function</span> scan_backup_before_upload<span class="ot">(</span><span class="kw">$backup_uuid</span><span class="ot">,</span> <span class="kw">$provider</span><span class="ot">,</span> <span class="kw">$local_path</span><span class="ot">)</span> {</span>
<span id="cb6-4"><a href="#cb6-4" aria-hidden="true"></a>    <span class="co">// Scan with ClamAV before uploading</span></span>
<span id="cb6-5"><a href="#cb6-5" aria-hidden="true"></a>    <span class="kw">$output</span> = <span class="ot">[];</span></span>
<span id="cb6-6"><a href="#cb6-6" aria-hidden="true"></a>    <span class="kw">$return_var</span> = <span class="dv">0</span><span class="ot">;</span></span>
<span id="cb6-7"><a href="#cb6-7" aria-hidden="true"></a></span>
<span id="cb6-8"><a href="#cb6-8" aria-hidden="true"></a>    <span class="fu">exec</span><span class="ot">(</span><span class="st">&quot;clamscan --no-summary </span><span class="kw">{$local_path}</span><span class="st">&quot;</span><span class="ot">,</span> <span class="kw">$output</span><span class="ot">,</span> <span class="kw">$return_var</span><span class="ot">);</span></span>
<span id="cb6-9"><a href="#cb6-9" aria-hidden="true"></a></span>
<span id="cb6-10"><a href="#cb6-10" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span><span class="kw">$return_var</span> !== <span class="dv">0</span><span class="ot">)</span> {</span>
<span id="cb6-11"><a href="#cb6-11" aria-hidden="true"></a>        <span class="co">// Virus detected - abort upload</span></span>
<span id="cb6-12"><a href="#cb6-12" aria-hidden="true"></a>        <span class="fu">error_log</span><span class="ot">(</span><span class="st">&#39;[Security] Virus detected in backup &#39;</span> . <span class="kw">$backup_uuid</span><span class="ot">);</span></span>
<span id="cb6-13"><a href="#cb6-13" aria-hidden="true"></a>        <span class="kw">throw</span> <span class="kw">new</span> <span class="kw">Exception</span><span class="ot">(</span><span class="st">&#39;Backup failed virus scan&#39;</span><span class="ot">);</span></span>
<span id="cb6-14"><a href="#cb6-14" aria-hidden="true"></a>    }</span>
<span id="cb6-15"><a href="#cb6-15" aria-hidden="true"></a>}</span></code></pre>
</div>
<h3 id="bkpc_after_cloud_upload">bkpc_after_cloud_upload</h3>
<p>Fires after successful cloud upload.</p>
<p><strong>Parameters</strong>: &#8211; <code>$backup_uuid</code> (string): Uploaded backup ID &#8211; <code>$provider</code> (string): Cloud provider &#8211; <code>$remote_path</code> (string): Cloud storage path &#8211; <code>$upload_duration</code> (int): Upload time in seconds</p>
<p><strong>Example &#8211; Update External Database</strong>:</p>
<div class="sourceCode" id="cb7">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;bkpc_after_cloud_upload&#39;</span><span class="ot">,</span> <span class="st">&#39;log_upload_to_external_db&#39;</span><span class="ot">,</span> <span class="dv">10</span><span class="ot">,</span> <span class="dv">4</span><span class="ot">);</span></span>
<span id="cb7-2"><a href="#cb7-2" aria-hidden="true"></a></span>
<span id="cb7-3"><a href="#cb7-3" aria-hidden="true"></a><span class="kw">function</span> log_upload_to_external_db<span class="ot">(</span><span class="kw">$backup_uuid</span><span class="ot">,</span> <span class="kw">$provider</span><span class="ot">,</span> <span class="kw">$remote_path</span><span class="ot">,</span> <span class="kw">$upload_duration</span><span class="ot">)</span> {</span>
<span id="cb7-4"><a href="#cb7-4" aria-hidden="true"></a>    <span class="kw">global</span> <span class="kw">$wpdb</span><span class="ot">;</span></span>
<span id="cb7-5"><a href="#cb7-5" aria-hidden="true"></a></span>
<span id="cb7-6"><a href="#cb7-6" aria-hidden="true"></a>    <span class="co">// Log to external monitoring database</span></span>
<span id="cb7-7"><a href="#cb7-7" aria-hidden="true"></a>    <span class="kw">$wpdb</span>-&gt;insert<span class="ot">(</span><span class="st">&#39;backup_audit_log&#39;</span><span class="ot">,</span> <span class="ot">[</span></span>
<span id="cb7-8"><a href="#cb7-8" aria-hidden="true"></a>        <span class="st">&#39;site_id&#39;</span> =&gt; get_current_blog_id<span class="ot">(),</span></span>
<span id="cb7-9"><a href="#cb7-9" aria-hidden="true"></a>        <span class="st">&#39;site_url&#39;</span> =&gt; get_site_url<span class="ot">(),</span></span>
<span id="cb7-10"><a href="#cb7-10" aria-hidden="true"></a>        <span class="st">&#39;backup_id&#39;</span> =&gt; <span class="kw">$backup_uuid</span><span class="ot">,</span></span>
<span id="cb7-11"><a href="#cb7-11" aria-hidden="true"></a>        <span class="st">&#39;provider&#39;</span> =&gt; <span class="kw">$provider</span><span class="ot">,</span></span>
<span id="cb7-12"><a href="#cb7-12" aria-hidden="true"></a>        <span class="st">&#39;remote_path&#39;</span> =&gt; <span class="kw">$remote_path</span><span class="ot">,</span></span>
<span id="cb7-13"><a href="#cb7-13" aria-hidden="true"></a>        <span class="st">&#39;upload_duration&#39;</span> =&gt; <span class="kw">$upload_duration</span><span class="ot">,</span></span>
<span id="cb7-14"><a href="#cb7-14" aria-hidden="true"></a>        <span class="st">&#39;timestamp&#39;</span> =&gt; current_time<span class="ot">(</span><span class="st">&#39;mysql&#39;</span><span class="ot">)</span></span>
<span id="cb7-15"><a href="#cb7-15" aria-hidden="true"></a>    <span class="ot">]);</span></span>
<span id="cb7-16"><a href="#cb7-16" aria-hidden="true"></a>}</span></code></pre>
</div>
<h2 id="filter-hooks-reference">Filter Hooks Reference</h2>
<h3 id="bkpc_backup_excluded_files">bkpc_backup_excluded_files</h3>
<p>Filter files and directories excluded from backup.</p>
<p><strong>Parameters</strong>: &#8211; <code>$excluded</code> (array): Default exclusions</p>
<p><strong>Returns</strong>: Modified exclusion array</p>
<p><strong>Example &#8211; Exclude Custom Directories</strong>:</p>
<div class="sourceCode" id="cb8">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true"></a>add_filter<span class="ot">(</span><span class="st">&#39;bkpc_backup_excluded_files&#39;</span><span class="ot">,</span> <span class="st">&#39;exclude_custom_directories&#39;</span><span class="ot">);</span></span>
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true"></a></span>
<span id="cb8-3"><a href="#cb8-3" aria-hidden="true"></a><span class="kw">function</span> exclude_custom_directories<span class="ot">(</span><span class="kw">$excluded</span><span class="ot">)</span> {</span>
<span id="cb8-4"><a href="#cb8-4" aria-hidden="true"></a>    <span class="co">// Add custom exclusions</span></span>
<span id="cb8-5"><a href="#cb8-5" aria-hidden="true"></a>    <span class="kw">$custom_exclusions</span> = <span class="ot">[</span></span>
<span id="cb8-6"><a href="#cb8-6" aria-hidden="true"></a>        <span class="st">&#39;/wp-content/cache&#39;</span><span class="ot">,</span></span>
<span id="cb8-7"><a href="#cb8-7" aria-hidden="true"></a>        <span class="st">&#39;/wp-content/temp&#39;</span><span class="ot">,</span></span>
<span id="cb8-8"><a href="#cb8-8" aria-hidden="true"></a>        <span class="st">&#39;/wp-content/uploads/backups&#39;</span><span class="ot">,</span></span>
<span id="cb8-9"><a href="#cb8-9" aria-hidden="true"></a>        <span class="st">&#39;/wp-content/ai-training-data&#39;</span><span class="ot">,</span>  <span class="co">// Large AI model files</span></span>
<span id="cb8-10"><a href="#cb8-10" aria-hidden="true"></a>        <span class="st">&#39;/node_modules&#39;</span><span class="ot">,</span>  <span class="co">// Development dependencies</span></span>
<span id="cb8-11"><a href="#cb8-11" aria-hidden="true"></a>        <span class="st">&#39;/.git&#39;</span>  <span class="co">// Version control</span></span>
<span id="cb8-12"><a href="#cb8-12" aria-hidden="true"></a>    <span class="ot">];</span></span>
<span id="cb8-13"><a href="#cb8-13" aria-hidden="true"></a></span>
<span id="cb8-14"><a href="#cb8-14" aria-hidden="true"></a>    <span class="kw">return</span> <span class="fu">array_merge</span><span class="ot">(</span><span class="kw">$excluded</span><span class="ot">,</span> <span class="kw">$custom_exclusions</span><span class="ot">);</span></span>
<span id="cb8-15"><a href="#cb8-15" aria-hidden="true"></a>}</span></code></pre>
</div>
<h3 id="bkpc_backup_excluded_tables">bkpc_backup_excluded_tables</h3>
<p>Filter database tables excluded from backup.</p>
<p><strong>Parameters</strong>: &#8211; <code>$excluded_tables</code> (array): Default excluded tables &#8211; <code>$backup_type</code> (string): Backup type</p>
<p><strong>Returns</strong>: Modified table exclusion array</p>
<p><strong>Example &#8211; Exclude Temporary Tables</strong>:</p>
<div class="sourceCode" id="cb9">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true"></a>add_filter<span class="ot">(</span><span class="st">&#39;bkpc_backup_excluded_tables&#39;</span><span class="ot">,</span> <span class="st">&#39;exclude_temp_tables&#39;</span><span class="ot">,</span> <span class="dv">10</span><span class="ot">,</span> <span class="dv">2</span><span class="ot">);</span></span>
<span id="cb9-2"><a href="#cb9-2" aria-hidden="true"></a></span>
<span id="cb9-3"><a href="#cb9-3" aria-hidden="true"></a><span class="kw">function</span> exclude_temp_tables<span class="ot">(</span><span class="kw">$excluded_tables</span><span class="ot">,</span> <span class="kw">$backup_type</span><span class="ot">)</span> {</span>
<span id="cb9-4"><a href="#cb9-4" aria-hidden="true"></a>    <span class="kw">global</span> <span class="kw">$wpdb</span><span class="ot">;</span></span>
<span id="cb9-5"><a href="#cb9-5" aria-hidden="true"></a></span>
<span id="cb9-6"><a href="#cb9-6" aria-hidden="true"></a>    <span class="co">// Exclude analytics tables (can be regenerated)</span></span>
<span id="cb9-7"><a href="#cb9-7" aria-hidden="true"></a>    <span class="kw">$analytics_tables</span> = <span class="ot">[</span></span>
<span id="cb9-8"><a href="#cb9-8" aria-hidden="true"></a>        <span class="kw">$wpdb</span>-&gt;prefix . <span class="st">&#39;analytics_cache&#39;</span><span class="ot">,</span></span>
<span id="cb9-9"><a href="#cb9-9" aria-hidden="true"></a>        <span class="kw">$wpdb</span>-&gt;prefix . <span class="st">&#39;statistics_temp&#39;</span><span class="ot">,</span></span>
<span id="cb9-10"><a href="#cb9-10" aria-hidden="true"></a>        <span class="kw">$wpdb</span>-&gt;prefix . <span class="st">&#39;search_log&#39;</span></span>
<span id="cb9-11"><a href="#cb9-11" aria-hidden="true"></a>    <span class="ot">];</span></span>
<span id="cb9-12"><a href="#cb9-12" aria-hidden="true"></a></span>
<span id="cb9-13"><a href="#cb9-13" aria-hidden="true"></a>    <span class="kw">return</span> <span class="fu">array_merge</span><span class="ot">(</span><span class="kw">$excluded_tables</span><span class="ot">,</span> <span class="kw">$analytics_tables</span><span class="ot">);</span></span>
<span id="cb9-14"><a href="#cb9-14" aria-hidden="true"></a>}</span></code></pre>
</div>
<h3 id="bkpc_backup_metadata">bkpc_backup_metadata</h3>
<p>Filter backup metadata before save.</p>
<p><strong>Parameters</strong>: &#8211; <code>$metadata</code> (array): Default metadata</p>
<p><strong>Returns</strong>: Modified metadata array</p>
<p><strong>Example &#8211; Add Custom Metadata</strong>:</p>
<div class="sourceCode" id="cb10">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true"></a>add_filter<span class="ot">(</span><span class="st">&#39;bkpc_backup_metadata&#39;</span><span class="ot">,</span> <span class="st">&#39;add_custom_backup_metadata&#39;</span><span class="ot">);</span></span>
<span id="cb10-2"><a href="#cb10-2" aria-hidden="true"></a></span>
<span id="cb10-3"><a href="#cb10-3" aria-hidden="true"></a><span class="kw">function</span> add_custom_backup_metadata<span class="ot">(</span><span class="kw">$metadata</span><span class="ot">)</span> {</span>
<span id="cb10-4"><a href="#cb10-4" aria-hidden="true"></a>    <span class="co">// Add environment information</span></span>
<span id="cb10-5"><a href="#cb10-5" aria-hidden="true"></a>    <span class="kw">$metadata</span><span class="ot">[</span><span class="st">&#39;environment&#39;</span><span class="ot">]</span> = wp_get_environment_type<span class="ot">();</span>  <span class="co">// production, staging, development</span></span>
<span id="cb10-6"><a href="#cb10-6" aria-hidden="true"></a></span>
<span id="cb10-7"><a href="#cb10-7" aria-hidden="true"></a>    <span class="co">// Add theme/plugin versions</span></span>
<span id="cb10-8"><a href="#cb10-8" aria-hidden="true"></a>    <span class="kw">$metadata</span><span class="ot">[</span><span class="st">&#39;active_theme&#39;</span><span class="ot">]</span> = wp_get_theme<span class="ot">()</span>-&gt;get<span class="ot">(</span><span class="st">&#39;Name&#39;</span><span class="ot">)</span> . <span class="st">&#39; &#39;</span> . wp_get_theme<span class="ot">()</span>-&gt;get<span class="ot">(</span><span class="st">&#39;Version&#39;</span><span class="ot">);</span></span>
<span id="cb10-9"><a href="#cb10-9" aria-hidden="true"></a></span>
<span id="cb10-10"><a href="#cb10-10" aria-hidden="true"></a>    <span class="kw">$active_plugins</span> = <span class="ot">[];</span></span>
<span id="cb10-11"><a href="#cb10-11" aria-hidden="true"></a>    <span class="kw">foreach</span> <span class="ot">(</span>get_option<span class="ot">(</span><span class="st">&#39;active_plugins&#39;</span><span class="ot">)</span> <span class="kw">as</span> <span class="kw">$plugin</span><span class="ot">)</span> {</span>
<span id="cb10-12"><a href="#cb10-12" aria-hidden="true"></a>        <span class="kw">$plugin_data</span> = get_plugin_data<span class="ot">(</span><span class="kw">WP_PLUGIN_DIR</span> . <span class="st">&#39;/&#39;</span> . <span class="kw">$plugin</span><span class="ot">);</span></span>
<span id="cb10-13"><a href="#cb10-13" aria-hidden="true"></a>        <span class="kw">$active_plugins</span><span class="ot">[]</span> = <span class="kw">$plugin_data</span><span class="ot">[</span><span class="st">&#39;Name&#39;</span><span class="ot">]</span> . <span class="st">&#39; &#39;</span> . <span class="kw">$plugin_data</span><span class="ot">[</span><span class="st">&#39;Version&#39;</span><span class="ot">];</span></span>
<span id="cb10-14"><a href="#cb10-14" aria-hidden="true"></a>    }</span>
<span id="cb10-15"><a href="#cb10-15" aria-hidden="true"></a>    <span class="kw">$metadata</span><span class="ot">[</span><span class="st">&#39;active_plugins&#39;</span><span class="ot">]</span> = <span class="kw">$active_plugins</span><span class="ot">;</span></span>
<span id="cb10-16"><a href="#cb10-16" aria-hidden="true"></a></span>
<span id="cb10-17"><a href="#cb10-17" aria-hidden="true"></a>    <span class="co">// Add WooCommerce order count if active</span></span>
<span id="cb10-18"><a href="#cb10-18" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span><span class="fu">class_exists</span><span class="ot">(</span><span class="st">&#39;WooCommerce&#39;</span><span class="ot">))</span> {</span>
<span id="cb10-19"><a href="#cb10-19" aria-hidden="true"></a>        <span class="kw">$order_count</span> = wp_count_posts<span class="ot">(</span><span class="st">&#39;shop_order&#39;</span><span class="ot">);</span></span>
<span id="cb10-20"><a href="#cb10-20" aria-hidden="true"></a>        <span class="kw">$metadata</span><span class="ot">[</span><span class="st">&#39;woocommerce_orders&#39;</span><span class="ot">]</span> = <span class="kw">$order_count</span>-&gt;publish<span class="ot">;</span></span>
<span id="cb10-21"><a href="#cb10-21" aria-hidden="true"></a>    }</span>
<span id="cb10-22"><a href="#cb10-22" aria-hidden="true"></a></span>
<span id="cb10-23"><a href="#cb10-23" aria-hidden="true"></a>    <span class="kw">return</span> <span class="kw">$metadata</span><span class="ot">;</span></span>
<span id="cb10-24"><a href="#cb10-24" aria-hidden="true"></a>}</span></code></pre>
</div>
<h3 id="bkpc_schedule_options">bkpc_schedule_options</h3>
<p>Filter schedule configuration before save.</p>
<p><strong>Parameters</strong>: &#8211; <code>$options</code> (array): Schedule settings &#8211; <code>$schedule_id</code> (int): Schedule ID</p>
<p><strong>Returns</strong>: Modified options array</p>
<p><strong>Example &#8211; Enforce Backup Policies</strong>:</p>
<div class="sourceCode" id="cb11">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true"></a>add_filter<span class="ot">(</span><span class="st">&#39;bkpc_schedule_options&#39;</span><span class="ot">,</span> <span class="st">&#39;enforce_backup_policies&#39;</span><span class="ot">,</span> <span class="dv">10</span><span class="ot">,</span> <span class="dv">2</span><span class="ot">);</span></span>
<span id="cb11-2"><a href="#cb11-2" aria-hidden="true"></a></span>
<span id="cb11-3"><a href="#cb11-3" aria-hidden="true"></a><span class="kw">function</span> enforce_backup_policies<span class="ot">(</span><span class="kw">$options</span><span class="ot">,</span> <span class="kw">$schedule_id</span><span class="ot">)</span> {</span>
<span id="cb11-4"><a href="#cb11-4" aria-hidden="true"></a>    <span class="co">// Enforce minimum retention for production</span></span>
<span id="cb11-5"><a href="#cb11-5" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span>wp_get_environment_type<span class="ot">()</span> === <span class="st">&#39;production&#39;</span><span class="ot">)</span> {</span>
<span id="cb11-6"><a href="#cb11-6" aria-hidden="true"></a>        <span class="kw">if</span> <span class="ot">(</span><span class="kw">$options</span><span class="ot">[</span><span class="st">&#39;retention_days&#39;</span><span class="ot">]</span> &lt; <span class="dv">30</span><span class="ot">)</span> {</span>
<span id="cb11-7"><a href="#cb11-7" aria-hidden="true"></a>            <span class="kw">$options</span><span class="ot">[</span><span class="st">&#39;retention_days&#39;</span><span class="ot">]</span> = <span class="dv">30</span><span class="ot">;</span></span>
<span id="cb11-8"><a href="#cb11-8" aria-hidden="true"></a>            <span class="fu">error_log</span><span class="ot">(</span><span class="st">&#39;[Backup] Enforced minimum 30-day retention for production&#39;</span><span class="ot">);</span></span>
<span id="cb11-9"><a href="#cb11-9" aria-hidden="true"></a>        }</span>
<span id="cb11-10"><a href="#cb11-10" aria-hidden="true"></a></span>
<span id="cb11-11"><a href="#cb11-11" aria-hidden="true"></a>        <span class="co">// Require cloud upload for production</span></span>
<span id="cb11-12"><a href="#cb11-12" aria-hidden="true"></a>        <span class="kw">$options</span><span class="ot">[</span><span class="st">&#39;cloud_upload&#39;</span><span class="ot">]</span> = <span class="kw">true</span><span class="ot">;</span></span>
<span id="cb11-13"><a href="#cb11-13" aria-hidden="true"></a>    }</span>
<span id="cb11-14"><a href="#cb11-14" aria-hidden="true"></a></span>
<span id="cb11-15"><a href="#cb11-15" aria-hidden="true"></a>    <span class="co">// Limit backup frequency to prevent server overload</span></span>
<span id="cb11-16"><a href="#cb11-16" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span><span class="kw">$options</span><span class="ot">[</span><span class="st">&#39;frequency&#39;</span><span class="ot">]</span> === <span class="st">&#39;hourly&#39;</span> &amp;&amp; <span class="kw">$options</span><span class="ot">[</span><span class="st">&#39;backup_type&#39;</span><span class="ot">]</span> === <span class="st">&#39;full&#39;</span><span class="ot">)</span> {</span>
<span id="cb11-17"><a href="#cb11-17" aria-hidden="true"></a>        <span class="kw">$options</span><span class="ot">[</span><span class="st">&#39;frequency&#39;</span><span class="ot">]</span> = <span class="st">&#39;every_6_hours&#39;</span><span class="ot">;</span></span>
<span id="cb11-18"><a href="#cb11-18" aria-hidden="true"></a>        <span class="fu">error_log</span><span class="ot">(</span><span class="st">&#39;[Backup] Reduced full backup frequency to prevent overload&#39;</span><span class="ot">);</span></span>
<span id="cb11-19"><a href="#cb11-19" aria-hidden="true"></a>    }</span>
<span id="cb11-20"><a href="#cb11-20" aria-hidden="true"></a></span>
<span id="cb11-21"><a href="#cb11-21" aria-hidden="true"></a>    <span class="kw">return</span> <span class="kw">$options</span><span class="ot">;</span></span>
<span id="cb11-22"><a href="#cb11-22" aria-hidden="true"></a>}</span></code></pre>
</div>
<h3 id="bkpc_notification_email_content">bkpc_notification_email_content</h3>
<p>Customize notification email content.</p>
<p><strong>Parameters</strong>: &#8211; <code>$content</code> (array): Email content (subject, message, headers) &#8211; <code>$backup_data</code> (array): Backup details</p>
<p><strong>Returns</strong>: Modified email content</p>
<p><strong>Example &#8211; Customized Notification</strong>:</p>
<div class="sourceCode" id="cb12">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true"></a>add_filter<span class="ot">(</span><span class="st">&#39;bkpc_notification_email_content&#39;</span><span class="ot">,</span> <span class="st">&#39;customize_backup_email&#39;</span><span class="ot">,</span> <span class="dv">10</span><span class="ot">,</span> <span class="dv">2</span><span class="ot">);</span></span>
<span id="cb12-2"><a href="#cb12-2" aria-hidden="true"></a></span>
<span id="cb12-3"><a href="#cb12-3" aria-hidden="true"></a><span class="kw">function</span> customize_backup_email<span class="ot">(</span><span class="kw">$content</span><span class="ot">,</span> <span class="kw">$backup_data</span><span class="ot">)</span> {</span>
<span id="cb12-4"><a href="#cb12-4" aria-hidden="true"></a>    <span class="kw">$content</span><span class="ot">[</span><span class="st">&#39;subject&#39;</span><span class="ot">]</span> = <span class="fu">sprintf</span><span class="ot">(</span></span>
<span id="cb12-5"><a href="#cb12-5" aria-hidden="true"></a>        <span class="st">&#39;[%s] %s Backup %s&#39;</span><span class="ot">,</span></span>
<span id="cb12-6"><a href="#cb12-6" aria-hidden="true"></a>        get_bloginfo<span class="ot">(</span><span class="st">&#39;name&#39;</span><span class="ot">),</span></span>
<span id="cb12-7"><a href="#cb12-7" aria-hidden="true"></a>        <span class="fu">ucfirst</span><span class="ot">(</span><span class="kw">$backup_data</span><span class="ot">[</span><span class="st">&#39;type&#39;</span><span class="ot">]),</span></span>
<span id="cb12-8"><a href="#cb12-8" aria-hidden="true"></a>        <span class="kw">$backup_data</span><span class="ot">[</span><span class="st">&#39;status&#39;</span><span class="ot">]</span> === <span class="st">&#39;completed&#39;</span> <span class="ot">?</span> <span class="st">&#39;Completed&#39;</span> <span class="ot">:</span> <span class="st">&#39;Failed&#39;</span></span>
<span id="cb12-9"><a href="#cb12-9" aria-hidden="true"></a>    <span class="ot">);</span></span>
<span id="cb12-10"><a href="#cb12-10" aria-hidden="true"></a></span>
<span id="cb12-11"><a href="#cb12-11" aria-hidden="true"></a>    <span class="kw">$content</span><span class="ot">[</span><span class="st">&#39;message&#39;</span><span class="ot">]</span> = <span class="fu">sprintf</span><span class="ot">(</span></span>
<span id="cb12-12"><a href="#cb12-12" aria-hidden="true"></a>        <span class="st">&quot;Backup Report for %s</span><span class="kw">\n</span><span class="st">&quot;</span> .</span>
<span id="cb12-13"><a href="#cb12-13" aria-hidden="true"></a>        <span class="st">&quot;================================</span><span class="kw">\n\n</span><span class="st">&quot;</span> .</span>
<span id="cb12-14"><a href="#cb12-14" aria-hidden="true"></a>        <span class="st">&quot;Status: %s</span><span class="kw">\n</span><span class="st">&quot;</span> .</span>
<span id="cb12-15"><a href="#cb12-15" aria-hidden="true"></a>        <span class="st">&quot;Type: %s</span><span class="kw">\n</span><span class="st">&quot;</span> .</span>
<span id="cb12-16"><a href="#cb12-16" aria-hidden="true"></a>        <span class="st">&quot;Size: %s</span><span class="kw">\n</span><span class="st">&quot;</span> .</span>
<span id="cb12-17"><a href="#cb12-17" aria-hidden="true"></a>        <span class="st">&quot;Duration: %d seconds</span><span class="kw">\n</span><span class="st">&quot;</span> .</span>
<span id="cb12-18"><a href="#cb12-18" aria-hidden="true"></a>        <span class="st">&quot;Cloud Upload: %s</span><span class="kw">\n</span><span class="st">&quot;</span> .</span>
<span id="cb12-19"><a href="#cb12-19" aria-hidden="true"></a>        <span class="st">&quot;Timestamp: %s</span><span class="kw">\n\n</span><span class="st">&quot;</span> .</span>
<span id="cb12-20"><a href="#cb12-20" aria-hidden="true"></a>        <span class="st">&quot;View backup details: %s</span><span class="kw">\n</span><span class="st">&quot;</span><span class="ot">,</span></span>
<span id="cb12-21"><a href="#cb12-21" aria-hidden="true"></a>        get_bloginfo<span class="ot">(</span><span class="st">&#39;name&#39;</span><span class="ot">),</span></span>
<span id="cb12-22"><a href="#cb12-22" aria-hidden="true"></a>        <span class="fu">strtoupper</span><span class="ot">(</span><span class="kw">$backup_data</span><span class="ot">[</span><span class="st">&#39;status&#39;</span><span class="ot">]),</span></span>
<span id="cb12-23"><a href="#cb12-23" aria-hidden="true"></a>        <span class="kw">$backup_data</span><span class="ot">[</span><span class="st">&#39;type&#39;</span><span class="ot">],</span></span>
<span id="cb12-24"><a href="#cb12-24" aria-hidden="true"></a>        size_format<span class="ot">(</span><span class="kw">$backup_data</span><span class="ot">[</span><span class="st">&#39;size&#39;</span><span class="ot">]),</span></span>
<span id="cb12-25"><a href="#cb12-25" aria-hidden="true"></a>        <span class="kw">$backup_data</span><span class="ot">[</span><span class="st">&#39;duration&#39;</span><span class="ot">],</span></span>
<span id="cb12-26"><a href="#cb12-26" aria-hidden="true"></a>        <span class="kw">$backup_data</span><span class="ot">[</span><span class="st">&#39;cloud_uploaded&#39;</span><span class="ot">]</span> <span class="ot">?</span> <span class="st">&#39;Yes&#39;</span> <span class="ot">:</span> <span class="st">&#39;No&#39;</span><span class="ot">,</span></span>
<span id="cb12-27"><a href="#cb12-27" aria-hidden="true"></a>        <span class="kw">$backup_data</span><span class="ot">[</span><span class="st">&#39;completed_at&#39;</span><span class="ot">],</span></span>
<span id="cb12-28"><a href="#cb12-28" aria-hidden="true"></a>        admin_url<span class="ot">(</span><span class="st">&#39;admin.php?page=backup-copilot-pro&amp;backup=&#39;</span> . <span class="kw">$backup_data</span><span class="ot">[</span><span class="st">&#39;uuid&#39;</span><span class="ot">])</span></span>
<span id="cb12-29"><a href="#cb12-29" aria-hidden="true"></a>    <span class="ot">);</span></span>
<span id="cb12-30"><a href="#cb12-30" aria-hidden="true"></a></span>
<span id="cb12-31"><a href="#cb12-31" aria-hidden="true"></a>    <span class="co">// Add HTML version</span></span>
<span id="cb12-32"><a href="#cb12-32" aria-hidden="true"></a>    <span class="kw">$content</span><span class="ot">[</span><span class="st">&#39;headers&#39;</span><span class="ot">][]</span> = <span class="st">&#39;Content-Type: text/html&#39;</span><span class="ot">;</span></span>
<span id="cb12-33"><a href="#cb12-33" aria-hidden="true"></a></span>
<span id="cb12-34"><a href="#cb12-34" aria-hidden="true"></a>    <span class="kw">return</span> <span class="kw">$content</span><span class="ot">;</span></span>
<span id="cb12-35"><a href="#cb12-35" aria-hidden="true"></a>}</span></code></pre>
</div>
<h3 id="bkpc_cloud_upload_chunk_size">bkpc_cloud_upload_chunk_size</h3>
<p>Customize upload chunk size for different providers.</p>
<p><strong>Parameters</strong>: &#8211; <code>$chunk_size</code> (int): Default chunk size in bytes &#8211; <code>$provider</code> (string): Cloud provider ID</p>
<p><strong>Returns</strong>: Modified chunk size</p>
<p><strong>Example &#8211; Optimize Chunk Sizes</strong>:</p>
<div class="sourceCode" id="cb13">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true"></a>add_filter<span class="ot">(</span><span class="st">&#39;bkpc_cloud_upload_chunk_size&#39;</span><span class="ot">,</span> <span class="st">&#39;optimize_chunk_size&#39;</span><span class="ot">,</span> <span class="dv">10</span><span class="ot">,</span> <span class="dv">2</span><span class="ot">);</span></span>
<span id="cb13-2"><a href="#cb13-2" aria-hidden="true"></a></span>
<span id="cb13-3"><a href="#cb13-3" aria-hidden="true"></a><span class="kw">function</span> optimize_chunk_size<span class="ot">(</span><span class="kw">$chunk_size</span><span class="ot">,</span> <span class="kw">$provider</span><span class="ot">)</span> {</span>
<span id="cb13-4"><a href="#cb13-4" aria-hidden="true"></a>    <span class="co">// Different providers have different optimal chunk sizes</span></span>
<span id="cb13-5"><a href="#cb13-5" aria-hidden="true"></a>    <span class="kw">$optimal_sizes</span> = <span class="ot">[</span></span>
<span id="cb13-6"><a href="#cb13-6" aria-hidden="true"></a>        <span class="st">&#39;dropbox&#39;</span> =&gt; <span class="dv">10</span> * <span class="dv">1024</span> * <span class="dv">1024</span><span class="ot">,</span>      <span class="co">// 10MB for Dropbox</span></span>
<span id="cb13-7"><a href="#cb13-7" aria-hidden="true"></a>        <span class="st">&#39;google_drive&#39;</span> =&gt; <span class="dv">5</span> * <span class="dv">1024</span> * <span class="dv">1024</span><span class="ot">,</span>   <span class="co">// 5MB for Google Drive</span></span>
<span id="cb13-8"><a href="#cb13-8" aria-hidden="true"></a>        <span class="st">&#39;amazon_s3&#39;</span> =&gt; <span class="dv">15</span> * <span class="dv">1024</span> * <span class="dv">1024</span><span class="ot">,</span>     <span class="co">// 15MB for S3</span></span>
<span id="cb13-9"><a href="#cb13-9" aria-hidden="true"></a>        <span class="st">&#39;backblaze&#39;</span> =&gt; <span class="dv">100</span> * <span class="dv">1024</span> * <span class="dv">1024</span>     <span class="co">// 100MB for Backblaze B2</span></span>
<span id="cb13-10"><a href="#cb13-10" aria-hidden="true"></a>    <span class="ot">];</span></span>
<span id="cb13-11"><a href="#cb13-11" aria-hidden="true"></a></span>
<span id="cb13-12"><a href="#cb13-12" aria-hidden="true"></a>    <span class="kw">return</span> <span class="kw">isset</span><span class="ot">(</span><span class="kw">$optimal_sizes</span><span class="ot">[</span><span class="kw">$provider</span><span class="ot">])</span> <span class="ot">?</span> <span class="kw">$optimal_sizes</span><span class="ot">[</span><span class="kw">$provider</span><span class="ot">]</span> <span class="ot">:</span> <span class="kw">$chunk_size</span><span class="ot">;</span></span>
<span id="cb13-13"><a href="#cb13-13" aria-hidden="true"></a>}</span></code></pre>
</div>
<h2 id="advanced-integration-examples">Advanced Integration Examples</h2>
<h3 id="custom-retention-logic">Custom Retention Logic</h3>
<p>Implement sophisticated retention policies:</p>
<div class="sourceCode" id="cb14">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true"></a>add_filter<span class="ot">(</span><span class="st">&#39;bkpc_retention_policy&#39;</span><span class="ot">,</span> <span class="st">&#39;custom_retention_logic&#39;</span><span class="ot">,</span> <span class="dv">10</span><span class="ot">,</span> <span class="dv">2</span><span class="ot">);</span></span>
<span id="cb14-2"><a href="#cb14-2" aria-hidden="true"></a></span>
<span id="cb14-3"><a href="#cb14-3" aria-hidden="true"></a><span class="kw">function</span> custom_retention_logic<span class="ot">(</span><span class="kw">$should_delete</span><span class="ot">,</span> <span class="kw">$backup_data</span><span class="ot">)</span> {</span>
<span id="cb14-4"><a href="#cb14-4" aria-hidden="true"></a>    <span class="co">// Keep all backups from the first of each month indefinitely</span></span>
<span id="cb14-5"><a href="#cb14-5" aria-hidden="true"></a>    <span class="kw">$backup_date</span> = <span class="kw">new</span> <span class="kw">DateTime</span><span class="ot">(</span><span class="kw">$backup_data</span><span class="ot">[</span><span class="st">&#39;created_at&#39;</span><span class="ot">]);</span></span>
<span id="cb14-6"><a href="#cb14-6" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span><span class="kw">$backup_date</span>-&gt;format<span class="ot">(</span><span class="st">&#39;d&#39;</span><span class="ot">)</span> === <span class="st">&#39;01&#39;</span><span class="ot">)</span> {</span>
<span id="cb14-7"><a href="#cb14-7" aria-hidden="true"></a>        <span class="kw">return</span> <span class="kw">false</span><span class="ot">;</span>  <span class="co">// Don&#39;t delete monthly backups</span></span>
<span id="cb14-8"><a href="#cb14-8" aria-hidden="true"></a>    }</span>
<span id="cb14-9"><a href="#cb14-9" aria-hidden="true"></a></span>
<span id="cb14-10"><a href="#cb14-10" aria-hidden="true"></a>    <span class="co">// Keep backups tagged as &quot;before_major_update&quot; for 1 year</span></span>
<span id="cb14-11"><a href="#cb14-11" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span><span class="kw">isset</span><span class="ot">(</span><span class="kw">$backup_data</span><span class="ot">[</span><span class="st">&#39;metadata&#39;</span><span class="ot">][</span><span class="st">&#39;tag&#39;</span><span class="ot">])</span> &amp;&amp;</span>
<span id="cb14-12"><a href="#cb14-12" aria-hidden="true"></a>        <span class="kw">$backup_data</span><span class="ot">[</span><span class="st">&#39;metadata&#39;</span><span class="ot">][</span><span class="st">&#39;tag&#39;</span><span class="ot">]</span> === <span class="st">&#39;before_major_update&#39;</span><span class="ot">)</span> {</span>
<span id="cb14-13"><a href="#cb14-13" aria-hidden="true"></a>        <span class="kw">$age_days</span> = <span class="ot">(</span><span class="fu">time</span><span class="ot">()</span> - <span class="fu">strtotime</span><span class="ot">(</span><span class="kw">$backup_data</span><span class="ot">[</span><span class="st">&#39;created_at&#39;</span><span class="ot">]))</span> / <span class="kw">DAY_IN_SECONDS</span><span class="ot">;</span></span>
<span id="cb14-14"><a href="#cb14-14" aria-hidden="true"></a>        <span class="kw">return</span> <span class="kw">$age_days</span> &gt; <span class="dv">365</span><span class="ot">;</span>  <span class="co">// Delete after 1 year</span></span>
<span id="cb14-15"><a href="#cb14-15" aria-hidden="true"></a>    }</span>
<span id="cb14-16"><a href="#cb14-16" aria-hidden="true"></a></span>
<span id="cb14-17"><a href="#cb14-17" aria-hidden="true"></a>    <span class="co">// Default retention logic</span></span>
<span id="cb14-18"><a href="#cb14-18" aria-hidden="true"></a>    <span class="kw">return</span> <span class="kw">$should_delete</span><span class="ot">;</span></span>
<span id="cb14-19"><a href="#cb14-19" aria-hidden="true"></a>}</span></code></pre>
</div>
<h3 id="database-query-optimization">Database Query Optimization</h3>
<p>Optimize database export queries:</p>
<div class="sourceCode" id="cb15">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb15-1"><a href="#cb15-1" aria-hidden="true"></a>add_filter<span class="ot">(</span><span class="st">&#39;bkpc_database_export_query&#39;</span><span class="ot">,</span> <span class="st">&#39;optimize_export_query&#39;</span><span class="ot">,</span> <span class="dv">10</span><span class="ot">,</span> <span class="dv">2</span><span class="ot">);</span></span>
<span id="cb15-2"><a href="#cb15-2" aria-hidden="true"></a></span>
<span id="cb15-3"><a href="#cb15-3" aria-hidden="true"></a><span class="kw">function</span> optimize_export_query<span class="ot">(</span><span class="kw">$query</span><span class="ot">,</span> <span class="kw">$table</span><span class="ot">)</span> {</span>
<span id="cb15-4"><a href="#cb15-4" aria-hidden="true"></a>    <span class="co">// Skip certain columns from large tables</span></span>
<span id="cb15-5"><a href="#cb15-5" aria-hidden="true"></a>    <span class="kw">$optimizations</span> = <span class="ot">[</span></span>
<span id="cb15-6"><a href="#cb15-6" aria-hidden="true"></a>        <span class="st">&#39;wp_posts&#39;</span> =&gt; <span class="st">&#39;SELECT ID, post_author, post_date, post_content, post_title, post_status FROM&#39;</span><span class="ot">,</span></span>
<span id="cb15-7"><a href="#cb15-7" aria-hidden="true"></a>        <span class="st">&#39;wp_comments&#39;</span> =&gt; <span class="st">&#39;SELECT * FROM&#39;</span>  <span class="co">// Exclude spam comments</span></span>
<span id="cb15-8"><a href="#cb15-8" aria-hidden="true"></a>    <span class="ot">];</span></span>
<span id="cb15-9"><a href="#cb15-9" aria-hidden="true"></a></span>
<span id="cb15-10"><a href="#cb15-10" aria-hidden="true"></a>    <span class="kw">foreach</span> <span class="ot">(</span><span class="kw">$optimizations</span> <span class="kw">as</span> <span class="kw">$table_name</span> =&gt; <span class="kw">$select</span><span class="ot">)</span> {</span>
<span id="cb15-11"><a href="#cb15-11" aria-hidden="true"></a>        <span class="kw">if</span> <span class="ot">(</span><span class="fu">strpos</span><span class="ot">(</span><span class="kw">$table</span><span class="ot">,</span> <span class="kw">$table_name</span><span class="ot">)</span> !== <span class="kw">false</span><span class="ot">)</span> {</span>
<span id="cb15-12"><a href="#cb15-12" aria-hidden="true"></a>            <span class="co">// Modify query for this table</span></span>
<span id="cb15-13"><a href="#cb15-13" aria-hidden="true"></a>            <span class="kw">if</span> <span class="ot">(</span><span class="kw">$table_name</span> === <span class="st">&#39;wp_comments&#39;</span><span class="ot">)</span> {</span>
<span id="cb15-14"><a href="#cb15-14" aria-hidden="true"></a>                <span class="kw">$query</span> .= <span class="st">&quot; WHERE comment_approved != &#39;spam&#39;&quot;</span><span class="ot">;</span></span>
<span id="cb15-15"><a href="#cb15-15" aria-hidden="true"></a>            }</span>
<span id="cb15-16"><a href="#cb15-16" aria-hidden="true"></a>        }</span>
<span id="cb15-17"><a href="#cb15-17" aria-hidden="true"></a>    }</span>
<span id="cb15-18"><a href="#cb15-18" aria-hidden="true"></a></span>
<span id="cb15-19"><a href="#cb15-19" aria-hidden="true"></a>    <span class="kw">return</span> <span class="kw">$query</span><span class="ot">;</span></span>
<span id="cb15-20"><a href="#cb15-20" aria-hidden="true"></a>}</span></code></pre>
</div>
<h3 id="third-party-service-integration">Third-Party Service Integration</h3>
<p>Integrate with external backup verification service:</p>
<div class="sourceCode" id="cb16">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb16-1"><a href="#cb16-1" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;bkpc_after_cloud_upload&#39;</span><span class="ot">,</span> <span class="st">&#39;verify_backup_externally&#39;</span><span class="ot">,</span> <span class="dv">10</span><span class="ot">,</span> <span class="dv">4</span><span class="ot">);</span></span>
<span id="cb16-2"><a href="#cb16-2" aria-hidden="true"></a></span>
<span id="cb16-3"><a href="#cb16-3" aria-hidden="true"></a><span class="kw">function</span> verify_backup_externally<span class="ot">(</span><span class="kw">$backup_uuid</span><span class="ot">,</span> <span class="kw">$provider</span><span class="ot">,</span> <span class="kw">$remote_path</span><span class="ot">,</span> <span class="kw">$duration</span><span class="ot">)</span> {</span>
<span id="cb16-4"><a href="#cb16-4" aria-hidden="true"></a>    <span class="co">// Send to external backup verification service</span></span>
<span id="cb16-5"><a href="#cb16-5" aria-hidden="true"></a>    <span class="kw">$verification_service</span> = <span class="st">&#39;https://backup-verify.example.com/api/verify&#39;</span><span class="ot">;</span></span>
<span id="cb16-6"><a href="#cb16-6" aria-hidden="true"></a></span>
<span id="cb16-7"><a href="#cb16-7" aria-hidden="true"></a>    <span class="kw">$backup_info</span> = bkpc_get_backup<span class="ot">(</span><span class="kw">$backup_uuid</span><span class="ot">);</span></span>
<span id="cb16-8"><a href="#cb16-8" aria-hidden="true"></a></span>
<span id="cb16-9"><a href="#cb16-9" aria-hidden="true"></a>    wp_remote_post<span class="ot">(</span><span class="kw">$verification_service</span><span class="ot">,</span> <span class="ot">[</span></span>
<span id="cb16-10"><a href="#cb16-10" aria-hidden="true"></a>        <span class="st">&#39;body&#39;</span> =&gt; <span class="fu">json_encode</span><span class="ot">([</span></span>
<span id="cb16-11"><a href="#cb16-11" aria-hidden="true"></a>            <span class="st">&#39;site_id&#39;</span> =&gt; get_option<span class="ot">(</span><span class="st">&#39;site_verification_id&#39;</span><span class="ot">),</span></span>
<span id="cb16-12"><a href="#cb16-12" aria-hidden="true"></a>            <span class="st">&#39;backup_id&#39;</span> =&gt; <span class="kw">$backup_uuid</span><span class="ot">,</span></span>
<span id="cb16-13"><a href="#cb16-13" aria-hidden="true"></a>            <span class="st">&#39;provider&#39;</span> =&gt; <span class="kw">$provider</span><span class="ot">,</span></span>
<span id="cb16-14"><a href="#cb16-14" aria-hidden="true"></a>            <span class="st">&#39;remote_path&#39;</span> =&gt; <span class="kw">$remote_path</span><span class="ot">,</span></span>
<span id="cb16-15"><a href="#cb16-15" aria-hidden="true"></a>            <span class="st">&#39;size&#39;</span> =&gt; <span class="kw">$backup_info</span><span class="ot">[</span><span class="st">&#39;size&#39;</span><span class="ot">],</span></span>
<span id="cb16-16"><a href="#cb16-16" aria-hidden="true"></a>            <span class="st">&#39;checksum&#39;</span> =&gt; <span class="kw">$backup_info</span><span class="ot">[</span><span class="st">&#39;checksum&#39;</span><span class="ot">],</span></span>
<span id="cb16-17"><a href="#cb16-17" aria-hidden="true"></a>            <span class="st">&#39;timestamp&#39;</span> =&gt; <span class="fu">time</span><span class="ot">()</span></span>
<span id="cb16-18"><a href="#cb16-18" aria-hidden="true"></a>        <span class="ot">]),</span></span>
<span id="cb16-19"><a href="#cb16-19" aria-hidden="true"></a>        <span class="st">&#39;headers&#39;</span> =&gt; <span class="ot">[</span></span>
<span id="cb16-20"><a href="#cb16-20" aria-hidden="true"></a>            <span class="st">&#39;Content-Type&#39;</span> =&gt; <span class="st">&#39;application/json&#39;</span><span class="ot">,</span></span>
<span id="cb16-21"><a href="#cb16-21" aria-hidden="true"></a>            <span class="st">&#39;Authorization&#39;</span> =&gt; <span class="st">&#39;Bearer &#39;</span> . get_option<span class="ot">(</span><span class="st">&#39;verification_api_key&#39;</span><span class="ot">)</span></span>
<span id="cb16-22"><a href="#cb16-22" aria-hidden="true"></a>        <span class="ot">]</span></span>
<span id="cb16-23"><a href="#cb16-23" aria-hidden="true"></a>    <span class="ot">]);</span></span>
<span id="cb16-24"><a href="#cb16-24" aria-hidden="true"></a>}</span></code></pre>
</div>
<h2 id="security-considerations">Security Considerations</h2>
<p><strong>Validate All Inputs</strong>: When using filters that accept user input, always validate and sanitize.</p>
<p><strong>Capability Checks</strong>: Ensure custom code respects WordPress capabilities:</p>
<div class="sourceCode" id="cb17">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb17-1"><a href="#cb17-1" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;bkpc_before_backup_create&#39;</span><span class="ot">,</span> <span class="st">&#39;log_backup_initiator&#39;</span><span class="ot">,</span> <span class="dv">10</span><span class="ot">,</span> <span class="dv">2</span><span class="ot">);</span></span>
<span id="cb17-2"><a href="#cb17-2" aria-hidden="true"></a></span>
<span id="cb17-3"><a href="#cb17-3" aria-hidden="true"></a><span class="kw">function</span> log_backup_initiator<span class="ot">(</span><span class="kw">$backup_type</span><span class="ot">,</span> <span class="kw">$options</span><span class="ot">)</span> {</span>
<span id="cb17-4"><a href="#cb17-4" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span>!current_user_can<span class="ot">(</span><span class="st">&#39;manage_options&#39;</span><span class="ot">))</span> {</span>
<span id="cb17-5"><a href="#cb17-5" aria-hidden="true"></a>        <span class="kw">return</span><span class="ot">;</span>  <span class="co">// Only log for administrators</span></span>
<span id="cb17-6"><a href="#cb17-6" aria-hidden="true"></a>    }</span>
<span id="cb17-7"><a href="#cb17-7" aria-hidden="true"></a></span>
<span id="cb17-8"><a href="#cb17-8" aria-hidden="true"></a>    <span class="co">// Log who initiated backup</span></span>
<span id="cb17-9"><a href="#cb17-9" aria-hidden="true"></a>}</span></code></pre>
</div>
<p><strong>Prevent Information Disclosure</strong>: Don’t expose sensitive information in logs or notifications.</p>
<p><strong>Rate Limiting</strong>: External API calls should implement retry limits and exponential backoff.</p>
<h2 id="performance-impact">Performance Impact</h2>
<p><strong>Minimize Hook Execution Time</strong>: Keep hook callbacks fast. Defer long operations:</p>
<div class="sourceCode" id="cb18">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb18-1"><a href="#cb18-1" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;bkpc_after_backup_create&#39;</span><span class="ot">,</span> <span class="st">&#39;defer_slow_operation&#39;</span><span class="ot">,</span> <span class="dv">10</span><span class="ot">,</span> <span class="dv">2</span><span class="ot">);</span></span>
<span id="cb18-2"><a href="#cb18-2" aria-hidden="true"></a></span>
<span id="cb18-3"><a href="#cb18-3" aria-hidden="true"></a><span class="kw">function</span> defer_slow_operation<span class="ot">(</span><span class="kw">$backup_uuid</span><span class="ot">,</span> <span class="kw">$backup_data</span><span class="ot">)</span> {</span>
<span id="cb18-4"><a href="#cb18-4" aria-hidden="true"></a>    <span class="co">// Schedule slow operation for later rather than blocking</span></span>
<span id="cb18-5"><a href="#cb18-5" aria-hidden="true"></a>    wp_schedule_single_event<span class="ot">(</span><span class="fu">time</span><span class="ot">()</span> + <span class="dv">60</span><span class="ot">,</span> <span class="st">&#39;process_backup_analytics&#39;</span><span class="ot">,</span> <span class="ot">[</span><span class="kw">$backup_uuid</span><span class="ot">]);</span></span>
<span id="cb18-6"><a href="#cb18-6" aria-hidden="true"></a>}</span></code></pre>
</div>
<p><strong>Cache When Possible</strong>: Don’t repeat expensive operations unnecessarily.</p>
<p><strong>Async for External Calls</strong>: Use <code>blocking =&gt; false</code> for non-critical external requests:</p>
<div class="sourceCode" id="cb19">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb19-1"><a href="#cb19-1" aria-hidden="true"></a>wp_remote_post<span class="ot">(</span><span class="kw">$url</span><span class="ot">,</span> <span class="ot">[</span></span>
<span id="cb19-2"><a href="#cb19-2" aria-hidden="true"></a>    <span class="st">&#39;blocking&#39;</span> =&gt; <span class="kw">false</span><span class="ot">,</span>  <span class="co">// Don&#39;t wait for response</span></span>
<span id="cb19-3"><a href="#cb19-3" aria-hidden="true"></a>    <span class="st">&#39;timeout&#39;</span> =&gt; <span class="dv">5</span><span class="ot">,</span></span>
<span id="cb19-4"><a href="#cb19-4" aria-hidden="true"></a>    <span class="st">&#39;body&#39;</span> =&gt; <span class="kw">$data</span></span>
<span id="cb19-5"><a href="#cb19-5" aria-hidden="true"></a><span class="ot">]);</span></span></code></pre>
</div>
<h2 id="debugging-custom-integrations">Debugging Custom Integrations</h2>
<p>Enable WordPress debugging and use error logging:</p>
<div class="sourceCode" id="cb20">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb20-1"><a href="#cb20-1" aria-hidden="true"></a>add_action<span class="ot">(</span><span class="st">&#39;bkpc_before_backup_create&#39;</span><span class="ot">,</span> <span class="st">&#39;debug_backup_hooks&#39;</span><span class="ot">,</span> <span class="dv">10</span><span class="ot">,</span> <span class="dv">2</span><span class="ot">);</span></span>
<span id="cb20-2"><a href="#cb20-2" aria-hidden="true"></a></span>
<span id="cb20-3"><a href="#cb20-3" aria-hidden="true"></a><span class="kw">function</span> debug_backup_hooks<span class="ot">(</span><span class="kw">$backup_type</span><span class="ot">,</span> <span class="kw">$options</span><span class="ot">)</span> {</span>
<span id="cb20-4"><a href="#cb20-4" aria-hidden="true"></a>    <span class="kw">if</span> <span class="ot">(</span><span class="fu">defined</span><span class="ot">(</span><span class="st">&#39;WP_DEBUG&#39;</span><span class="ot">)</span> &amp;&amp; <span class="kw">WP_DEBUG</span><span class="ot">)</span> {</span>
<span id="cb20-5"><a href="#cb20-5" aria-hidden="true"></a>        <span class="fu">error_log</span><span class="ot">(</span><span class="st">&#39;=== Backup Hook Debug ===&#39;</span><span class="ot">);</span></span>
<span id="cb20-6"><a href="#cb20-6" aria-hidden="true"></a>        <span class="fu">error_log</span><span class="ot">(</span><span class="st">&#39;Type: &#39;</span> . <span class="kw">$backup_type</span><span class="ot">);</span></span>
<span id="cb20-7"><a href="#cb20-7" aria-hidden="true"></a>        <span class="fu">error_log</span><span class="ot">(</span><span class="st">&#39;Options: &#39;</span> . <span class="fu">print_r</span><span class="ot">(</span><span class="kw">$options</span><span class="ot">,</span> <span class="kw">true</span><span class="ot">));</span></span>
<span id="cb20-8"><a href="#cb20-8" aria-hidden="true"></a>        <span class="fu">error_log</span><span class="ot">(</span><span class="st">&#39;Current user: &#39;</span> . wp_get_current_user<span class="ot">()</span>-&gt;user_login<span class="ot">);</span></span>
<span id="cb20-9"><a href="#cb20-9" aria-hidden="true"></a>        <span class="fu">error_log</span><span class="ot">(</span><span class="st">&#39;Memory usage: &#39;</span> . size_format<span class="ot">(</span><span class="fu">memory_get_usage</span><span class="ot">(</span><span class="kw">true</span><span class="ot">)));</span></span>
<span id="cb20-10"><a href="#cb20-10" aria-hidden="true"></a>        <span class="fu">error_log</span><span class="ot">(</span><span class="st">&#39;========================&#39;</span><span class="ot">);</span></span>
<span id="cb20-11"><a href="#cb20-11" aria-hidden="true"></a>    }</span>
<span id="cb20-12"><a href="#cb20-12" aria-hidden="true"></a>}</span></code></pre>
</div>
<h2 id="best-practices">Best Practices</h2>
<p><strong>Use Priority Wisely</strong>: Default priority is 10. Lower numbers run first, higher run later. Critical operations should run early (priority 5), non-critical later (priority 20).</p>
<p><strong>Check Function Existence</strong>: Always verify functions exist before calling:</p>
<div class="sourceCode" id="cb21">
<pre class="sourceCode php"><code class="sourceCode php"><span id="cb21-1"><a href="#cb21-1" aria-hidden="true"></a><span class="kw">if</span> <span class="ot">(</span><span class="fu">function_exists</span><span class="ot">(</span><span class="st">&#39;bkpc_create_backup&#39;</span><span class="ot">))</span> {</span>
<span id="cb21-2"><a href="#cb21-2" aria-hidden="true"></a>    <span class="co">// Safe to call</span></span>
<span id="cb21-3"><a href="#cb21-3" aria-hidden="true"></a>}</span></code></pre>
</div>
<p><strong>Document Custom Code</strong>: Comment your hooks explaining what they do and why.</p>
<p><strong>Test Thoroughly</strong>: Test custom hooks with various backup types, sizes, and failure scenarios.</p>
<p><strong>Plugin Compatibility</strong>: Check for conflicts with other backup or security plugins.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Backup Copilot Pro’s extensive hook and filter system provides complete customization without touching core code. From simple exclusions to complex integrations with external services, the architecture supports sophisticated workflows while maintaining compatibility and performance.</p>
<p>Action hooks enable event-driven integrations, filter hooks allow data manipulation, proper implementation ensures security and performance, and thorough testing prevents issues in production. Whether adding Slack notifications, implementing custom retention policies, or integrating with enterprise monitoring systems, these hooks provide the foundation for extending Backup Copilot Pro to meet any requirement.</p>
<h2 id="external-links">External Links</h2>
<ol type="1">
<li><a href="https://developer.wordpress.org/plugins/hooks/">WordPress Plugin API</a></li>
<li><a href="https://codex.wordpress.org/Plugin_API/Action_Reference">Action Reference</a></li>
<li><a href="https://codex.wordpress.org/Plugin_API/Filter_Reference">Filter Reference</a></li>
<li><a href="https://developer.wordpress.org/coding-standards/wordpress-coding-standards/">WordPress Coding Standards</a></li>
<li><a href="https://developer.wordpress.org/plugins/">Plugin Development Handbook</a></li>
</ol>
<h2 id="call-to-action">Call to Action</h2>
<p>Ready to extend Backup Copilot Pro? <a href="https://backupcopilotplugin.com/#pricing">Get Pro</a> and access our complete API documentation, developer support, and custom integration assistance. Build exactly what you need!</p>
<p>The post <a href="https://backupcopilotplugin.com/blog/backup-copilot-pro-developer-guide-hooks-filters-and-custom-integrations/">Backup Copilot Pro Developer Guide: Hooks, Filters, and Custom Integrations</a> appeared first on <a href="https://backupcopilotplugin.com">Backup Copilot</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
