Files
VDI-Starter/lib/activation.php
2025-08-22 15:40:01 -05:00

252 lines
6.9 KiB
PHP

<?php
/*
* On Theme Activation adds Home and News pages, sets up reading options for front page and posts page, and erases sample page and post
*/
// phpcs:ignore
if ( isset( $_GET['activated'] ) && is_admin() ) {
// Set Blog Description to nothing
update_option( 'blogdescription', '' );
// List of pages to create with nested structure
$arrPages = array(
'Home' => array(),
'News' => array(),
'Page Not Found (Error 404)' => array(),
'Contact Us' => array(),
/**
* Sample nested structure
*
* 'Parent Page' => array(
* 'Subpage 1' => array(
* 'Sub-subpage 1',
* 'Sub-subpage 2'
* ),
* 'Subpage 2.2' => array()
* ),
*/
);
foreach ( $arrPages as $pageTitle => $childPages ) {
// phpcs:ignore
$pageExists = get_page_by_title($pageTitle);
if ( ! $pageExists ) {
// Create the parent page
$pageId = wp_insert_post(
array(
'post_title' => $pageTitle,
'post_content' => '',
'post_type' => 'page',
'post_status' => 'publish',
)
);
// If there are child pages, create them under the parent page
foreach ( $childPages as $childPageTitle => $subChildPages ) {
if ( is_array( $subChildPages ) ) {
$subpageId = wp_insert_post(
array(
'post_title' => $childPageTitle,
'post_content' => '',
'post_type' => 'page',
'post_status' => 'publish',
'post_parent' => $pageId,
)
);
foreach ( $subChildPages as $subChildPageTitle ) {
wp_insert_post(
array(
'post_title' => $subChildPageTitle,
'post_content' => '',
'post_type' => 'page',
'post_status' => 'publish',
'post_parent' => $subpageId,
)
);
}
} else {
wp_insert_post(
array(
'post_title' => $childPageTitle,
'post_content' => '',
'post_type' => 'page',
'post_status' => 'publish',
'post_parent' => $pageId,
)
);
}
}
}
}
// Use a static front page
// phpcs:ignore
$home = get_page_by_title('Home');
update_option( 'page_on_front', $home->ID );
update_option( 'show_on_front', 'page' );
// Set the blog/news page
// phpcs:ignore
$news = get_page_by_title('News');
update_option( 'page_for_posts', $news->ID );
// Trash the samples
wp_delete_post( 1, true );
wp_delete_post( 2, true );
// Flush rewrite rules to ensure new pages are recognized
flush_rewrite_rules();
/**
* Install and activate must-use plugins
*/
$muPlugins = array(
array(
'url' => 'https://docs.vincentdevelopment.ca/files/advanced-custom-fields-pro.zip',
'active' => true,
),
array(
'url' => 'https://docs.vincentdevelopment.ca/files/gravity-forms.zip',
'active' => true,
),
array(
'url' => 'https://updraftplus.com/wp-content/uploads/updraftplus.zip',
'active' => false,
),
array(
'url' => 'https://downloads.wordpress.org/plugin/simple-history.5.11.0.zip',
'active' => true,
),
array(
'url' => 'https://downloads.wordpress.org/plugin/autodescription.5.1.2.zip',
'active' => true,
),
array(
'url' => 'https://downloads.wordpress.org/plugin/better-search-replace.1.4.10.zip',
'active' => true,
),
array(
'url' => 'https://downloads.wordpress.org/plugin/google-site-kit.1.153.0.zip',
'active' => false,
),
);
// Custom log file
$logFile = WP_CONTENT_DIR . '/mu-plugin-install.log';
/**
* Simple logging function.
*
* @param string $message The message to log.
*/
function log_message( $message ) {
global $logFile;
$timestamp = gmdate( 'Y-m-d H:i:s' );
// phpcs:ignore
file_put_contents( $logFile, "[$timestamp] $message\n", FILE_APPEND );
}
// Include necessary WordPress files
require_once ABSPATH . 'wp-admin/includes/file.php';
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
require_once ABSPATH . 'wp-admin/includes/plugin.php';
// Force direct filesystem access
add_filter( 'filesystem_method', fn() => 'direct' );
global $wp_filesystem;
if ( ! WP_Filesystem() ) {
log_message( 'Filesystem initialization failed.' );
return;
}
// Define a silent skin to avoid show_message() errors
// phpcs:disable
class Silent_Upgrader_Skin extends WP_Upgrader_Skin {
public function feedback( $string, ...$args ) {}
public function header() {}
public function footer() {}
public function error( $errors ) {
log_message( 'Upgrader error: ' . print_r( $errors, true ) );
}
public function before() {}
public function after() {}
}
// phpcs:enable
$skin = new Silent_Upgrader_Skin();
$upgrader = new Plugin_Upgrader( $skin );
// Process each plugin
foreach ( $muPlugins as $plug ) {
$plugUrl = $plug['url'];
$shouldActivate = ! empty( $plug['active'] );
// Download plugin
$response = wp_remote_get( $plugUrl );
if ( is_wp_error( $response ) ) {
log_message( "Failed to download plugin from {$plugUrl}: " . $response->get_error_message() );
continue;
}
// Extract filename from URL
$plugFileName = basename( wp_parse_url( $plugUrl, PHP_URL_PATH ) );
// Save the plugin zip
$plugZip = wp_upload_bits( $plugFileName, null, wp_remote_retrieve_body( $response ) );
if ( $plugZip['error'] ) {
log_message( "Failed to save plugin zip {$plugFileName}: " . $plugZip['error'] );
continue;
}
// Install the plugin
$installResult = $upgrader->install( $plugZip['file'] );
if ( is_wp_error( $installResult ) ) {
log_message( "Failed to install plugin {$plugFileName}: " . $installResult->get_error_message() );
// Cleanup temp zip
if ( file_exists( $plugZip['file'] ) ) {
wp_delete_file( $plugZip['file'] );
}
continue;
}
// Get plugin info ( folder/main file )
$plugInfo = $upgrader->plugin_info();
log_message( "plugin_info for {$plugFileName}: {$plugInfo}" );
if ( ! $plugInfo || ! file_exists( WP_PLUGIN_DIR . '/' . $plugInfo ) ) {
log_message( "Could not determine installed plugin file for {$plugFileName}." );
// Cleanup temp zip
if ( file_exists( $plugZip['file'] ) ) {
wp_delete_file( $plugZip['file'] );
}
continue;
}
log_message( "Successfully installed plugin {$plugInfo}." );
// Attempt activation if marked active
if ( $shouldActivate ) {
$activateResult = activate_plugin( $plugInfo );
if ( is_wp_error( $activateResult ) ) {
log_message( "Failed to activate plugin {$plugInfo}: " . $activateResult->get_error_message() );
} else {
log_message( "Successfully activated plugin {$plugInfo}." );
}
} else {
log_message( "Plugin {$plugInfo} installed but not activated ( per configuration )." );
}
// Cleanup temp zip
if ( file_exists( $plugZip['file'] ) ) {
wp_delete_file( $plugZip['file'] );
log_message( "Deleted temporary zip file {$plugZip['file']}." );
}
}
log_message( '=== Plugin installation and activation process completed ===' );
}