AlkantarClanX12

Your IP : 216.73.217.24


Current Path : /www/capitalgmcbuickregina_830/public/wp-content/plugins/leadbox/lib/
Upload File :
Current File : /www/capitalgmcbuickregina_830/public/wp-content/plugins/leadbox/lib/actions.php

<?php

add_action('init', function () {
  add_action('enqueue_block_editor_assets', function () {
    wp_enqueue_script(
      'leadbox-gutenberg-blocks',
      dirname(plugin_dir_url(__FILE__)) . '/dist/blocks.build.js',
      array(
        'wp-blocks',
        'wp-editor',
        'wp-element',
        'wp-components'
      ),
      false,
      false
    );

    wp_enqueue_style(
      'leadbox-gutenberg-blocks',
      dirname(plugin_dir_url(__FILE__)) . '/dist/blocks.editor.build.css',
      array(),
      false,
      false
    );

    wp_enqueue_style(
      'leadbox-gutenberg-blocks',
      dirname(plugin_dir_url(__FILE__)) . '/dist/blocks.style.build.css',
      array(),
      false,
      false
    );
  });

  add_filter('block_categories', function ($categories, $post) {
    return array_merge(
      $categories,
      array(
        array(
          'slug' => 'leadbox',
          'title' => __('Leadbox', 'leadbox-plugin'),
        ),
      )
    );
  }, 10, 2);

  // Check cache first
  $cached_data = get_transient('leadbox_block_data');
  $file = wp_get_upload_dir()['basedir'] . '/data/inventory.json';

  // Only proceed if file exists
  if (!file_exists($file)) {
    leadbox_logger()->error('Inventory file not found for block registration', array(
      'file' => $file,
    ));
    // Initialize empty data structure
    $cached_data = array(
      'years' => array(),
      'makes' => array(),
      'models' => array(),
      'trims' => array(),
      'locations' => array(),
      'types' => array(),
      'statuses' => array(),
      'stock_numbers' => array(),
      'tags' => array(),
      'year_min' => 0,
      'year_max' => 0,
      'price_min' => 0,
      'price_max' => 0,
      'mileage_min' => 0,
      'mileage_max' => 0,
    );
  } else {
    $file_mtime = filemtime($file);
    $cached_mtime = get_transient('leadbox_block_data_mtime');

    // Only read if cache is empty OR file was modified
    if ($cached_data === false || $cached_mtime != $file_mtime) {
      // Read and process inventory
      $data = json_decode(file_get_contents($file), true);

      if ($data === null || !isset($data['vehicles'])) {
        leadbox_logger()->error('Failed to parse inventory for block registration', array(
          'file' => $file,
          'json_error' => json_last_error_msg(),
        ));
        // Initialize empty data structure
        $cached_data = array(
          'years' => array(),
          'makes' => array(),
          'models' => array(),
          'trims' => array(),
          'locations' => array(),
          'types' => array(),
          'statuses' => array(),
          'stock_numbers' => array(),
          'tags' => array(),
          'year_min' => 0,
          'year_max' => 0,
          'price_min' => 0,
          'price_max' => 0,
          'mileage_min' => 0,
          'mileage_max' => 0,
        );
      } else {
        // Extract unique values
        $years = array();
        $makes = array();
        $models = array();
        $trims = array();
        $locations = array();
        $prices = array();
        $mileages = array();
        $types = array();
        $statuses = array();
        $stock_numbers = array();
        $tags = array();

        foreach ($data['vehicles'] as $vehicle) {
          $years[] = $vehicle['year'];
          $makes[] = $vehicle['make'];
          $models[] = $vehicle['model'];
          $trims[] = (isset($vehicle) && isset($vehicle['trim'])) ? $vehicle['trim'] : "";
          $locations[] = (isset($vehicle) && isset($vehicle['location'])) ? $vehicle['location'] : "";
          $prices[] = $vehicle['price'];
          $mileages[] = (isset($vehicle['mileage'])) ? $vehicle['mileage'] : 0;
          $types[] = $vehicle['type'];
          $statuses[] = $vehicle['condition'];
          $stock_numbers[] = $vehicle['stocknumber'];
          $tags[] = $vehicle['tags'];
        }

        // Deduplicate and sort
        $years = unique($years);
        $makes = unique($makes);
        $models = unique($models);
        $trims = unique($trims);
        $locations = unique($locations);
        $prices = unique($prices);
        $mileages = unique($mileages);
        $types = unique($types);
        $statuses = unique($statuses);
        //$stock_numbers = unique($stock_numbers);

        if(!isset($mileages) || sizeof($mileages) == 0 ){
          $mileages[]=0;
        }

        //var_dump($tags);
        $tags = array_reduce(unique($tags), function ($_tags, $item) {
          $_tags = is_array($_tags) ? $_tags : (array) $_tags;
          // Verificar si $item es null o no es string
          if ($item === null || !is_string($item)) {
            // Si es null o no es string, usar array vacío para evitar warnings
            $exploded = [];
          } else {
            // Si es string válido, hacer el explode normalmente
            $exploded = explode(',', $item);
          }
          $merged = array_merge($_tags, $exploded);
          return array_unique($merged);
        }, []);

        $tags = array_values($tags);

        sort($makes);
        sort($models);
        sort($trims);
        sort($locations);
        sort($types);
        sort($statuses);

        // Min/max values
        $year_min = !empty($years) ? min($years) : 0;
        $year_max = !empty($years) ? max($years) : 0;
        $price_min = !empty($prices) ? min($prices) : 0;
        $price_max = !empty($prices) ? max($prices) : 0;
        $mileage_min = !empty($mileages) ? min($mileages) : 0;
        $mileage_max = !empty($mileages) ? max($mileages) : 0;

        // Cache for 1 hour
        $cached_data = array(
          'years' => $years,
          'makes' => $makes,
          'models' => $models,
          'trims' => $trims,
          'locations' => $locations,
          'types' => $types,
          'statuses' => $statuses,
          'stock_numbers' => $stock_numbers,
          'tags' => $tags,
          'year_min' => $year_min,
          'year_max' => $year_max,
          'price_min' => $price_min,
          'price_max' => $price_max,
          'mileage_min' => $mileage_min,
          'mileage_max' => $mileage_max,
        );

        set_transient('leadbox_block_data', $cached_data, HOUR_IN_SECONDS);
        set_transient('leadbox_block_data_mtime', $file_mtime, HOUR_IN_SECONDS);
      }
    }
  }

  $flags = [
    'special' => 'Special',
    'salepending' => 'Sale Pending',
    'onhome' => 'On Home',
    'certified' => 'Certified',
    'demo' => 'Demo',
    'asis' => 'Asis',
    'incoming' => 'Incoming',
    'excludeincoming' => 'Exclude Incoming',
    'excludesalepending' => 'Exclude Sale Pending',
    'excludedemo' => 'Exclude Demo',
    'noprice' => 'No Price',
    'reserved' => 'Reserved'
  ];

  // LBT-1462: reusable listing-image groups the dealer can pick from in this block.
  // Passed as an attribute default (same pattern as make_items/flags_items) so the
  // editor can build the select without an extra localize/REST round-trip.
  $listing_image_groups = class_exists('LBX_Listing_Image_Groups')
    ? LBX_Listing_Image_Groups::get_groups_for_select()
    : array();

  // Register our block, and explicitly define the attributes we accept.
  register_block_type('leadbox/inventory-block', array(
    'attributes' => array(
      'filter' => array(
        'type' => 'boolean',
        'default' => false,
      ),
      // LBT-1462: id of the selected listing-image group ('' = use global/legacy
      // config). `_items` feeds the editor's select and is not persisted meaningfully.
      'listing_image_group' => array(
        'type' => 'string',
        'default' => '',
      ),
      'listing_image_group_items' => array(
        'type' => 'array',
        'default' => $listing_image_groups,
      ),
      'slick' => array(
        'type' => 'boolean',
        'default' => false,
      ),
      'layout' => array(
        'type' => 'string',
        'default' => 'normal'
      ),
      'layout_items' => array(
        'type' => 'array',
        'default' => array('normal', 'compact')
      ),
      'limit' => array(
        'type' => 'string',
        'default' => '0',
      ),
      'sort_by' => array(
        'type' => 'string',
        'default' => 'year'
      ),
      'sort_by_model' => array(
        'type' => 'string',
        'default' => 'model'
      ),
      'sort_by_items' => array(
        'type' => 'array',
        'default' => array('Year', 'Price', 'Age','Totaldiscounts', 'Make','Make (Custom)', 'Model','Model (Custom)','NumberOfPics', 'Location', 'Location (Custom)', 'Stocknumbers','Stocknumber (Custom)','CashPrice')
      ),
      'sort_by_condition' => array(
        'type' => 'string',
        'default' => 'desc'
      ),
      'sort_makes' => array(
        'type' => 'array',
        'default' => array(),
      ),
      'sort_models' => array(
        'type' => 'array',
        'default' => array(),
      ),
      'sort_locations' => array(
        'type' => 'array',
        'default' => array(),
      ),
      'sort_stocks' => array(
        'type' => 'array',
        'default' => array(),
      ),
      'sort_by_condition_items' => array(
        'type' => 'array',
        'default' => array('Asc', 'Desc')
      ),
      'sort_by_secondary' => array(
        'type' => 'string',
        'default' => 'none'
      ),
      'sort_by_condition_secondary' => array(
        'type' => 'string',
        'default' => 'desc'
      ),
      'year' => array(
        'type' => 'string',
        'default' => 'all',
      ),
      'year_from' => array(
        'type' => 'integer',
        'default' => $cached_data['year_min'] ?? 0,
      ),
      'year_to' => array(
        'type' => 'integer',
        'default' => $cached_data['year_max'] ?? 0,
      ),
      'year_min' => array(
        'type' => 'integer',
        'default' => $cached_data['year_min'] ?? 0,
      ),
      'year_max' => array(
        'type' => 'integer',
        'default' => $cached_data['year_max'] ?? 0,
      ),
      'make' => array(
        'type' => 'string',
        'default' => 'all',
      ),
      'make_items' => array(
        'type' => 'array',
        'default' => $cached_data['makes'] ?? array(),
        'items' => array('type' => 'string')
      ),
      'make_selected' => array(
        'type' => 'array',
        'default' => array(),
        'items' => array('type' => 'string')
      ),
      'model' => array(
        'type' => 'string',
        'default' => 'all',
      ),
      'model_items' => array(
        'type' => 'array',
        'default' => $cached_data['models'] ?? array(),
        'items' => array('type' => 'string')
      ),
      'model_selected' => array(
        'type' => 'array',
        'default' => array(),
        'items' => array('type' => 'string')
      ),
      'trim' => array(
        'type' => 'string',
        'default' => 'all',
      ),
      'trim_items' => array(
        'type' => 'array',
        'default' => $cached_data['trims'] ?? array(),
        'items' => array('type' => 'string')
      ),
      'trim_selected' => array(
        'type' => 'array',
        'default' => array(),
        'items' => array('type' => 'string')
      ),
      'location' => array(
        'type' => 'string',
        'default' => 'all',
      ),
      'location_items' => array(
        'type' => 'array',
        'default' => $cached_data['locations'] ?? array(),
        'items' => array('type' => 'string')
      ),
      'location_selected' => array(
        'type' => 'array',
        'default' => array(),
        'items' => array('type' => 'string')
      ),
      'price' => array(
        'type' => 'string',
        'default' => 'all',
      ),
      'price_from' => array(
        'type' => 'integer',
        'default' => $cached_data['price_min'] ?? 0,
      ),
      'price_to' => array(
        'type' => 'integer',
        'default' => $cached_data['price_max'] ?? 0,
      ),
      'price_min' => array(
        'type' => 'integer',
        'default' => $cached_data['price_min'] ?? 0,
      ),
      'price_max' => array(
        'type' => 'integer',
        'default' => $cached_data['price_max'] ?? 0,
      ),
      'mileage' => array(
        'type' => 'string',
        'default' => 'all',
      ),
      'mileage_from' => array(
        'type' => 'integer',
        'default' => $cached_data['mileage_min'] ?? 0,
      ),
      'mileage_to' => array(
        'type' => 'integer',
        'default' => $cached_data['mileage_max'] ?? 0,
      ),
      'mileage_min' => array(
        'type' => 'integer',
        'default' => $cached_data['mileage_min'] ?? 0,
      ),
      'mileage_max' => array(
        'type' => 'integer',
        'default' => $cached_data['mileage_max'] ?? 0,
      ),
      'type' => array(
        'type' => 'string',
        'default' => 'all',
      ),
      'type_items' => array(
        'type' => 'array',
        'default' => $cached_data['types'] ?? array(),
        'items' => array('type' => 'string')
      ),
      'type_selected' => array(
        'type' => 'array',
        'default' => array(),
        'items' => array('type' => 'string')
      ),
      'status' => array(
        'type' => 'string',
        'default' => 'all',
      ),
      'status_items' => array(
        'type' => 'array',
        'default' => $cached_data['statuses'] ?? array(),
        'items' => array('type' => 'string')
      ),
      'status_selected' => array(
        'type' => 'array',
        'default' => array(),
        'items' => array('type' => 'string')
      ),
      'tags' => array(
        'type' => 'string',
        'default' => 'all',
      ),
      'tags_items' => array(
        'type' => 'array',
        'default' => $cached_data['tags'] ?? array(),
        'items' => array('type' => 'string')
      ),
      'tags_selected' => array(
        'type' => 'array',
        'default' => array(),
        'items' => array('type' => 'string')
      ),
      'stock' => array(
        'type' => 'string',
        'default' => 'all',
      ),
      'stock_items' => array(
        'type' => 'array',
        'default' => $cached_data['stock_numbers'] ?? array(),
        'items' => array('type' => 'string')
      ),
      'stock_selected' => array(
        'type' => 'array',
        'default' => array(),
        'items' => array('type' => 'string')
      ),
      'flags' => array(
        'type' => 'string',
        'default' => 'none',
      ),
      'flags_items' => array(
        'type' => 'array',
        'default' => $flags,
        'items' => array('type' => 'string')
      ),
      'flags_selected' => array(
        'type' => 'array',
        'default' => array(),
        'items' => array('type' => 'string')
      ),
      'vehicle_card' => array(
        'type' => 'string',
        'default' => '',
      ),
      'exclude_tags' => array(
        'type' => 'string',
        'default' => '',
      ),
      'exclude_tags_items' => array(
        'type' => 'array',
        'default' => $cached_data['tags'] ?? array(),
        'items' => array('type' => 'string')
      ),
      'exclude_tags_selected' => array(
        'type' => 'array',
        'default' => array(),
        'items' => array('type' => 'string')
      )
    ),
    'editor_script' => 'leadbox-gutenberg-blocks',
    'render_callback' => 'leadbox_render_inventory',
  ));

  // Register our block, and explicitly define the attributes we accept.
  register_block_type('leadbox/line-up-block', array(
    'attributes' => array(),
    'editor_script' => 'leadbox-gutenberg-blocks',
    'render_callback' => 'leadbox_render_line_up',
  ));

   // Register our block, and explicitly define the attributes we accept.
   register_block_type('leadbox/omnisearch-block', array(
    'attributes' => array(),
    'editor_script' => 'leadbox-gutenberg-blocks',
    'render_callback' => 'leadbox_render_omnisearch',
  ));

   // Register our block, and explicitly define the attributes we accept.
   register_block_type('leadbox/quick-search-block', array(
    'attributes' => array(),
    'editor_script' => 'leadbox-gutenberg-blocks',
    'render_callback' => 'leadbox_render_quick_search',
  ));

  register_block_type('leadbox/previously-viewed-block', array(
    'attributes' => array(),
    'editor_script' => 'leadbox-gutenberg-blocks',
    'render_callback' => 'leadbox_render_previously_viewed',
  ));

  register_block_type('leadbox/hours-of-operations-block', array(
    'attributes' => array(
      'sales' => array(
        'type' => 'boolean',
        'default' => true,
      ),
      'service' => array(
        'type' => 'boolean',
        'default' => true,
      ),
      'parts' => array(
        'type' => 'boolean',
        'default' => true,
      ),
      'additional1' => array(
        'type' => 'boolean',
        'default' => false,
      ),
      'additional2' => array(
        'type' => 'boolean',
        'default' => false,
      ),
      'additional3' => array(
        'type' => 'boolean',
        'default' => false,
      )
    ),
    'editor_script' => 'leadbox-gutenberg-blocks',
    'render_callback' => 'leadbox_render_hours_of_operations',
  ));

// VDP
register_block_type('leadbox/vdp-block', array(
    'attributes' => array(
      'stock_vdp' => array(
        'type' => 'string',
        'default' => '',
      ),
      'stock_items' => array(
        'type' => 'array',
        'default' => $cached_data['stock_numbers'] ?? array(),
        'items' => array('type' => 'string')
      ),
      'stock_vdp_selected' => array(
        'type' => 'array',
        'default' => array(),
        'items' => array('type' => 'string')
      ),
    ),
    'editor_script' => 'leadbox-gutenberg-blocks',
    'render_callback' => 'leadbox_render_vdp',
  ));

  add_shortcode('inventory', 'leadbox_render_inventory');
}, 100);

add_action('admin_init', function () {
  if (is_admin()) {
    remove_submenu_page('edit.php?post_type=team_manager', 'team_manager');
    remove_submenu_page('edit.php?post_type=team_manager', 'team-manager-shortcode-generator');
  }
}, 100);

add_action('do_meta_boxes', function () {
  if (is_admin()) {
    remove_meta_box('team_social', 'team_manager', 'normal');
  }
}, 100);

function wps_remove_role() {
  remove_role( 'marketer' );
  remove_role( 'admin' );
  remove_role( 'seo-manager' );
  remove_role( 'seo-editor' );
  remove_role( 'wpseo_manager' );
  remove_role( 'wpseo_editor' );
  remove_role( 'author' );
  remove_role( 'contributor' );
  remove_role( 'subscriber' );
  remove_role( 'dealer-admin' );
}

add_action( 'admin_init', 'wps_remove_role' );
function wps_change_role_name() {
  global $wp_roles;
  if ( ! isset( $wp_roles ) )
  $wp_roles = new WP_Roles();
  $wp_roles->roles['administrator']['name'] = 'Leadbox Admin';
  $wp_roles->role_names['administrator'] = 'Leadbox Admin';
  $wp_roles->roles['editor']['name'] = 'Dealer Marketing';
  $wp_roles->role_names['editor'] = 'Dealer Marketing';
}

add_action('admin_init', 'wps_change_role_name');

function leadbox_new_role()
{
    // add the new user role
    add_role(
      'dealer-admin',
      'Dealer Admin',
      array(
      'upload_files' => true,
      'read' => true,
      'edit_posts' => true,
      'delete_posts' => true,
      'delete_others_posts' =>true,
      'delete_published_posts' => true,
      'publish_posts' => true,
      'read_page' => true,
      'read_pages' => true,
      'read_private_pages' => true,
      'edit_page' => true,
      'manage_categories' => true,
      'edit_pages' => true,
      'edit_others_pages' => true,
      'edit_published_pages' => true,
      'edit_published_posts' => true,
      'delete_pages' => true,
      'delete_others_pages' =>true,
      'delete_published_pages' => true,
      'publish_pages' => true,
      'smartslider' => true,
      'smartslider_config' => true,
      'smartslider_edit' => true,
      'smartslider_delete' => true,
      'pixelyoursite' => true,
      'manage_pys' => true,
      'manage_options' => true,
      'switch_themes' => true,
      'edit_theme_options' => true,
      'create_users' => true,
      'delete_users' => true,
      'list_users' => true,
      'promote_users' => true,
      'edit_others_posts' => true,
      'moderate_comments' => false,
      'import' => false,
      'menus' => true,
      'widgets' => true,
      'wpseo_manage_options' => true,
      'wpseo_dashboard' => true,
      'unfiltered_html' => true,
      )
    );

}
add_action('admin_init', 'leadbox_new_role');

/**
 * Helper function get getting roles that the user is allowed to create/edit/delete.
 *
 * @param   WP_User $user
 * @return  array
 */
function wpse_188863_get_allowed_roles( $user ) {
  $allowed = array();
  if ( in_array( 'administrator', $user->roles ) ) { // Admin can edit all roles
      $allowed = array_keys( $GLOBALS['wp_roles']->roles );
  } elseif ( in_array( 'dealer-admin', $user->roles ) ) {
      $allowed[] = 'dealer-admin';
      $allowed[] = 'editor';
  }
  return $allowed;
}

/**
 * Remove roles that are not allowed for the current user role.
 */
function wpse_188863_editable_roles( $roles ) {
  if ( $user = wp_get_current_user() ) {
      $allowed = wpse_188863_get_allowed_roles( $user );

      foreach ( $roles as $role => $caps ) {
          if ( ! in_array( $role, $allowed ) )
              unset( $roles[ $role ] );
      }
  }

  return $roles;
}

add_filter( 'editable_roles', 'wpse_188863_editable_roles' );

/**
 * Prevent users deleting/editing users with a role outside their allowance.
 */
function wpse_188863_map_meta_cap( $caps, $cap, $user_ID, $args ) {
  if ( ( $cap === 'edit_user' || $cap === 'delete_user' ) && $args ) {
      $the_user = get_userdata( $user_ID ); // The user performing the task
      $user     = get_userdata( $args[0] ); // The user being edited/deleted

      if ( $the_user && $user && $the_user->ID != $user->ID /* User can always edit self */ ) {
          $allowed = wpse_188863_get_allowed_roles( $the_user );

          if ( array_diff( $user->roles, $allowed ) ) {
              // Target user has roles outside of our limits
              $caps[] = 'not_allowed';
          }
      }
  }

  return $caps;
}

add_filter( 'map_meta_cap', 'wpse_188863_map_meta_cap', 10, 4 );

function add_admin_caps() {
  $role = get_role( 'administrator');
  $role->add_cap('leadbox_settings');
  $role->add_cap('smartslider');
  $role->add_cap('smartslider_config');
  $role->add_cap('smartslider_edit');
  $role->add_cap('smartslider_delete');
  $role->add_cap('menus');
}
add_action( 'admin_init', 'add_admin_caps');

function add_dealer_marketing_caps() {
  $role = get_role( 'editor');
  $role->add_cap('menus');
  $role->add_cap('manage_options');
  $role->add_cap('wpseo_manage_options');
  $role->add_cap('wpseo_dashboard');
  $role->add_cap('smartslider');
  $role->add_cap('smartslider_config');
  $role->add_cap('smartslider_edit');
  $role->add_cap('smartslider_delete');
}
add_action( 'admin_init', 'add_dealer_marketing_caps');

function remove_user_role_menus()
{

  $roles = wp_get_current_user()->roles;

  if (in_array('editor', $roles)) {
    remove_menu_page('admin.php?page=stackable');
    remove_menu_page('admin.php?page=ninja-forms');
    remove_menu_page('edit-comments.php');
    remove_menu_page('tools.php');
  }

}
add_action('admin_menu', 'remove_user_role_menus', 9999);

function rewrites()
{
    // vdp rewrite
    //add_rewrite_rule('test-model/([^/]+)/?$', 'index.php?pagename=test-model&model_string=$matches[1]', 'top');
    add_rewrite_rule('forme/([A-Za-z-]+)/?$', 'index.php?pagename=forme&form_id=$matches[1]', 'top');
    add_rewrite_rule(
      'forme/([A-Za-z-]+)/([0-9]+)/?$',
      'index.php?pagename=forme&form_id=$matches[1]&vehicle_id=$matches[2]&from=vls',
      'top'
    );
    add_rewrite_rule('form/([A-Za-z-]+)/?$', 'index.php?pagename=form&form_id=$matches[1]', 'top');
    add_rewrite_rule(
      'form/([A-Za-z-]+)/([0-9]+)/?$',
      'index.php?pagename=form&form_id=$matches[1]&vehicle_id=$matches[2]&from=vls',
      'top'
    );
    add_rewrite_rule('view/([^/]+)/?$', 'index.php?pagename=view&vdp_string=$matches[1]', 'top');
    add_rewrite_rule('model/([^/]+)/?$', 'index.php?pagename=model&model_string=$matches[1]', 'top');
    add_rewrite_rule('model-vue/([^/]+)/?$', 'index.php?pagename=model-vue&model_string=$matches[1]', 'top');
    add_rewrite_rule('modele/([^/]+)/?$', 'index.php?pagename=modele&model_string=$matches[1]', 'top');
    add_rewrite_rule('showroom/([^/]+)/?$', 'index.php?pagename=showroom&model_string=$matches[1]', 'top');
    add_rewrite_rule('salle-de-montre/([^/]+)/?$', 'index.php?pagename=salle-de-montre&model_string=$matches[1]', 'top');
    add_rewrite_rule('new/([A-Za-zÀ-ÿ0-9/.,-_]+)/?$', 'index.php?pagename=new&search_string=$matches[1]', 'top');
    add_rewrite_rule('neufs/([A-Za-zÀ-ÿ0-9/.,-_]+)/?$', 'index.php?pagename=neufs&model_string=$matches[1]', 'top');
    add_rewrite_rule('view-print/([^/]+)/?$', 'index.php?pagename=view-print&vdp_string=$matches[1]', 'top');
    add_rewrite_rule('vue/([^/]+)/?$', 'index.php?pagename=vue&vdp_string=$matches[1]', 'top');
    add_rewrite_rule('vue-imprimer/([^/]+)/?$', 'index.php?pagename=vue-imprimer&vdp_string=$matches[1]', 'top');
    add_rewrite_rule('search/([A-Za-zÀ-ÿ0-9/.,-_]+)/?$', 'index.php?pagename=search&search_string=$matches[1]', 'top');
    add_rewrite_rule('recherche/([A-Za-zÀ-ÿ0-9/.,-_]+)/?$', 'index.php?pagename=recherche&search_string=$matches[1]', 'top');
    add_rewrite_rule('build-and-price/([A-Za-zÀ-ÿ0-9/.,-_]+)/?$', 'index.php?pagename=build-and-price&search_string=$matches[1]', 'top');

    $pages = get_pages();
    // Sort by depth: parents first, children last.
    // Since 'top' prepends rules, children added last end up with higher priority.
    usort($pages, function($a, $b) {
      return count(get_post_ancestors($a->ID)) - count(get_post_ancestors($b->ID));
    });
    foreach ( $pages as $page ) {
      if ( has_block( 'leadbox/inventory-block',$page ) ) {
        $page_name = get_page_uri($page->ID);
        // Filter rule requires at least two URL segments (key/value pair like status/demo/).
        // Single segments like "corvette" won't match, so child page URLs fall through
        // to WordPress native page routing instead of being captured as filters.
        add_rewrite_rule($page_name.'/([A-Za-zÀ-ÿ0-9._-]+/[A-Za-zÀ-ÿ0-9/.,-_]+)/?$', 'index.php?pagename='.$page_name.'&search_string=$matches[1]', 'top');
      }
  }

  // Auto-heal: if stored rewrite rules are missing the dynamic inventory rules, flush.
  // This fixes rules lost when other plugins update or WP flushes independently.
  $stored_rules = get_option('rewrite_rules', []);
  if (is_array($stored_rules) && !empty($stored_rules)) {
    $needs_flush = false;
    foreach ($pages as $page) {
      if (has_block('leadbox/inventory-block', $page)) {
        $page_name = get_page_uri($page->ID);
        $rule_key = $page_name . '/([A-Za-zÀ-ÿ0-9._-]+/[A-Za-zÀ-ÿ0-9/.,-_]+)/?$';
        if (!isset($stored_rules[$rule_key])) {
          $needs_flush = true;
          break;
        }
      }
    }
    if ($needs_flush) {
      flush_rewrite_rules();
    }
  }
}
add_action('init', 'rewrites');

add_action('template_redirect', function () {
  // Soporta tanto 'form' (inglés) como 'forme' (francés)
  $is_form_page = is_page('form');
  $is_forme_page = is_page('forme');

  if (!$is_form_page && !$is_forme_page) return;

  $form   = get_query_var('form_id') ?: (isset($_GET['form_id']) ? sanitize_title($_GET['form_id']) : '');
  $veh_id = get_query_var('vehicle_id') ?: (isset($_GET['vehicle_id']) ? intval($_GET['vehicle_id']) : 0);

  // Determinar la ruta base según el idioma de la página actual
  $base_path = $is_forme_page ? 'forme' : 'form';

  // Si viene con ?vehicle_id=… y aún no está en formato /{form|forme}/{form_id}/{vehicle_id}/, redirige
  if ($form && $veh_id) {
    $path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) ?: '';
    $pretty = "/{$base_path}/{$form}/{$veh_id}/";

    if ($path !== $pretty) {
      $target = home_url($pretty);

      if (trailingslashit($path) !== trailingslashit(parse_url($target, PHP_URL_PATH))) {
        wp_safe_redirect($target, 301);
        exit;
      }
    }
  }
}, 0);


function query_vars($query_vars)
{
  $query_vars[] = 'form_id';
  $query_vars[] = 'vehicle_id';
  $query_vars[] = 'vdp_string';
  $query_vars[] = 'vehicles';
  $query_vars[] = 'search_string';
  return $query_vars;
}
add_filter('query_vars', 'query_vars');

add_filter('ninja_forms_render_default_value', function ($default_value, $field_type, $field_settings) {
    if (isset($field_settings['key']) && ($field_settings['key'] === 'vehicleid' || $field_settings['key'] === 'vehicle_id')) {
        $veh = get_query_var('vehicle_id');
        if (!empty($veh)) {
            $veh = preg_replace('/\D+/', '', $veh);
            if ($veh !== '') {
                return $veh;
            }
        }
    }
    return $default_value;
}, 99, 3);

function leadbox_flush_rewrites_on_update($upgrader_object, $options) {
    if ($options['action'] == 'update' && $options['type'] == 'plugin') {
        if (!empty($options['plugins'])) {
            foreach ($options['plugins'] as $plugin) {
                // Verificar si es el plugin Leadbox (funciona con cualquier nombre de carpeta)
                if (strpos($plugin, 'Leadbox.php') !== false) {
                    rewrites();
                    flush_rewrite_rules();
                }
            }
        }
    }
}
add_action('upgrader_process_complete', 'leadbox_flush_rewrites_on_update', 10, 2);

function web_report_options_panel()
{
  add_menu_page('Theme page title', 'Web reports', 'manage_options', 'web-report-options', 'wps_theme_func');
}
add_action('admin_menu', 'web_report_options_panel');

function wps_theme_func()
{
  $web_report_options = get_option('leadbox-settings');
  echo '<div class="wrap"><div id="icon-options-general" class="icon32"><br></div>
  <h2>Web reports</h2></div>
  <iframe src="' . $web_report_options["report_url"] . '" style="width: 90%; height: 600px;"></iframe>';
}

function wordpress_custom_login_logo()
{
  echo '<style type="text/css">' .
    'h1 a {
        background-image:url(' . dirname(plugin_dir_url(__FILE__)) . '/assets/logo.png) !important;
        height: 100px !important;
        width: 100% !important;
        background-size:100% !important;
        line-height:inherit !important;
        }' .
    '</style>';
}

add_action('login_head', 'wordpress_custom_login_logo');

function custom_admin_logo()
{
  echo '
    <style type="text/css">
      #wp-admin-bar-wp-logo .ab-icon:before {
        content:"" !important;
      }
      #wpadminbar > #wp-toolbar > #wp-admin-bar-root-default > #wp-admin-bar-wp-logo .ab-icon {
        background-image: url(' . dirname(plugin_dir_url(__FILE__)) . '/assets/logo.png) !important;
        background-size: contain;
        background-repeat: no-repeat;
        width: 150px;
        height: 15px;
        padding: 4px 0;
        margin: 4px 0;
      }
    </style>
  ';
}

add_action('admin_head', 'custom_admin_logo');

function remove_simple_staff_member_widget(){
  echo '
  <style>
    .sslp-widget {
      display: none !important;
    }
  </style>
  ';
}

add_action('admin_head', 'remove_simple_staff_member_widget');

function unique($array) {
    if (!is_array($array)) {
      return [];
    }
    return array_values(array_unique($array));
}

function get_fileInGenius($route) {

  $childRoute = get_stylesheet_directory();
  $childRoute = str_replace("/resources","",$childRoute );
  //var_dump($childRoute);
  $parentRoute = get_template_directory();
  //var_dump($parentRoute);
  if(file_exists($childRoute . $route)) {
    return $childRoute;
  }
  return $parentRoute;
}


function set_genius()
{
  /**
  * This code is responsible for retrieving the 'genius' option from the 'leadbox-settings' and setting it as a constant.
  * TODO: I'll be back here later
  * Author: Leo
  */
  /* $geniusFromOptions = get_option('leadbox-settings')['genius'];
  if ($geniusFromOptions) {
    $valid_genius = stripslashes($geniusFromOptions);
    $final_genius = json_decode($valid_genius, true);
    define('GENIUS', $final_genius);
    return;
  } */

  $jsonPath = get_fileInGenius('/resources/config/genius.json');
  $genius = file_exists("{$jsonPath}/resources/config/genius.json")
    ? json_decode(file_get_contents( $jsonPath . '/resources/config/genius.json'), true)
    : [];

  define('GENIUS', $genius);
}

add_action('init', 'set_genius');

function get_used_finance_file() {
  $route = '/resources/config/used-finance.json';
  $jsonPath = get_fileInGenius($route);

  //var_dump( $jsonPath . $route);
  return json_decode(file_get_contents( $jsonPath . $route), true);
}

function get_new_finance_file() {
  $lbsettings = get_option('leadbox-settings');

  if (!isset($lbsettings['new_finance_lease_option']) || $lbsettings['new_finance_lease_option'] !== 'enabled')
    return null;

  $route = '/resources/config/new-finance.json';
  $potentialRoutes = [
      get_stylesheet_directory(),
      get_template_directory(),
  ];

  foreach ($potentialRoutes as $path) {
    $path = str_replace("/resources","",$path);
    $fullPath = $path . $route;
    if (file_exists($fullPath)) {
      return json_decode(file_get_contents($fullPath), true);
    }
  }

  return null;
}


Home - Capital GMC Buick Regina

No data

Welcome to Capital GMC BUICK – REGINA

Thank you for choosing Capital GMC Buick | Regina, your premier certified Buick and GMC dealership proudly serving drivers in Regina and the surrounding communities. Whether you’re searching for a brand-new Buick or GMC vehicle or a meticulously inspected pre-owned model, we have a diverse selection to match your needs and lifestyle.

Beyond our impressive inventory, we offer a seamless and stress-free financing experience through our well-connected finance centre, where our team of experts is dedicated to securing the best loan or lease options for you, quickly, transparently, and hassle-free.

But our commitment to you doesn’t stop at the sale. Our state-of-the-art service centre is staffed with skilled Buick and GMC technicians who use the latest equipment and genuine OEM parts to keep your vehicle running at its best. From routine maintenance to complex repairs, we’ve got you covered.

Experience top-tier customer service, quality vehicles, and expert care, all in one place. Visit Capital GMC Buick | Regina today or call us at 306-205-8072 with any questions. We’re here to help!

Ask a Question