{"id":5411,"date":"2026-02-12T20:44:25","date_gmt":"2026-02-13T01:44:25","guid":{"rendered":"https:\/\/chubes.net\/?documentation=plugin-theme-installation-api"},"modified":"2026-03-13T03:27:32","modified_gmt":"2026-03-13T07:27:32","slug":"plugin-theme-installation-api","status":"publish","type":"documentation","link":"https:\/\/chubes.net\/docs\/wordpress-core\/admin-api\/plugin-theme-installation-api\/","title":{"rendered":"Plugin &amp; Theme Installation API"},"content":{"rendered":"<p>WordPress provides a comprehensive upgrader system for installing, updating, and managing plugins and themes. The core class is <code>WP_Upgrader<\/code> with specialized subclasses.<\/p><h2 class=\"wp-block-heading\">Class Hierarchy<\/h2><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\"><\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code\"><code>WP_Upgrader (base class)\n\u251c\u2500\u2500 Plugin_Upgrader\n\u251c\u2500\u2500 Theme_Upgrader\n\u251c\u2500\u2500 Language_Pack_Upgrader\n\u2514\u2500\u2500 Core_Upgrader<\/code><\/pre><\/div><h2 class=\"wp-block-heading\">WP_Upgrader Base Class<\/h2><p>The base class provides common functionality for all upgrade operations.<\/p><h3 class=\"wp-block-heading\">Core Methods<\/h3><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">class WP_Upgrader {\n    \/\/ Download a package\n    public function download_package( $package, $check_signatures = false, $hook_extra = array() );\n    \n    \/\/ Unpack a compressed package\n    public function unpack_package( $package, $delete_package = true );\n    \n    \/\/ Install from unpacked package\n    public function install_package( $args = array() );\n    \n    \/\/ Run an upgrade\/install\n    public function run( $options );\n    \n    \/\/ Connect to filesystem\n    public function fs_connect( $directories = array(), $allow_relaxed_file_ownership = false );\n}<\/code><\/pre><\/div><h2 class=\"wp-block-heading\">Plugin Installation<\/h2><h3 class=\"wp-block-heading\">Using Plugin_Upgrader<\/h3><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">require_once ABSPATH . &#039;wp-admin\/includes\/class-wp-upgrader.php&#039;;\n\n\/\/ Create upgrader with skin\n$upgrader = new Plugin_Upgrader( new WP_Ajax_Upgrader_Skin() );\n\n\/\/ Install from WordPress.org\n$result = $upgrader-&gt;install( &#039;https:\/\/downloads.wordpress.org\/plugin\/akismet.zip&#039; );\n\nif ( is_wp_error( $result ) ) {\n    echo $result-&gt;get_error_message();\n} elseif ( $result ) {\n    echo &#039;Plugin installed successfully&#039;;\n}<\/code><\/pre><\/div><h3 class=\"wp-block-heading\">Install from Uploaded File<\/h3><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">require_once ABSPATH . &#039;wp-admin\/includes\/class-wp-upgrader.php&#039;;\nrequire_once ABSPATH . &#039;wp-admin\/includes\/file.php&#039;;\n\n\/\/ Handle upload\n$file_upload = new File_Upload_Upgrader( &#039;pluginzip&#039;, &#039;package&#039; );\n\n$upgrader = new Plugin_Upgrader( new Plugin_Installer_Skin() );\n$result   = $upgrader-&gt;install( $file_upload-&gt;package );<\/code><\/pre><\/div><h3 class=\"wp-block-heading\">Update a Plugin<\/h3><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">$upgrader = new Plugin_Upgrader( new Bulk_Upgrader_Skin() );\n\n\/\/ Update specific plugin\n$result = $upgrader-&gt;upgrade( &#039;plugin-folder\/plugin-file.php&#039; );\n\n\/\/ Bulk update\n$plugins = array(\n    &#039;akismet\/akismet.php&#039;,\n    &#039;hello-dolly\/hello.php&#039;,\n);\n$results = $upgrader-&gt;bulk_upgrade( $plugins );<\/code><\/pre><\/div><h3 class=\"wp-block-heading\">Plugin_Upgrader Methods<\/h3><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">class Plugin_Upgrader extends WP_Upgrader {\n    \/\/ Install plugin from URL\/path\n    public function install( $package, $args = array() );\n    \n    \/\/ Update single plugin\n    public function upgrade( $plugin, $args = array() );\n    \n    \/\/ Update multiple plugins\n    public function bulk_upgrade( $plugins, $args = array() );\n}<\/code><\/pre><\/div><h2 class=\"wp-block-heading\">Theme Installation<\/h2><h3 class=\"wp-block-heading\">Using Theme_Upgrader<\/h3><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">require_once ABSPATH . &#039;wp-admin\/includes\/class-wp-upgrader.php&#039;;\n\n$upgrader = new Theme_Upgrader( new Theme_Installer_Skin() );\n\n\/\/ Install from WordPress.org\n$result = $upgrader-&gt;install( &#039;https:\/\/downloads.wordpress.org\/theme\/flavflavor.zip&#039; );\n\nif ( is_wp_error( $result ) ) {\n    echo $result-&gt;get_error_message();\n}<\/code><\/pre><\/div><h3 class=\"wp-block-heading\">Update a Theme<\/h3><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">$upgrader = new Theme_Upgrader( new Theme_Upgrader_Skin() );\n\n\/\/ Update specific theme\n$result = $upgrader-&gt;upgrade( &#039;theme-slug&#039; );\n\n\/\/ Bulk update\n$themes  = array( &#039;theme-one&#039;, &#039;theme-two&#039; );\n$results = $upgrader-&gt;bulk_upgrade( $themes );<\/code><\/pre><\/div><h3 class=\"wp-block-heading\">Theme_Upgrader Methods<\/h3><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">class Theme_Upgrader extends WP_Upgrader {\n    \/\/ Install theme from URL\/path\n    public function install( $package, $args = array() );\n    \n    \/\/ Update single theme\n    public function upgrade( $theme, $args = array() );\n    \n    \/\/ Update multiple themes\n    public function bulk_upgrade( $themes, $args = array() );\n    \n    \/\/ Check parent theme requirements\n    public function check_parent_theme_filter( $install_result, $hook_extra, $child_result );\n}<\/code><\/pre><\/div><h2 class=\"wp-block-heading\">Upgrader Skins<\/h2><p>Skins control the output\/feedback during installation.<\/p><h3 class=\"wp-block-heading\">Available Skins<\/h3><figure class=\"wp-block-table\"><table><thead><tr><th>Skin Class<\/th><th>Use Case<\/th><\/tr><\/thead><tbody><tr><td><code>WP_Upgrader_Skin<\/code><\/td><td>Base skin<\/td><\/tr><tr><td><code>Plugin_Upgrader_Skin<\/code><\/td><td>Single plugin upgrade<\/td><\/tr><tr><td><code>Theme_Upgrader_Skin<\/code><\/td><td>Single theme upgrade<\/td><\/tr><tr><td><code>Bulk_Upgrader_Skin<\/code><\/td><td>Bulk upgrades<\/td><\/tr><tr><td><code>Bulk_Plugin_Upgrader_Skin<\/code><\/td><td>Bulk plugin upgrades<\/td><\/tr><tr><td><code>Bulk_Theme_Upgrader_Skin<\/code><\/td><td>Bulk theme upgrades<\/td><\/tr><tr><td><code>Plugin_Installer_Skin<\/code><\/td><td>Plugin installation<\/td><\/tr><tr><td><code>Theme_Installer_Skin<\/code><\/td><td>Theme installation<\/td><\/tr><tr><td><code>Language_Pack_Upgrader_Skin<\/code><\/td><td>Language packs<\/td><\/tr><tr><td><code>Automatic_Upgrader_Skin<\/code><\/td><td>Background updates<\/td><\/tr><tr><td><code>WP_Ajax_Upgrader_Skin<\/code><\/td><td>AJAX updates<\/td><\/tr><\/tbody><\/table><\/figure><h3 class=\"wp-block-heading\">Using WP_Ajax_Upgrader_Skin<\/h3><p>For AJAX\/background operations (no output):<\/p><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">$skin     = new WP_Ajax_Upgrader_Skin();\n$upgrader = new Plugin_Upgrader( $skin );\n\n$result = $upgrader-&gt;install( $package_url );\n\n\/\/ Get messages\n$messages = $skin-&gt;get_upgrade_messages();\n\n\/\/ Get errors\nif ( $skin-&gt;get_errors()-&gt;has_errors() ) {\n    $errors = $skin-&gt;get_errors();\n}<\/code><\/pre><\/div><h3 class=\"wp-block-heading\">Custom Skin<\/h3><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">class My_Custom_Skin extends WP_Upgrader_Skin {\n    public function header() {\n        echo &#039;&lt;div class=&quot;my-upgrade-wrapper&quot;&gt;&#039;;\n    }\n    \n    public function footer() {\n        echo &#039;&lt;\/div&gt;&#039;;\n    }\n    \n    public function feedback( $string, ...$args ) {\n        if ( ! empty( $args ) ) {\n            $string = vsprintf( $string, $args );\n        }\n        echo &#039;&lt;p class=&quot;my-feedback&quot;&gt;&#039; . esc_html( $string ) . &#039;&lt;\/p&gt;&#039;;\n    }\n    \n    public function error( $errors ) {\n        echo &#039;&lt;p class=&quot;my-error&quot;&gt;&#039; . esc_html( $errors ) . &#039;&lt;\/p&gt;&#039;;\n    }\n}<\/code><\/pre><\/div><h2 class=\"wp-block-heading\">Silent\/Background Installation<\/h2><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">function silent_plugin_install( $package_url ) {\n    require_once ABSPATH . &#039;wp-admin\/includes\/class-wp-upgrader.php&#039;;\n    \n    \/\/ Use skin that captures output\n    $skin     = new Automatic_Upgrader_Skin();\n    $upgrader = new Plugin_Upgrader( $skin );\n    \n    \/\/ Install silently\n    $result = $upgrader-&gt;install( $package_url );\n    \n    if ( is_wp_error( $result ) ) {\n        return $result;\n    }\n    \n    \/\/ Get the installed plugin file\n    $plugin_info = $upgrader-&gt;plugin_info();\n    \n    \/\/ Optionally activate\n    if ( $plugin_info ) {\n        activate_plugin( $plugin_info );\n    }\n    \n    return $plugin_info;\n}<\/code><\/pre><\/div><h2 class=\"wp-block-heading\">Plugin Management Functions<\/h2><h3 class=\"wp-block-heading\">Get Plugin Data<\/h3><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">\/\/ Get plugin header information\n$plugin_data = get_plugin_data( WP_PLUGIN_DIR . &#039;\/plugin-folder\/plugin-file.php&#039; );\n\/*\narray(\n    &#039;Name&#039;        =&gt; &#039;Plugin Name&#039;,\n    &#039;PluginURI&#039;   =&gt; &#039;https:\/\/example.com&#039;,\n    &#039;Version&#039;     =&gt; &#039;1.0.0&#039;,\n    &#039;Description&#039; =&gt; &#039;Plugin description&#039;,\n    &#039;Author&#039;      =&gt; &#039;Author Name&#039;,\n    &#039;AuthorURI&#039;   =&gt; &#039;https:\/\/author.com&#039;,\n    &#039;TextDomain&#039;  =&gt; &#039;plugin-textdomain&#039;,\n    &#039;DomainPath&#039;  =&gt; &#039;\/languages&#039;,\n    &#039;Network&#039;     =&gt; false,\n    &#039;RequiresWP&#039;  =&gt; &#039;5.0&#039;,\n    &#039;RequiresPHP&#039; =&gt; &#039;7.4&#039;,\n)\n*\/<\/code><\/pre><\/div><h3 class=\"wp-block-heading\">Get All Plugins<\/h3><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">\/\/ All plugins\n$plugins = get_plugins();\n\n\/\/ MU-plugins\n$mu_plugins = get_mu_plugins();\n\n\/\/ Drop-ins\n$dropins = get_dropins();<\/code><\/pre><\/div><h3 class=\"wp-block-heading\">Activate\/Deactivate<\/h3><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">\/\/ Activate\n$result = activate_plugin( &#039;plugin-folder\/plugin-file.php&#039; );\n\nif ( is_wp_error( $result ) ) {\n    \/\/ Activation failed\n}\n\n\/\/ Deactivate\ndeactivate_plugins( &#039;plugin-folder\/plugin-file.php&#039; );\n\n\/\/ Deactivate multiple\ndeactivate_plugins( array(\n    &#039;plugin-one\/plugin.php&#039;,\n    &#039;plugin-two\/plugin.php&#039;,\n), true );  \/\/ true = silent (no hooks)<\/code><\/pre><\/div><h3 class=\"wp-block-heading\">Delete Plugin<\/h3><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">$result = delete_plugins( array( &#039;plugin-folder\/plugin-file.php&#039; ) );\n\nif ( is_wp_error( $result ) ) {\n    echo $result-&gt;get_error_message();\n}<\/code><\/pre><\/div><h2 class=\"wp-block-heading\">Theme Management Functions<\/h2><h3 class=\"wp-block-heading\">Get Theme Data<\/h3><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">$theme = wp_get_theme( &#039;theme-slug&#039; );\n\nif ( $theme-&gt;exists() ) {\n    $name    = $theme-&gt;get( &#039;Name&#039; );\n    $version = $theme-&gt;get( &#039;Version&#039; );\n    $author  = $theme-&gt;get( &#039;Author&#039; );\n}<\/code><\/pre><\/div><h3 class=\"wp-block-heading\">Get All Themes<\/h3><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">$themes = wp_get_themes();\n\nforeach ( $themes as $theme_slug =&gt; $theme ) {\n    echo $theme-&gt;get( &#039;Name&#039; );\n}<\/code><\/pre><\/div><h3 class=\"wp-block-heading\">Switch\/Delete Theme<\/h3><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">\/\/ Switch active theme\nswitch_theme( &#039;theme-slug&#039; );\n\n\/\/ Delete theme\ndelete_theme( &#039;theme-slug&#039; );<\/code><\/pre><\/div><h2 class=\"wp-block-heading\">Checking for Updates<\/h2><h3 class=\"wp-block-heading\">Force Update Check<\/h3><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">\/\/ Force check for plugin updates\nwp_clean_plugins_cache();\ndelete_site_transient( &#039;update_plugins&#039; );\nwp_update_plugins();\n\n\/\/ Force check for theme updates  \ndelete_site_transient( &#039;update_themes&#039; );\nwp_update_themes();\n\n\/\/ Force check for core updates\nwp_version_check();<\/code><\/pre><\/div><h3 class=\"wp-block-heading\">Get Available Updates<\/h3><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">\/\/ Plugin updates\n$updates = get_site_transient( &#039;update_plugins&#039; );\nif ( isset( $updates-&gt;response ) ) {\n    foreach ( $updates-&gt;response as $plugin =&gt; $data ) {\n        echo $plugin . &#039; has update: &#039; . $data-&gt;new_version;\n    }\n}\n\n\/\/ Theme updates\n$updates = get_site_transient( &#039;update_themes&#039; );\nif ( isset( $updates-&gt;response ) ) {\n    foreach ( $updates-&gt;response as $theme =&gt; $data ) {\n        echo $theme . &#039; has update: &#039; . $data[&#039;new_version&#039;];\n    }\n}<\/code><\/pre><\/div><h2 class=\"wp-block-heading\">WP_Automatic_Updater<\/h2><p>For automatic background updates.<\/p><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">require_once ABSPATH . &#039;wp-admin\/includes\/class-wp-upgrader.php&#039;;\n\n$auto_updater = new WP_Automatic_Updater();\n\n\/\/ Check if auto-updates are disabled\nif ( $auto_updater-&gt;is_disabled() ) {\n    return;\n}\n\n\/\/ Check if specific update should run\n$should_update = $auto_updater-&gt;should_update( &#039;plugin&#039;, $update_data, ABSPATH );\n\n\/\/ Run auto-updates\n$auto_updater-&gt;run();<\/code><\/pre><\/div><h2 class=\"wp-block-heading\">Hooks<\/h2><h3 class=\"wp-block-heading\">Installation Hooks<\/h3><figure class=\"wp-block-table\"><table><thead><tr><th>Hook<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td><code>upgrader_pre_download<\/code><\/td><td>Before downloading package<\/td><\/tr><tr><td><code>upgrader_pre_install<\/code><\/td><td>Before installation<\/td><\/tr><tr><td><code>upgrader_post_install<\/code><\/td><td>After installation<\/td><\/tr><tr><td><code>upgrader_process_complete<\/code><\/td><td>After upgrade process<\/td><\/tr><tr><td><code>upgrader_package_options<\/code><\/td><td>Filter package options<\/td><\/tr><\/tbody><\/table><\/figure><h3 class=\"wp-block-heading\">Plugin-Specific<\/h3><figure class=\"wp-block-table\"><table><thead><tr><th>Hook<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td><code>activate_plugin<\/code><\/td><td>During plugin activation<\/td><\/tr><tr><td><code>deactivate_plugin<\/code><\/td><td>During plugin deactivation<\/td><\/tr><tr><td><code>activated_plugin<\/code><\/td><td>After plugin activated<\/td><\/tr><tr><td><code>deactivated_plugin<\/code><\/td><td>After plugin deactivated<\/td><\/tr><tr><td><code>deleted_plugin<\/code><\/td><td>After plugin deleted<\/td><\/tr><\/tbody><\/table><\/figure><h3 class=\"wp-block-heading\">Theme-Specific<\/h3><figure class=\"wp-block-table\"><table><thead><tr><th>Hook<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td><code>switch_theme<\/code><\/td><td>When theme is switched<\/td><\/tr><tr><td><code>after_switch_theme<\/code><\/td><td>After theme switch<\/td><\/tr><tr><td><code>deleted_theme<\/code><\/td><td>After theme deleted<\/td><\/tr><\/tbody><\/table><\/figure><h2 class=\"wp-block-heading\">Error Handling<\/h2><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">$upgrader = new Plugin_Upgrader( new WP_Ajax_Upgrader_Skin() );\n$result   = $upgrader-&gt;install( $package_url );\n\nif ( is_wp_error( $result ) ) {\n    $error_code = $result-&gt;get_error_code();\n    $error_msg  = $result-&gt;get_error_message();\n    \n    switch ( $error_code ) {\n        case &#039;no_package&#039;:\n            \/\/ Package URL not available\n            break;\n        case &#039;download_failed&#039;:\n            \/\/ Could not download\n            break;\n        case &#039;incompatible_archive&#039;:\n            \/\/ Invalid package structure\n            break;\n        case &#039;mkdir_failed&#039;:\n            \/\/ Could not create directory\n            break;\n        case &#039;folder_exists&#039;:\n            \/\/ Plugin\/theme already exists\n            break;\n    }\n}<\/code><\/pre><\/div><h2 class=\"wp-block-heading\">Complete Example: Plugin Auto-Installer<\/h2><div class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-language\">php<\/span><button class=\"code-copy-btn\" aria-label=\"Copy code\"><svg><use href=\"https:\/\/chubes.net\/wp-content\/themes\/chubes\/assets\/icons\/chubes.svg#icon-copy\"><\/use><\/svg><\/button><\/div><pre data-chubes-enhanced class=\"wp-block-code language-php\"><code class=\"language-php\">function auto_install_required_plugins() {\n    $required = array(\n        &#039;akismet&#039; =&gt; &#039;https:\/\/downloads.wordpress.org\/plugin\/akismet.zip&#039;,\n        &#039;jetpack&#039; =&gt; &#039;https:\/\/downloads.wordpress.org\/plugin\/jetpack.zip&#039;,\n    );\n    \n    $installed = get_plugins();\n    \n    require_once ABSPATH . &#039;wp-admin\/includes\/class-wp-upgrader.php&#039;;\n    \n    foreach ( $required as $slug =&gt; $url ) {\n        \/\/ Check if already installed\n        $plugin_file = null;\n        foreach ( $installed as $file =&gt; $data ) {\n            if ( strpos( $file, $slug ) === 0 ) {\n                $plugin_file = $file;\n                break;\n            }\n        }\n        \n        if ( $plugin_file ) {\n            \/\/ Already installed, just activate\n            if ( ! is_plugin_active( $plugin_file ) ) {\n                activate_plugin( $plugin_file );\n            }\n            continue;\n        }\n        \n        \/\/ Install the plugin\n        $skin     = new Automatic_Upgrader_Skin();\n        $upgrader = new Plugin_Upgrader( $skin );\n        $result   = $upgrader-&gt;install( $url );\n        \n        if ( ! is_wp_error( $result ) &amp;&amp; $result ) {\n            $plugin_file = $upgrader-&gt;plugin_info();\n            if ( $plugin_file ) {\n                activate_plugin( $plugin_file );\n            }\n        }\n    }\n}<\/code><\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>WordPress provides a comprehensive upgrader system for installing, updating, and managing plugins and themes. The core class is WP_Upgrader with specialized subclasses. Class Hierarchy WP_Upgrader (base class) \u251c\u2500\u2500 Plugin_Upgrader \u251c\u2500\u2500&#8230;<\/p>\n","protected":false},"featured_media":0,"template":"","meta":{"footnotes":""},"tags":[],"project":[594],"project_type":[749],"class_list":["post-5411","documentation","type-documentation","status-publish","hentry","project-admin-api","project_type-wordpress-reference"],"project_info":{"id":589,"name":"WordPress Core","slug":"wordpress-core"},"project_type_info":{"id":749,"name":"WordPress Reference","slug":"wordpress-reference"},"_links":{"self":[{"href":"https:\/\/chubes.net\/wp-json\/wp\/v2\/documentation\/5411","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/chubes.net\/wp-json\/wp\/v2\/documentation"}],"about":[{"href":"https:\/\/chubes.net\/wp-json\/wp\/v2\/types\/documentation"}],"version-history":[{"count":4,"href":"https:\/\/chubes.net\/wp-json\/wp\/v2\/documentation\/5411\/revisions"}],"predecessor-version":[{"id":9363,"href":"https:\/\/chubes.net\/wp-json\/wp\/v2\/documentation\/5411\/revisions\/9363"}],"wp:attachment":[{"href":"https:\/\/chubes.net\/wp-json\/wp\/v2\/media?parent=5411"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/chubes.net\/wp-json\/wp\/v2\/tags?post=5411"},{"taxonomy":"project","embeddable":true,"href":"https:\/\/chubes.net\/wp-json\/wp\/v2\/project?post=5411"},{"taxonomy":"project_type","embeddable":true,"href":"https:\/\/chubes.net\/wp-json\/wp\/v2\/project_type?post=5411"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}