AlkantarClanX12
Your IP : 216.73.217.24
<?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
Skip to content
{{ $t(category) }}
Error
{{vehicle.modelData.year}} {{vehicle.modelData.make}} {{vehicle.modelData.model}}
Starting from {{vehicle.modelData.startingPrice | moneyFormat(lang)}}
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
Capital GMC Buick – Regina
Contact Us
Have a question or need assistance? Fill out the form and we will reach out to you as soon as possible.
Notice: JavaScript is required for this content.
CLOSE
Schedule a Visit
Let us know when you are coming and how we can assist you. We can ensure someone will be on hand to help you out at the desired date and time.
Notice: JavaScript is required for this content.
CLOSE
Find a Career
Have a look at our list of available positions and apply online today to join our team!
×
Opportunities to Grow
The auto industry is constantly changing and we want to continue to grow. We offer growth, leadership & mentorship programs to allow our staff to grow with us.
×
Competitive Salary
We have a significant earning potential with incentive-based pay in most roles. We also offer an employee referral bonus with paid bonuses.
×
Health & Dental
We offer a comprehensive benefits package including extended health, dental, and vision care. We also include paramedical, life insurance, paid sick leave, short & long-term disability coverages.
×
Vacation
We value our employees and want everyone to take their vacation time. We offer a minimum of 2 weeks vacation each year.
×
Training & Development
We have many opportunities for paid education and training in-house as well as training from the Manufacturer.
×
$10,000 Cash Giveaway – Terms & Conditions
All October long, stop by Capital GMC Buick Cadillac, to enter for your chance to win $10,000 cash. No purchase is required, but entries must be made in-store.
The contest is open to residents of Saskatchewan who are 18+. Dealership employees and their households are not eligible. Entries will be accepted from October 1 to October 31, 2025. A random draw will take place on November 1, 2025.
The prize is one $10,000 award, paid by cheque, and must be accepted as awarded. Winner will be contacted by phone or email and must respond within 7 days or another entry may be drawn. Odds of winning depend on the number of entries received.By entering, you agree that Capital Automotive Group may use your name and photo for winner announcements. The contest is governed by the laws of Saskatchewan.
Notice: JavaScript is required for this content.
CLOSE