Site Builder
Editing:
Phone-Number-Slug-for-Multisite1.txt
writable 0666
<?php /** * Plugin Name: Phone‑Slug Multisite Toolkit * Description: Converts a business phone number into the site slug for WordPress Multisite **and** routes that site’s media to <site>/phone/… instead of wp‑content/uploads/sites/<id>/. Network‑only. * Version: 1.1.0 * Author: BestDealOn Dev Team * Network: true * License: GPL‑2.0+ */ if ( ! defined( 'ABSPATH' ) ) { exit; } /** * SETTINGS * ------------------------------------------------------------ * Change these if you want a different media sub‑folder or phone format rules. */ const PNS_MEDIA_DIRNAME = 'phone'; // Appears as /<slug>/phone/2025/06/img.jpg const PNS_MIN_DIGITS = 7; // Minimum digits accepted as a phone number const PNS_MAX_DIGITS = 15; // Max (E.164 + country code) /* -------------------------------------------------------------------------- * 1. SIGN‑UP & SITE‑CREATION HOOKS * -------------------------------------------------------------------------- */ /** * Inject a "Business Phone Number" field into the public sign‑up form. */ function pns_signup_extra_field() { if ( ! is_user_logged_in() && is_multisite() && ! is_admin() ) { ?> <p class="pns-phone-wrap"> <label for="pns_phone">Business Phone Number<br/> <input name="pns_phone" type="text" id="pns_phone" value="" placeholder="(555) 123‑4567" required /> </label> </p> <?php // Hide WordPress's default "Site" slug input so users don’t type anything. echo '<style>.site-name {display:none;}</style>'; } } add_action( 'signup_blogform', 'pns_signup_extra_field' ); /** * Validate phone number & turn it into the blog slug during public sign‑up. */ function pns_validate_signup( $result ) { if ( isset( $_POST['pns_phone'] ) ) { $digits = preg_replace( '/\D+/', '', $_POST['pns_phone'] ); if ( strlen( $digits ) < PNS_MIN_DIGITS || strlen( $digits ) > PNS_MAX_DIGITS ) { $result['errors']->add( 'pns_phone', __( 'Please enter a valid phone number.' ) ); } else { // Override the requested slug/path before WP inserts the blog. $_POST['blogname'] = $digits; // The slug WP will store in wp_blogs.path $_POST['blog_title'] = sanitize_text_field( $_POST['blog_title'] ?? '' ); $result['blogname'] = $digits; $result['domain'] = $result['domain']; // unchanged $result['path'] = '/' . $digits . '/'; $result['meta']['pns_phone'] = $digits; } } return $result; } add_filter( 'wpmu_validate_blog_signup', 'pns_validate_signup', 10, 1 ); /** * Network‑admin → Sites → Add New. Adds the phone field + enforces slug. */ function pns_network_admin_site_form() { ?> <h2>Phone Number Slug</h2> <table class="form-table"> <tr class="form-field"> <th scope="row"><label for="pns_phone">Business Phone Number</label></th> <td><input name="pns_phone" type="text" id="pns_phone" value="" placeholder="5551234567" /></td> </tr> </table> <script> // Auto‑sync slug field (function(){ const phone = document.getElementById('pns_phone'); const slug = document.getElementById('site-address'); if ( phone && slug ) { phone.addEventListener('keyup', ()=>{slug.value = phone.value.replace(/\D+/g,'');}); } })(); </script> <?php } add_action( 'network_site_new_form', 'pns_network_admin_site_form' ); /** * When network‑admin saves a new site, normalise phone + overwrite slug/path. */ function pns_network_admin_new_site( $blog_id ) { if ( ! empty( $_POST['pns_phone'] ) ) { $digits = preg_replace( '/\D+/', '', $_POST['pns_phone'] ); if ( $digits ) { // Update wp_blogs.path and wp_blogs.domain if needed. $slug_path = '/' . $digits . '/'; $blog_data = get_blog_details( $blog_id ); global $wpdb; $wpdb->update( $wpdb->blogs, [ 'path' => $slug_path ], [ 'blog_id' => $blog_id ] ); // Store phone meta so we can fetch it later. add_blog_option( $blog_id, 'pns_phone', $digits ); // Also correct the upload directory right after creation. pns_prepare_media_folder( $blog_id, $digits ); } } } add_action( 'wpmu_new_blog', 'pns_network_admin_new_site', 20, 1 ); /* -------------------------------------------------------------------------- * 2. MEDIA HANDLING * -------------------------------------------------------------------------- */ /** * Ensure the custom uploads directory exists and WP knows where it is. */ function pns_prepare_media_folder( $blog_id = null, $digits = null ) { if ( ! $blog_id ) { $blog_id = get_current_blog_id(); } if ( ! $digits ) { $digits = get_blog_option( $blog_id, 'pns_phone' ); if ( ! $digits ) { // Derive from path e.g. /5615551234/ $details = get_blog_details( $blog_id ); $digits = trim( $details->path, '/' ); } } $media_rel = 'uploads/sites/' . $blog_id . '/' . PNS_MEDIA_DIRNAME; $media_abs = WP_CONTENT_DIR . '/' . $media_rel; if ( ! is_dir( $media_abs ) ) { wp_mkdir_p( $media_abs ); } // Save per‑site options so WordPress core uses them automatically. switch_to_blog( $blog_id ); update_option( 'upload_path', $media_rel ); // relative to ABSPATH update_option( 'upload_url_path', home_url( '/' . PNS_MEDIA_DIRNAME ) ); restore_current_blog(); } /** * Filter upload_dir at runtime – mainly for legacy sites created before v1.1. */ function pns_filter_upload_dir( $dirs ) { if ( is_multisite() ) { $blog_id = get_current_blog_id(); $media_rel = 'uploads/sites/' . $blog_id . '/' . PNS_MEDIA_DIRNAME; $subfolder = '/'. date_i18n( 'Y' ) . '/' . date_i18n( 'm' ); $path = WP_CONTENT_DIR . '/' . $media_rel . $subfolder; $url = home_url( '/' . PNS_MEDIA_DIRNAME . $subfolder ); // Make sure month/year dirs exist. if ( ! is_dir( $path ) ) { wp_mkdir_p( $path ); } $dirs['path'] = $path; $dirs['url'] = $url; $dirs['basedir']= WP_CONTENT_DIR . '/' . $media_rel; $dirs['baseurl']= home_url( '/' . PNS_MEDIA_DIRNAME ); $dirs['subdir'] = $subfolder; } return $dirs; } add_filter( 'upload_dir', 'pns_filter_upload_dir', 99 ); /* -------------------------------------------------------------------------- * 3. UTILITY – when an **existing** blog is updated to v1.1, create folder on load. * -------------------------------------------------------------------------- */ function pns_on_load() { if ( is_multisite() && ! defined( 'DOING_CRON' ) && ! defined( 'WP_CLI' ) ) { static $done = false; if ( $done ) { return; } pns_prepare_media_folder(); $done = true; } } add_action( 'init', 'pns_on_load', 99 );
Save changes
Create folder
writable 0777
Create
Cancel