public static function permalinks() { $var = ShoppPages::QUERYVAR; $pageslugs = ShoppPages()->slugs(); $catalog = $pageslugs['catalog']; unset($pageslugs['catalog']); add_rewrite_tag("%{$var}%", '(' . join('|', $pageslugs) . ')'); add_permastruct($var, "{$catalog}/%{$var}%", false); }
/** * Register a Shopp product taxonomy * * @api * @since 1.2 * * @param string $taxonomy The taxonomy name * @param array $args register_taxonomy arguments * @return void **/ function shopp_register_taxonomy($taxonomy, $args = array()) { $taxonomy = sanitize_key($taxonomy); $rewrite_slug = $taxonomy; $taxonomy = "shopp_{$taxonomy}"; if (isset($args['rewrite']) && isset($args['rewrite']['slug'])) { $rewrite_slug = $args['rewrite']['slug']; } if (!isset($args['rewrite'])) { $args['rewrite'] = array(); } $args['rewrite']['slug'] = SHOPP_NAMESPACE_TAXONOMIES ? ShoppPages()->baseslug() . '/' . $rewrite_slug : $rewrite_slug; register_taxonomy($taxonomy, ShoppProduct::$posttype, $args); }
public function prepare_items() { $this->id = 'pages'; $settings = ShoppPages()->settings(); $template = array('id' => '', 'title' => '', 'slug' => '', 'description' => ''); foreach ($settings as $name => $page) { $page['id'] = $name; $this->items[$name] = (object) array_merge($template, $page); } $per_page = 25; $total = count($this->items); $this->set_pagination_args(array('total_items' => $total, 'total_pages' => $total / $per_page, 'per_page' => $per_page)); shopp_custom_script('pageset', 'var pages = ' . json_encode($this->items) . ';'); }
/** * Manages CSS relationship classes applied to Shopp elements appearing in a WordPress navigation menu * * @author Jonathan Davis * @since 1.2 * * @param array $menuitems The provided WordPress menu items * @return array Updated menu items with proper relationship classes **/ public function menus($menuitems) { $is_shopp_page = is_shopp_page(); $keymap = array(); $parents = array(); foreach ($menuitems as $key => $item) { $page = false; // Remove the faulty wp_page_menu (deprecated) class for Shopp pages if ($is_shopp_page && in_array('current_page_parent', $item->classes)) { unset($item->classes[array_search('current_page_parent', $item->classes)]); } // Otherwise, skip dealing with any non-Shopp page if (ShoppPages::QUERYVAR == $item->type) { // Determine the queried Shopp page object name $Page = ShoppPages()->requested(); if ($Page && !is_shopp_collection()) { $page = $Page->name(); } // Set the catalog as current page parent if ('catalog' == $item->object && ($is_shopp_page || is_shopp_product())) { $item->classes[] = 'current-page-parent'; } $keymap[$item->db_id] = $key; } if ('shopp_collection' == $item->type) { $page = get_query_var($item->type); $keymap[$item->db_id] = $key; } if ($page == $item->object) { $item->classes[] = 'current-page-item'; $item->classes[] = 'current-menu-item'; $parents[] = $item->menu_item_parent; } } foreach ((array) $parents as $parentid) { if (!isset($keymap[$parentid])) { continue; } $parent = $menuitems[$keymap[$parentid]]; $parent->classes[] = 'current-menu-parent'; $parent->classes[] = 'current-page-parent'; $parent->classes[] = 'current-menu-ancestor'; $parent->classes[] = 'current-page-ancestor'; $ancestor = $parent; while (0 != $ancestor->menu_item_parent) { $ancestor = $menuitems[$keymap[$ancestor->menu_item_parent]]; $ancestor->classes[] = 'current-menu-ancestor'; $ancestor->classes[] = 'current-page-ancestor'; } } return $menuitems; }
/** * Adds Shopp-specific mod_rewrite rule for low-resource, speedy image server and downloads request handler * * @author Jonathan Davis * @since 1.0 * * @param array $wp_rewrite_rules An array of existing WordPress rewrite rules * @return array Rewrite rules **/ public function rewrites($wp_rewrite_rules) { global $is_IIS; $structure = get_option('permalink_structure'); if ('' == $structure) { return $wp_rewrite_rules; } $path = str_replace('%2F', '/', urlencode(join('/', array(PLUGINDIR, SHOPP_DIR, 'services')))); // Download URL rewrites $AccountPage = ShoppPages()->get('account'); if (empty($AccountPage)) { // Ensure a ShoppAccountPage is available #2862 ShoppPages()->register('ShoppAccountPage'); $AccountPage = ShoppPages()->get('account'); } $downloads = array(ShoppPages()->baseslug(), $AccountPage->slug(), 'download', '([a-f0-9]{40})', '?$'); if ($is_IIS && 0 === strpos($structure, '/index.php/')) { array_unshift($downloads, 'index.php'); } $rules = array(join('/', $downloads) => 'index.php?src=download&shopp_download=$matches[1]'); // Image URL rewrite $images = array(ShoppPages()->baseslug(), 'images', '(\\d+)', "?\\??(.*)\$"); add_rewrite_rule(join('/', $images), $path . '/image.php?siid=$1&$2'); return $rules + (array) $wp_rewrite_rules; }
/** * Determines if the requested page is a Shopp page or if it matches a given Shopp page * * Also checks to see if the current loaded query is a Shopp product or product taxonomy. * * @api * @since 1.0 * * @param string $page (optional) System page name ID for the correct ShoppStorefront page {@see ShoppPages class} * @param WP_Query $wp_query (optional) will use the global wp_query by default if false, or the provided WP_Query object * @return boolean **/ function is_shopp_page($page = false, $wp_query = false) { if (false === $wp_query) { global $wp_the_query; $wp_query = $wp_the_query; } if (empty($wp_query->query_vars)) { shopp_debug('Conditional is_shopp_page functions do not work before the WordPress query is run. Before then, they always return false.'); } $is_shopp_page = false; $Page = ShoppPages()->requested(); if (false === $page) { // Check if the current request is a shopp page request // Product and collection pages are considered a Shopp page request if (is_shopp_product($wp_query) || $wp_query->get('post_type') == ShoppProduct::$posttype) { $is_shopp_page = true; } if (is_shopp_collection($wp_query)) { $is_shopp_page = true; } if (false !== $Page) { $is_shopp_page = true; } } elseif (false !== $Page) { // Check if the given shopp page name is the current request if ($Page->name() == $page) { $is_shopp_page = true; } } return $is_shopp_page; }
public function pages() { if (!current_user_can('shopp_settings')) { wp_die(__('You do not have sufficient permissions to access this page.')); } if (!empty($_POST['save'])) { check_admin_referer('shopp-settings-pages'); $CatalogPage = ShoppPages()->get('catalog'); $catalog_slug = $CatalogPage->slug(); $defaults = ShoppPages()->settings(); $_POST['settings']['storefront_pages'] = array_merge($defaults, $_POST['settings']['storefront_pages']); shopp_set_formsettings(); // Re-register page, collection, taxonomies and product rewrites // so that the new slugs work immediately $Shopp = Shopp::object(); $Shopp->pages(); $Shopp->collections(); $Shopp->taxonomies(); $Shopp->products(); // If the catalog slug changes // $hardflush is false (soft flush... plenty of fiber, no .htaccess update needed) $hardflush = ShoppPages()->baseslug() != $catalog_slug; flush_rewrite_rules($hardflush); } $pages = ShoppPages()->settings(); include $this->ui('pages.php'); }
static function register($class) { global $ShoppTaxonomies; $namespace = get_class_property($class, 'namespace'); $taxonomy = get_class_property($class, 'taxon'); $hierarchical = get_class_property($class, 'hierarchical'); $slug = SHOPP_NAMESPACE_TAXONOMIES ? ShoppPages()->baseslug() . '/' . $namespace : $namespace; register_taxonomy($taxonomy, array(ShoppProduct::$posttype), apply_filters('shopp_register_taxonomy_' . $taxonomy, array('hierarchical' => $hierarchical, 'labels' => call_user_func(array($class, 'labels'), $class), 'show_ui' => true, 'query_var' => true, 'rewrite' => array('slug' => $slug, 'with_front' => false), 'update_count_callback' => array('ProductTaxonomy', 'recount'), 'capabilities' => array('manage_terms' => 'shopp_categories', 'edit_terms' => 'shopp_categories', 'delete_terms' => 'shopp_categories', 'assign_terms' => 'shopp_categories')))); add_filter($taxonomy . '_rewrite_rules', array('ProductCollection', 'pagerewrites')); $ShoppTaxonomies[$taxonomy] = $class; }
/** * Generates canonical storefront URLs that respects the WordPress permalink settings * * @author Jonathan Davis * @since 1.1 * @version 1.2 * * @param mixed $request Additional URI requests * @param string $page The gateway page * @param boolean $secure (optional) True for secure URLs, false to force unsecure URLs * @return string The final URL **/ public static function url($request = false, $page = 'catalog', $secure = null) { global $wp_rewrite; $prettyurls = $wp_rewrite->using_permalinks(); // Support IIS index.php/ prefixed permalinks if ($wp_rewrite->using_index_permalinks()) { $path[] = 'index.php'; } $path[] = ShoppPages()->baseslug(); // Build request path based on Storefront shopp_page requested if ('images' == $page) { $path[] = 'images'; if (!$prettyurls) { $request = array('siid' => $request); } } else { if (false !== $page) { $Page = ShoppPages()->get($page); if (method_exists($Page, 'slug')) { $page_slug = $Page->slug(); } } if ($page != 'catalog' && !empty($page_slug)) { $path[] = $page_slug; } } // Change the URL scheme as necessary $scheme = null; // Full-auto if ($secure === false) { $scheme = 'http'; } elseif (($secure || is_ssl()) && !SHOPP_NOSSL) { $scheme = 'https'; } // HTTPS required $url = home_url(false, $scheme); if ($prettyurls) { $url = home_url(join('/', $path), $scheme); } if (false !== strpos($url, '?')) { list($url, $query) = explode('?', $url); } $url = trailingslashit($url); if (!empty($query)) { parse_str($query, $home_queryvars); if (false === $request) { $request = array_merge($home_queryvars, array()); } else { $request = array($request); array_push($request, $home_queryvars); } } if (!$prettyurls) { $url = isset($page_slug) ? add_query_arg('shopp_page', $page_slug, $url) : $url; } // No extra request, return the complete URL if (!$request) { return apply_filters('shopp_url', $url); } // Filter URI request $uri = false; if (!is_array($request)) { $uri = urldecode($request); } if (is_array($request) && isset($request[0])) { $uri = array_shift($request); } if (!empty($uri)) { $uri = join('/', array_map('urlencode', explode('/', $uri))); } // sanitize $url .= $uri; if (false === strpos(basename($uri), '.')) { // Not an image URL $url = user_trailingslashit($url); } if (!empty($request) && is_array($request)) { $request = array_map('urldecode', $request); $request = array_map('urlencode', $request); $url = add_query_arg($request, $url); } return apply_filters('shopp_url', $url); }
/** * Modify the request for ShoppPages * * @since 1.4 * * @return void **/ protected function request() { global $nav_menu_selected_id; $request = $_POST; if (!isset($request['add-shopp-menu-item'])) { return; } if (!isset($request['menu-item'])) { return; } // $pages = ShoppStorefront::pages_settings(); $nav_menu_selected_id = isset($_POST['menu']) ? (int) $_POST['menu'] : 0; foreach ((array) $request['menu-item'] as $key => $item) { if (!isset($item['menu-item-shopp-page'])) { continue; } $requested = $item['menu-item-shopp-page']; $Page = ShoppPages()->get($requested); $menuitem =& $_REQUEST['menu-item'][$key]; $menuitem['menu-item-db-id'] = 0; $menuitem['menu-item-object-id'] = $requested; $menuitem['menu-item-object'] = $requested; $menuitem['menu-item-type'] = ShoppPages::QUERYVAR; $menuitem['menu-item-title'] = $Page->title(); } }
/** * Handle login redirects * * @author Jonathan Davis * @since 1.2 * * @return void **/ public function redirect() { $redirect = false; $secure = ShoppOrder()->security(); if (isset($_REQUEST['redirect']) && !empty($_REQUEST['redirect'])) { if (ShoppPages()->exists($_REQUEST['redirect'])) { $redirect = Shopp::url(false, $_REQUEST['redirect'], $secure); } else { $redirect = $_REQUEST['redirect']; } } if (!$redirect) { $redirect = apply_filters('shopp_login_redirect', Shopp::url(false, 'account', $secure)); } Shopp::safe_redirect($redirect); }
<div class="shopp-pages-menu-item taxonomydiv" id="shopp-pages-menu-item"> <div id="tabs-panel-shopp-pages" class="tabs-panel tabs-panel-active"> <ul class="categorychecklist form-no-clear"> <?php foreach (ShoppPages() as $name => $Page) { $navmenu_placeholder = 0 > $navmenu_placeholder ? $navmenu_placeholder - 1 : -1; ?> <li> <label class="menu-item-title"> <input type="checkbox" name="menu-item[<?php esc_html_e($navmenu_placeholder); ?> ][menu-item-shopp-page]" value="<?php esc_attr_e($Page->slug()); ?> " class="menu-item-checkbox" /> <?php echo esc_html($Page->title()); ?> </label> <input type="hidden" class="menu-item-db-id" name="menu-item[<?php esc_attr_e($navmenu_placeholder); ?> ][menu-item-db-id]" value="0" /> <input type="hidden" class="menu-item-object-id" name="menu-item[<?php esc_attr_e($navmenu_placeholder); ?> ][menu-item-object-id]" value="<?php esc_attr_e($name); ?>
public static function shoppage_meta_box() { global $_nav_menu_placeholder, $nav_menu_selected_id; $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce'); ?> <br /> <div class="shopp-pages-menu-item customlinkdiv" id="shopp-pages-menu-item"> <div id="tabs-panel-shopp-pages" class="tabs-panel tabs-panel-active"> <ul class="categorychecklist form-no-clear"> <?php foreach (ShoppPages() as $name => $Page) { $_nav_menu_placeholder = 0 > $_nav_menu_placeholder ? $_nav_menu_placeholder - 1 : -1; ?> <li> <label class="menu-item-title"> <input type="checkbox" name="menu-item[<?php esc_html_e($_nav_menu_placeholder); ?> ][menu-item-shopp-page]" value="<?php esc_attr_e($pagetype); ?> " class="menu-item-checkbox" /> <?php echo esc_html($Page->title()); ?> </label> <input type="hidden" class="menu-item-db-id" name="menu-item[<?php esc_attr_e($_nav_menu_placeholder); ?> ][menu-item-db-id]" value="0" /> <input type="hidden" class="menu-item-object-id" name="menu-item[<?php esc_attr_e($_nav_menu_placeholder); ?> ][menu-item-object-id]" value="<?php esc_attr_e($name); ?> " /> <input type="hidden" class="menu-item-object" name="menu-item[<?php esc_attr_e($_nav_menu_placeholder); ?> ][menu-item-object]" value="<?php esc_attr_e($name); ?> " /> <input type="hidden" class="menu-item-parent-id" name="menu-item[<?php esc_attr_e($_nav_menu_placeholder); ?> ][menu-item-parent-id]" value="0"> <input type="hidden" class="menu-item-type" name="menu-item[<?php esc_attr_e($_nav_menu_placeholder); ?> ][menu-item-type]" value="<?php esc_attr_e(ShoppPages::QUERYVAR); ?> " /> <input type="hidden" class="menu-item-title" name="menu-item[<?php esc_attr_e($_nav_menu_placeholder); ?> ][menu-item-title]" value="<?php esc_attr_e($Page->title()); ?> " /> </li> <?php } ?> </ul> </div> <p class="button-controls"> <span class="list-controls"> <a href="<?php echo esc_url(add_query_arg(array('shopp-pages-menu-item' => 'all', 'selectall' => 1), remove_query_arg($removed_args))); ?> #shopp-pages-menu-item" class="select-all"><?php _e('Select All'); ?> </a> </span> <span class="add-to-menu"> <span class="spinner"></span> <input type="submit"<?php disabled($nav_menu_selected_id, 0); ?> class="button-secondary submit-add-to-menu" value="<?php esc_attr_e('Add to Menu'); ?> " name="add-shopp-menu-item" id="submit-shopp-pages-menu-item" /> </span> </p> </div><!-- /.customlinkdiv --> <?php }