├── .editorconfig ├── .gitignore ├── .jscsrc ├── .jshintignore ├── .travis.yml ├── 404.php ├── CHANGELOG.md ├── LICENSE.md ├── README.md ├── archive.php ├── author.php ├── codesniffer.ruleset.xml ├── comments.php ├── composer.json ├── composer.lock ├── css ├── custom-editor-style.css ├── fontawesome.css ├── fontawesome.min.css ├── fontawesome.min.css.map ├── theme.css ├── theme.min.css └── theme.min.css.map ├── footer-blank.php ├── footer.php ├── functions.php ├── gulpconfig.json ├── gulpfile.js ├── header-blank.php ├── header.php ├── inc ├── bootstrap-wp-navwalker.php ├── cleanup.php ├── custom-comments.php ├── custom-cpt.php ├── custom-header.php ├── customizer.php ├── editor.php ├── enqueue.php ├── extras.php ├── hooks.php ├── jetpack.php ├── load-more.php ├── pagination.php ├── setup.php ├── style-wpcom.css ├── template-tags.php ├── theme-settings.php ├── theme-wrapper.php ├── widgets.php ├── woocommerce.php └── wpcom.php ├── index.php ├── js ├── customizer.js ├── theme.js └── theme.min.js ├── languages ├── de_DE.mo ├── de_DE.po ├── de_DE_formal.mo ├── de_DE_formal.po ├── el_GR.mo ├── el_GR.po ├── es_ES.mo ├── es_ES.po ├── fr_FR.mo ├── fr_FR.po ├── he_IL.mo ├── he_IL.po ├── it_IT.mo ├── it_IT.po ├── ja_JP.mo ├── ja_JP.po ├── ko_KR.mo ├── ko_KR.po ├── nb_NO.mo ├── nb_NO.po ├── nl_NL.mo ├── nl_NL.po ├── nn_NO.mo ├── nn_NO.po ├── pl_PL.mo ├── pl_PL.po ├── pt_BR.mo ├── pt_BR.po ├── pt_PT.mo ├── pt_PT.po ├── ru_RU.mo ├── ru_RU.po ├── sl_SI.mo ├── sl_SI.po ├── spurs.pot ├── sv_SE.mo ├── sv_SE.po ├── tr_TR.mo └── tr_TR.po ├── package-lock.json ├── package.json ├── page-templates ├── blank.php ├── both-sidebars.php ├── full-width-slim.php ├── full-width.php ├── sidebar-left.php └── sidebar-right.php ├── page.php ├── phpcs.xml ├── readme.txt ├── sass ├── custom-editor-style.scss ├── spurs │ ├── full-width.scss │ ├── spurs.scss │ └── woocommerce.scss ├── theme.scss ├── theme │ ├── _contact-form7.scss │ ├── _theme.scss │ └── _variables.scss └── vendors │ ├── bootstrap4 │ ├── _alert.scss │ ├── _badge.scss │ ├── _breadcrumb.scss │ ├── _button-group.scss │ ├── _buttons.scss │ ├── _card.scss │ ├── _carousel.scss │ ├── _close.scss │ ├── _code.scss │ ├── _custom-forms.scss │ ├── _dropdown.scss │ ├── _forms.scss │ ├── _functions.scss │ ├── _grid.scss │ ├── _images.scss │ ├── _input-group.scss │ ├── _jumbotron.scss │ ├── _list-group.scss │ ├── _media.scss │ ├── _mixins.scss │ ├── _modal.scss │ ├── _nav.scss │ ├── _navbar.scss │ ├── _pagination.scss │ ├── _popover.scss │ ├── _print.scss │ ├── _progress.scss │ ├── _reboot.scss │ ├── _root.scss │ ├── _spinners.scss │ ├── _tables.scss │ ├── _toasts.scss │ ├── _tooltip.scss │ ├── _transitions.scss │ ├── _type.scss │ ├── _utilities.scss │ ├── _variables.scss │ ├── bootstrap-grid.scss │ ├── bootstrap-reboot.scss │ ├── bootstrap.bundle.js │ ├── bootstrap.bundle.min.js │ ├── bootstrap.js │ ├── bootstrap.min.js │ ├── bootstrap.scss │ ├── mixins │ │ ├── _alert.scss │ │ ├── _background-variant.scss │ │ ├── _badge.scss │ │ ├── _border-radius.scss │ │ ├── _box-shadow.scss │ │ ├── _breakpoints.scss │ │ ├── _buttons.scss │ │ ├── _caret.scss │ │ ├── _clearfix.scss │ │ ├── _deprecate.scss │ │ ├── _float.scss │ │ ├── _forms.scss │ │ ├── _gradients.scss │ │ ├── _grid-framework.scss │ │ ├── _grid.scss │ │ ├── _hover.scss │ │ ├── _image.scss │ │ ├── _list-group.scss │ │ ├── _lists.scss │ │ ├── _nav-divider.scss │ │ ├── _pagination.scss │ │ ├── _reset-text.scss │ │ ├── _resize.scss │ │ ├── _screen-reader.scss │ │ ├── _size.scss │ │ ├── _table-row.scss │ │ ├── _text-emphasis.scss │ │ ├── _text-hide.scss │ │ ├── _text-truncate.scss │ │ ├── _transition.scss │ │ └── _visibility.scss │ └── utilities │ │ ├── _align.scss │ │ ├── _background.scss │ │ ├── _borders.scss │ │ ├── _clearfix.scss │ │ ├── _display.scss │ │ ├── _embed.scss │ │ ├── _flex.scss │ │ ├── _float.scss │ │ ├── _interactions.scss │ │ ├── _overflow.scss │ │ ├── _position.scss │ │ ├── _screenreaders.scss │ │ ├── _shadows.scss │ │ ├── _sizing.scss │ │ ├── _spacing.scss │ │ ├── _stretched-link.scss │ │ ├── _text.scss │ │ └── _visibility.scss │ ├── fontawesome │ ├── _animated.scss │ ├── _bordered-pulled.scss │ ├── _core.scss │ ├── _fixed-width.scss │ ├── _icons.scss │ ├── _larger.scss │ ├── _list.scss │ ├── _mixins.scss │ ├── _rotated-flipped.scss │ ├── _screen-reader.scss │ ├── _shims.scss │ ├── _stacked.scss │ ├── _variables.scss │ ├── brands.scss │ ├── duotone.scss │ ├── fontawesome.scss │ ├── light.scss │ ├── regular.scss │ ├── solid.scss │ └── v4-shims.scss │ └── underscores │ ├── _captions.scss │ ├── _galleries.scss │ └── _media.scss ├── screenshot.png ├── search.php ├── searchform.php ├── single.php ├── src └── js │ ├── bootstrap4 │ ├── bootstrap.bundle.js │ ├── bootstrap.bundle.min.js │ ├── bootstrap.js │ └── bootstrap.min.js │ ├── loadmore.js │ └── skip-link-focus-fix.js ├── style.css ├── templates ├── global │ └── hero.php ├── loop │ ├── content-blank.php │ ├── content-none.php │ ├── content-page.php │ ├── content-search.php │ ├── content-single.php │ └── content.php └── sidebar │ ├── footer-full.php │ ├── hero-canvas.php │ ├── hero-static.php │ ├── hero.php │ ├── sidebar-left.php │ └── sidebar-right.php ├── webfonts ├── fa-brands-400.eot ├── fa-brands-400.svg ├── fa-brands-400.ttf ├── fa-brands-400.woff ├── fa-brands-400.woff2 ├── fa-duotone-900.eot ├── fa-duotone-900.svg ├── fa-duotone-900.ttf ├── fa-duotone-900.woff ├── fa-duotone-900.woff2 ├── fa-light-300.eot ├── fa-light-300.svg ├── fa-light-300.ttf ├── fa-light-300.woff ├── fa-light-300.woff2 ├── fa-regular-400.eot ├── fa-regular-400.svg ├── fa-regular-400.ttf ├── fa-regular-400.woff ├── fa-regular-400.woff2 ├── fa-solid-900.eot ├── fa-solid-900.svg ├── fa-solid-900.ttf ├── fa-solid-900.woff └── fa-solid-900.woff2 ├── woocommerce.php ├── woocommerce ├── cart │ ├── cart-empty.php │ ├── cart.php │ ├── mini-cart.php │ └── proceed-to-checkout-button.php ├── checkout │ ├── form-checkout.php │ ├── form-coupon.php │ ├── form-pay.php │ └── payment.php ├── global │ ├── form-login.php │ └── quantity-input.php ├── loop │ ├── add-to-cart.php │ └── orderby.php ├── myaccount │ ├── downloads.php │ ├── form-edit-account.php │ ├── form-edit-address.php │ ├── form-login.php │ ├── form-lost-password.php │ ├── form-reset-password.php │ ├── my-address.php │ ├── navigation.php │ └── orders.php ├── product-searchform.php └── single-product │ ├── add-to-cart │ ├── simple.php │ └── variation-add-to-cart-button.php │ └── product-thumbnails.php ├── wrapper-blank.php └── wrapper.php /.editorconfig: -------------------------------------------------------------------------------- 1 | # This file is for unifying the coding style for different editors and IDEs 2 | # editorconfig.org 3 | 4 | # WordPress Coding Standards 5 | # https://make.wordpress.org/core/handbook/coding-standards/ 6 | 7 | root = true 8 | 9 | [*] 10 | charset = utf-8 11 | end_of_line = lf 12 | insert_final_newline = true 13 | trim_trailing_whitespace = true 14 | indent_style = tab 15 | 16 | [{package.json,*.yml}] 17 | indent_style = space 18 | indent_size = 2 19 | 20 | [{*.txt,wp-config-sample.php}] 21 | end_of_line = crlf 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # ----------------------------------------------------------------- 2 | # .gitignore for WordPress ver 20161009 3 | # ----------------------------------------------------------------- 4 | # 5 | # This file: 6 | # • is for WordPress sites using the default file/folder structure, 7 | # • specifies which files are tracked/untracked by git. 8 | # 9 | # .gitignore docs: 10 | # https://git-scm.com/docs/gitignore 11 | # 12 | # To ignore uncommitted changes in a tracked file, 13 | # use `git update-index --assume-unchanged`. 14 | # 15 | # To stop tracking a file, 16 | # use `git rm --cached` 17 | # 18 | # Forked from Bare Minimum Git: 19 | # https://ironcodestudio.com/bare-minimum-git/ 20 | # 21 | # Change Log: 22 | # 20161009 Cosmetic and docs changes 23 | # 20160927 Initial fork from Bare Minimum Git repo 24 | # 25 | # ----------------------------------------------------------------- 26 | 27 | 28 | # ignore all files starting with . 29 | .* 30 | 31 | # track this file .gitignore (i.e. do NOT ignore it) 32 | !.gitignore 33 | !.jscsrc 34 | !.jshintignore 35 | !.travis.yml 36 | 37 | # track .editorconfig file (i.e. do NOT ignore it) 38 | !.editorconfig 39 | 40 | # track readme.md in the root (i.e. do NOT ignore it) 41 | !readme.md 42 | 43 | # ignore all files that start with ~ 44 | ~* 45 | 46 | # ignore OS generated files 47 | ehthumbs.db 48 | Thumbs.db 49 | .DS_Store 50 | 51 | # ignore Editor files 52 | *.sublime-project 53 | *.sublime-workspace 54 | *.komodoproject 55 | *.idea 56 | 57 | # ignore log files and databases 58 | *.log 59 | *.sql 60 | *.sqlite 61 | error_log 62 | php_errorlog 63 | 64 | # ignore compiled files 65 | *.com 66 | *.class 67 | *.dll 68 | *.exe 69 | *.o 70 | *.so 71 | 72 | # ignore packaged files 73 | *.7z 74 | *.dmg 75 | *.gz 76 | *.iso 77 | *.jar 78 | *.rar 79 | *.tar 80 | *.zip 81 | *.swp 82 | 83 | # ignore node/grunt dependency directories 84 | bower_components/ 85 | node_modules/ 86 | vendor/ 87 | .sass-cache 88 | dist 89 | dist-product 90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /.jscsrc: -------------------------------------------------------------------------------- 1 | { 2 | "preset": "wordpress", 3 | "fileExtensions": [ ".js" ], 4 | "excludeFiles": [ 5 | "js/**.min.js", 6 | "js/**.min.js", 7 | "src/**/*.js", 8 | "js/core.js", 9 | "js/popper.js", 10 | "js/theme.js", 11 | "gulpfile.js" 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /.jshintignore: -------------------------------------------------------------------------------- 1 | js/**.min.js 2 | src/**/*.js 3 | js/core.js 4 | js/popper.js 5 | js/theme.js 6 | gulpfile.js 7 | -------------------------------------------------------------------------------- /404.php: -------------------------------------------------------------------------------- 1 | 11 | 12 |
13 | 14 | 17 | 18 |
19 |

20 | 21 | 22 | 23 |
24 |

25 |
    26 | 'count', 29 | 'order' => 'DESC', 30 | 'show_count' => 1, 31 | 'title_li' => '', 32 | 'number' => 10, 33 | ) ); 34 | ?> 35 |
36 |
37 | 38 | 39 | ' . sprintf( esc_html__( 'Try looking in the monthly archives. %1$s', 'spurs' ), convert_smilies( ':)' ) ) . '

'; 42 | the_widget( 'WP_Widget_Archives', 'dropdown=1', "after_title=$archive_content" ); 43 | the_widget( 'WP_Widget_Tag_Cloud' ); 44 | ?> 45 |
46 | 47 |
48 | -------------------------------------------------------------------------------- /archive.php: -------------------------------------------------------------------------------- 1 | 13 | 14 | 20 | 21 | 12 | 13 | 46 | 47 |
48 | 71 |
72 | 73 | -------------------------------------------------------------------------------- /codesniffer.ruleset.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | A custom set of code standard rules to check for WordPress themes. 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 0 27 | 28 | 29 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sewmyheadon/spurs", 3 | "description": "Combines Understrap, Underscores, and Bootstrap 4, with helpful build tools", 4 | "type": "wordpress-theme", 5 | "license": "GPL-2.0", 6 | "minimum-stability": "stable", 7 | "keywords": [ 8 | "wordpress", 9 | "theme", 10 | "bootstrap", 11 | "underscores", 12 | "understrap" 13 | ], 14 | "homepage": "https://github.com/sewmyheadon/spurs", 15 | "require": { 16 | "composer/installers": "^1.7" 17 | }, 18 | "require-dev": { 19 | "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", 20 | "wp-coding-standards/wpcs": "^2.2.0", 21 | "phpcompatibility/php-compatibility": "^9.3.4" 22 | }, 23 | "scripts": { 24 | "test": [ 25 | "vendor/bin/phpcs" 26 | ], 27 | "fix": [ 28 | "vendor/bin/phpcbf" 29 | ] 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /css/custom-editor-style.css: -------------------------------------------------------------------------------- 1 | 2 | /*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJjdXN0b20tZWRpdG9yLXN0eWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbXX0= */ 3 | -------------------------------------------------------------------------------- /footer-blank.php: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /footer.php: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /functions.php: -------------------------------------------------------------------------------- 1 | section and everything up till
6 | * 7 | * @package spurs 8 | */ 9 | 10 | ?> 11 | 12 | > 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 22 | 23 | 24 | 25 | 26 | > 27 | 28 |
29 | 30 |
-------------------------------------------------------------------------------- /header.php: -------------------------------------------------------------------------------- 1 | section and everything up till
6 | * 7 | * @package spurs 8 | */ 9 | 10 | // Exit if accessed directly. 11 | defined( 'ABSPATH' ) || exit; 12 | 13 | $container = get_theme_mod( 'spurs_container_type' ); 14 | $sidebar_position = get_theme_mod( 'spurs_sidebar_position' ); 15 | ?> 16 | 17 | > 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | > 26 | 27 |
28 | 29 |
30 | 31 | 33 | 34 | 75 |
76 | 77 |
78 | -------------------------------------------------------------------------------- /inc/cleanup.php: -------------------------------------------------------------------------------- 1 | /mi', '', $o ); 30 | } 31 | ); 32 | } ); 33 | add_action( 'wp_head', function () { 34 | ob_end_flush(); 35 | }, 999 ); 36 | } 37 | 38 | /** 39 | * Remove Yoast SEO HTML comments 40 | * @link //gist.github.com/llgruff/a7ab776167aa0ed307ec445df54e5fdb 41 | * @link //gist.github.com/paulcollett/4c81c4f6eb85334ba076 42 | */ 43 | if ( defined( 'WPSEO_VERSION' ) ) { 44 | add_action( 'get_header', function () { 45 | ob_start( 46 | function ( $o ) { 47 | return preg_replace( '/^$/mi', '', $o ); 48 | } 49 | ); 50 | } ); 51 | add_action( 'wp_head', function () { 52 | ob_end_flush(); 53 | }, 999 ); 54 | } 55 | 56 | /** 57 | * Remove Google Analytics by MonsterInsights HTML comments 58 | * @link https://wordpress.org/plugins/remove-google-analytics-comments/ 59 | */ 60 | function isgabmi_active( $plugin ) { 61 | $network_active = false; 62 | if ( is_multisite() ) { 63 | $plugins = get_site_option( 'active_sitewide_plugins' ); 64 | if ( isset( $plugins[ $plugin ] ) ) { 65 | $network_active = true; 66 | } 67 | } 68 | 69 | return in_array( $plugin, get_option( 'active_plugins' ) ) || $network_active; 70 | } 71 | 72 | if ( isgabmi_active( 'google-analytics-for-wordpress/googleanalytics.php' ) || isgabmi_active( 'google-analytics-premium/googleanalytics.php' ) ) { 73 | add_action( 'get_header', function () { 74 | ob_start( function ( $o ) { 75 | return preg_replace( '/\n?<.*?monsterinsights.*?>/mi', '', $o ); 76 | } ); 77 | } ); 78 | add_action( 'wp_head', function () { 79 | ob_end_flush(); 80 | }, 999 ); 81 | } 82 | 83 | -------------------------------------------------------------------------------- /inc/custom-cpt.php: -------------------------------------------------------------------------------- 1 | [ 10 | 'name' => $names['uc_plural'], 11 | 'all_items' => $names['uc_plural'], 12 | 'add_new' => 'Add New ' . $names['uc_single'], 13 | 'add_new_item' => 'Add New ' . $names['uc_single'], 14 | 'menu_name' => $names['uc_plural'], 15 | 'singular_name' => $names['uc_single'], 16 | 'edit_item' => 'Edit ' . $names['uc_single'], 17 | 'new_item' => 'New ' . $names['uc_single'], 18 | 'view_item' => 'View ' . $names['uc_single'], 19 | 'items_archive' => $names['uc_plural'], 20 | 'search_items' => 'Search ' . $names['uc_plural'], 21 | 'not_found' => 'None found', 22 | 'not_found_in_trash' => 'None found in trash', 23 | ], 24 | 'public' => true, 25 | 'query_var' => true, 26 | 'rewrite' => array( 'slug' => $names['single'], 'with_front' => false ), 27 | 'menu_icon' => 'dashicons-'.$icon, 28 | 'has_archive' => true, 29 | 'can_export' => true, 30 | 'supports' => [ 'title', 'editor', 'thumbnail', 'excerpt' ], 31 | ]; 32 | 33 | register_post_type( $post_type, $args ); 34 | } 35 | 36 | public function register_taxonomy( $taxonomy, $post_type, $names, $hierarchical ) { 37 | $labels = array( 38 | 'name' => _x( $names['uc_plural'], 'Categories', 'spurs' ), 39 | 'singular_name' => _x( $names['uc_singular'], 'Category', 'spurs' ), 40 | 'search_items' => __( 'Search ' . $names['uc_plural'], 'spurs' ), 41 | 'popular_items' => __( 'Popular ' . $names['uc_plural'], 'spurs' ), 42 | 'all_items' => __( 'All ' . $names['uc_plural'], 'spurs' ), 43 | 'parent_item' => null, 44 | 'parent_item_colon' => null, 45 | 'edit_item' => __( 'Edit ' . $names['uc_singular'], 'spurs' ), 46 | 'update_item' => __( 'Update ' . $names['uc_singular'], 'spurs' ), 47 | 'add_new_item' => __( 'Add New ' . $names['uc_singular'], 'spurs' ), 48 | 'new_item_name' => __( 'New ' . $names['uc_singular'] . ' Name', 'spurs' ), 49 | 'separate_items_with_commas' => __( 'Separate ' . $names['plural'] . ' with commas', 'spurs' ), 50 | 'add_or_remove_items' => __( 'Add or remove ' . $names['plural'], 'spurs' ), 51 | 'choose_from_most_used' => __( 'Choose from the most used ' . $names['plural'], 'spurs' ), 52 | 'not_found' => __( 'No ' . $names['plural'] . ' found.', 'spurs' ), 53 | 'menu_name' => __( $names['uc_plural'], 'spurs' ), 54 | ); 55 | 56 | $args = array( 57 | 'hierarchical' => $hierarchical, 58 | 'labels' => $labels, 59 | 'show_ui' => true, 60 | 'show_admin_column' => true, 61 | 'query_var' => true, 62 | 'rewrite' => array( 'slug' => $taxonomy ), 63 | ); 64 | 65 | register_taxonomy( $taxonomy, $post_type, $args ); 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /inc/custom-header.php: -------------------------------------------------------------------------------- 1 | get_parent_theme_file_uri( '/img/header.jpg' ), 38 | 'width' => 2000, 39 | 'height' => 1200, 40 | 'flex-height' => true, 41 | ) 42 | ) 43 | ); 44 | 45 | register_default_headers( array( 46 | 'default-image' => array( 47 | 'url' => '%s/img/header.jpg', 48 | 'thumbnail_url' => '%s/img/header.jpg', 49 | 'description' => __( 'Default Header Image', 'spurs' ), 50 | ), 51 | ) 52 | ); 53 | } 54 | } 55 | 56 | -------------------------------------------------------------------------------- /inc/editor.php: -------------------------------------------------------------------------------- 1 | 'Lead Paragraph', 43 | 'selector' => 'p', 44 | 'classes' => 'lead', 45 | 'wrapper' => true, 46 | ), 47 | array( 48 | 'title' => 'Small', 49 | 'inline' => 'small', 50 | ), 51 | array( 52 | 'title' => 'Blockquote', 53 | 'block' => 'blockquote', 54 | 'classes' => 'blockquote', 55 | 'wrapper' => true, 56 | ), 57 | array( 58 | 'title' => 'Blockquote Footer', 59 | 'block' => 'footer', 60 | 'classes' => 'blockquote-footer', 61 | 'wrapper' => true, 62 | ), 63 | array( 64 | 'title' => 'Cite', 65 | 'inline' => 'cite', 66 | ), 67 | ); 68 | 69 | if ( isset( $settings['style_formats'] ) ) { 70 | $orig_style_formats = json_decode( $settings['style_formats'], true ); 71 | $style_formats = array_merge( $orig_style_formats, $style_formats ); 72 | } 73 | 74 | $settings['style_formats'] = json_encode( $style_formats ); 75 | 76 | return $settings; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /inc/enqueue.php: -------------------------------------------------------------------------------- 1 | get( 'Version' ); 19 | 20 | $css_version = $theme_version . '.' . filemtime( get_template_directory() . '/css/theme.min.css' ); 21 | wp_enqueue_style( 'spurs-styles', get_stylesheet_directory_uri() . '/css/theme.min.css', array(), $css_version ); 22 | 23 | wp_enqueue_script( 'jquery' ); 24 | 25 | //wp_enqueue_script('google.maps.api', 'https://maps.googleapis.com/maps/api/js?key=AIzaSyBzGRoIbHnQqqYWxOYuTpE58WYGx6RkAjo&v=3.exp', null, null, true); 26 | 27 | $js_version = $theme_version . '.' . filemtime( get_template_directory() . '/js/theme.min.js' ); 28 | wp_enqueue_script( 'spurs-scripts', get_template_directory_uri() . '/js/theme.min.js', array(), $js_version, true ); 29 | if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) { 30 | wp_enqueue_script( 'comment-reply' ); 31 | } 32 | } 33 | } // endif function_exists( 'spurs_scripts' ). 34 | 35 | add_action( 'wp_enqueue_scripts', 'spurs_scripts' ); 36 | 37 | add_action('admin_head', 'spurs_admin_inline_styles'); 38 | function spurs_admin_inline_styles() { 39 | echo ''; 43 | } 44 | -------------------------------------------------------------------------------- /inc/hooks.php: -------------------------------------------------------------------------------- 1 | %2$s | %3$s(%4$s)', 31 | esc_url( __( 'http://wordpress.org/', 'spurs' ) ), 32 | sprintf( 33 | /* translators:*/ 34 | esc_html__( 'Proudly powered by %s', 'spurs' ), 'WordPress' 35 | ), 36 | sprintf( // WPCS: XSS ok. 37 | /* translators:*/ 38 | esc_html__( 'Theme: %1$s by %2$s.', 'spurs' ), $the_theme->get( 'Name' ), 'ivycat' 39 | ), 40 | sprintf( // WPCS: XSS ok. 41 | /* translators:*/ 42 | esc_html__( 'Version: %1$s', 'spurs' ), $the_theme->get( 'Version' ) 43 | ) 44 | ); 45 | 46 | echo apply_filters( 'spurs_site_info_content', $site_info ); // WPCS: XSS ok. 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /inc/jetpack.php: -------------------------------------------------------------------------------- 1 | 'main', 27 | 'render' => 'components_infinite_scroll_render', 28 | 'footer' => 'page', 29 | ) ); 30 | 31 | // Add theme support for Responsive Videos. 32 | add_theme_support( 'jetpack-responsive-videos' ); 33 | 34 | // Add theme support for Social Menus 35 | add_theme_support( 'jetpack-social-menu' ); 36 | 37 | } 38 | } 39 | 40 | /** 41 | * Custom render function for Infinite Scroll. 42 | */ 43 | if ( ! function_exists( 'spurs_components_infinite_scroll_render' ) ) { 44 | function spurs_components_infinite_scroll_render() { 45 | while ( have_posts() ) { 46 | the_post(); 47 | if ( is_search() ) { 48 | get_template_part( 'templates/loop/content', 'search' ); 49 | } else { 50 | get_template_part( 'templates/loop/content', get_post_format() ); 51 | } 52 | } 53 | } 54 | } 55 | 56 | if ( ! function_exists( 'spurs_components_social_menu' ) ) { 57 | function spurs_components_social_menu() { 58 | if ( ! function_exists( 'jetpack_social_menu' ) ) { 59 | return; 60 | } else { 61 | jetpack_social_menu(); 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /inc/load-more.php: -------------------------------------------------------------------------------- 1 | max_num_pages > 1 ) 18 | echo '
More posts
'; // you can use as well 19 | } 20 | } 21 | 22 | function jd_my_load_more_scripts() { 23 | 24 | global $wp_query; 25 | 26 | // In most cases it is already included on the page and this line can be removed 27 | wp_enqueue_script('jquery'); 28 | 29 | // register our main script but do not enqueue it yet 30 | //wp_register_script( 'my_loadmore', get_stylesheet_directory_uri() . '/js/myloadmore.js', array('jquery') ); 31 | 32 | // now the most interesting part 33 | // we have to pass parameters to myloadmore.js script but we can get the parameters values only in PHP 34 | // you can define variables directly in your HTML but I decided that the most proper way is wp_localize_script() 35 | wp_localize_script( 'spurs-scripts', 'spurs_loadmore_params', array( 36 | 'ajaxurl' => site_url() . '/wp-admin/admin-ajax.php', // WordPress AJAX 37 | 'posts' => json_encode( $wp_query->query_vars ), // everything about your loop is here 38 | 'current_page' => get_query_var( 'paged' ) ? get_query_var('paged') : 1, 39 | 'max_page' => $wp_query->max_num_pages 40 | ) ); 41 | 42 | wp_enqueue_script( 'my_loadmore' ); 43 | } 44 | add_action( 'wp_enqueue_scripts', 'jd_my_load_more_scripts' ); 45 | 46 | function spurs_loadmore_ajax_handler(){ 47 | 48 | // prepare our arguments for the query 49 | $args = json_decode( stripslashes( $_POST['query'] ), true ); 50 | $args['paged'] = $_POST['page'] + 1; // we need next page to be loaded 51 | $args['post_status'] = 'publish'; 52 | $search_page = $_POST['search_page']; 53 | 54 | // it is always better to use WP_Query but not here 55 | query_posts( $args ); 56 | 57 | if( have_posts() ) : 58 | 59 | // run the loop 60 | while( have_posts() ): the_post(); 61 | 62 | // look into your theme code how the posts are inserted, but you can use your own HTML of course 63 | // do you remember? - my example is adapted for Twenty Seventeen theme 64 | if( true == $search_page ){ 65 | get_template_part( 'templates/loop/content', 'search' ); 66 | } else { 67 | get_template_part( 'templates/loop/content', get_post_format() ); 68 | } 69 | // for the test purposes comment the line above and uncomment the below one 70 | // the_title(); 71 | 72 | 73 | endwhile; 74 | 75 | endif; 76 | die; // here we exit the script and even no wp_reset_query() required! 77 | } 78 | add_action('wp_ajax_loadmore', 'spurs_loadmore_ajax_handler'); // wp_ajax_{action} 79 | add_action('wp_ajax_nopriv_loadmore', 'spurs_loadmore_ajax_handler'); // wp_ajax_nopriv_{action} -------------------------------------------------------------------------------- /inc/pagination.php: -------------------------------------------------------------------------------- 1 | max_num_pages <= 1 ) { 16 | return; 17 | } 18 | 19 | $args = wp_parse_args( $args, 20 | array( 21 | 'mid_size' => 2, 22 | 'prev_next' => true, 23 | 'prev_text' => __( '«', 'spurs' ), 24 | 'next_text' => __( '»', 'spurs' ), 25 | 'screen_reader_text' => __( 'Posts navigation', 'spurs' ), 26 | 'type' => 'array', 27 | 'current' => max( 1, get_query_var( 'paged' ) ), 28 | ) 29 | ); 30 | 31 | $links = paginate_links( $args ); 32 | 33 | ?> 34 | 35 | 52 | 53 | '', 28 | 'border' => '', 29 | 'text' => '', 30 | 'link' => '', 31 | 'url' => '', 32 | ); 33 | } 34 | 35 | /* Add WP.com print styles */ 36 | add_theme_support( 'print-styles' ); 37 | } 38 | } 39 | 40 | 41 | /* 42 | * WordPress.com-specific styles 43 | */ 44 | add_action( 'wp_enqueue_scripts', 'spurs_wpcom_styles' ); 45 | 46 | if ( ! function_exists( 'spurs_wpcom_styles' ) ) { 47 | function spurs_wpcom_styles() { 48 | wp_enqueue_style( 'spurs-wpcom', get_template_directory_uri() . '/inc/style-wpcom.css', array(), '20160411' ); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | =2.1.8" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "https://github.com/sewmyheadon/spurs.git" 15 | }, 16 | "keywords": [ 17 | "wordpress", 18 | "theme", 19 | "framework", 20 | "bootstrap", 21 | "underscores", 22 | "understrap" 23 | ], 24 | "author": "Eric Amundson", 25 | "license": "GPL-2.0", 26 | "bugs": { 27 | "url": "https://github.com/sewmyheadon/spurs/issues" 28 | }, 29 | "homepage": "https://github.com/sewmyheadon/spurs", 30 | "dependencies": { 31 | "@babel/preset-env": "^7.10.4", 32 | "@fortawesome/fontawesome-free": "^5.13.0", 33 | "bootstrap": "^4.5.0", 34 | "browser-sync": "^2.26.10", 35 | "del": "^4.1.1", 36 | "directory-exists": "^2.0.1", 37 | "gulp": "^4.0.2", 38 | "gulp-autoprefixer": "^6.1.0", 39 | "gulp-clean-css": "^4.3.0", 40 | "gulp-concat": "^2.6.1", 41 | "gulp-ignore": "^2.0.2", 42 | "gulp-imagemin": "^5.0.3", 43 | "gulp-plumber": "^1.2.1", 44 | "gulp-rename": "^1.4.0", 45 | "gulp-replace": "^1.0.0", 46 | "gulp-rimraf": "^1.0.0", 47 | "gulp-sass": "^4.1.0", 48 | "gulp-sequence": "^1.0.0", 49 | "gulp-sourcemaps": "^2.6.5", 50 | "gulp-uglify": "^3.0.2", 51 | "gulp-watch": "^5.0.1", 52 | "node-sass": "^4.14.1", 53 | "run-sequence": "^2.2.1", 54 | "undescores-for-npm": "^1.0.0" 55 | }, 56 | "devDependencies": { 57 | "@babel/core": "^7.10.5", 58 | "autoprefixer": "^9.8.5", 59 | "gulp-babel": "^8.0.0", 60 | "gulp-postcss": "^8.0.0", 61 | "gulp-webp": "^4.0.1" 62 | }, 63 | "optionalDependencies": { 64 | "@fortawesome/fontawesome-pro": "^5.13.0" 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /page-templates/blank.php: -------------------------------------------------------------------------------- 1 | `s. The `::before` pseudo-element generates an element 29 | // *within* the .breadcrumb-item and thereby inherits the `text-decoration`. 30 | // 31 | // To trick IE into suppressing the underline, we give the pseudo-element an 32 | // underline and then immediately remove it. 33 | + .breadcrumb-item:hover::before { 34 | text-decoration: underline; 35 | } 36 | // stylelint-disable-next-line no-duplicate-selectors 37 | + .breadcrumb-item:hover::before { 38 | text-decoration: none; 39 | } 40 | 41 | &.active { 42 | color: $breadcrumb-active-color; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /sass/vendors/bootstrap4/_close.scss: -------------------------------------------------------------------------------- 1 | .close { 2 | float: right; 3 | @include font-size($close-font-size); 4 | font-weight: $close-font-weight; 5 | line-height: 1; 6 | color: $close-color; 7 | text-shadow: $close-text-shadow; 8 | opacity: .5; 9 | 10 | // Override 's hover style 11 | @include hover() { 12 | color: $close-color; 13 | text-decoration: none; 14 | } 15 | 16 | &:not(:disabled):not(.disabled) { 17 | @include hover-focus() { 18 | opacity: .75; 19 | } 20 | } 21 | } 22 | 23 | // Additional properties for button version 24 | // iOS requires the button element instead of an anchor tag. 25 | // If you want the anchor version, it requires `href="#"`. 26 | // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile 27 | 28 | // stylelint-disable-next-line selector-no-qualifying-type 29 | button.close { 30 | padding: 0; 31 | background-color: transparent; 32 | border: 0; 33 | } 34 | 35 | // Future-proof disabling of clicks on `` elements 36 | 37 | // stylelint-disable-next-line selector-no-qualifying-type 38 | a.close.disabled { 39 | pointer-events: none; 40 | } 41 | -------------------------------------------------------------------------------- /sass/vendors/bootstrap4/_code.scss: -------------------------------------------------------------------------------- 1 | // Inline code 2 | code { 3 | @include font-size($code-font-size); 4 | color: $code-color; 5 | word-wrap: break-word; 6 | 7 | // Streamline the style when inside anchors to avoid broken underline and more 8 | a > & { 9 | color: inherit; 10 | } 11 | } 12 | 13 | // User input typically entered via keyboard 14 | kbd { 15 | padding: $kbd-padding-y $kbd-padding-x; 16 | @include font-size($kbd-font-size); 17 | color: $kbd-color; 18 | background-color: $kbd-bg; 19 | @include border-radius($border-radius-sm); 20 | @include box-shadow($kbd-box-shadow); 21 | 22 | kbd { 23 | padding: 0; 24 | @include font-size(100%); 25 | font-weight: $nested-kbd-font-weight; 26 | @include box-shadow(none); 27 | } 28 | } 29 | 30 | // Blocks of code 31 | pre { 32 | display: block; 33 | @include font-size($code-font-size); 34 | color: $pre-color; 35 | 36 | // Account for some code outputs that place code tags in pre tags 37 | code { 38 | @include font-size(inherit); 39 | color: inherit; 40 | word-break: normal; 41 | } 42 | } 43 | 44 | // Enable scrollable blocks of code 45 | .pre-scrollable { 46 | max-height: $pre-scrollable-max-height; 47 | overflow-y: scroll; 48 | } 49 | -------------------------------------------------------------------------------- /sass/vendors/bootstrap4/_grid.scss: -------------------------------------------------------------------------------- 1 | // Container widths 2 | // 3 | // Set the container width, and override it for fixed navbars in media queries. 4 | 5 | @if $enable-grid-classes { 6 | // Single container class with breakpoint max-widths 7 | .container, 8 | // 100% wide container at all breakpoints 9 | .container-fluid { 10 | @include make-container(); 11 | } 12 | 13 | // Responsive containers that are 100% wide until a breakpoint 14 | @each $breakpoint, $container-max-width in $container-max-widths { 15 | .container-#{$breakpoint} { 16 | @extend .container-fluid; 17 | } 18 | 19 | @include media-breakpoint-up($breakpoint, $grid-breakpoints) { 20 | %responsive-container-#{$breakpoint} { 21 | max-width: $container-max-width; 22 | } 23 | 24 | // Extend each breakpoint which is smaller or equal to the current breakpoint 25 | $extend-breakpoint: true; 26 | 27 | @each $name, $width in $grid-breakpoints { 28 | @if ($extend-breakpoint) { 29 | .container#{breakpoint-infix($name, $grid-breakpoints)} { 30 | @extend %responsive-container-#{$breakpoint}; 31 | } 32 | 33 | // Once the current breakpoint is reached, stop extending 34 | @if ($breakpoint == $name) { 35 | $extend-breakpoint: false; 36 | } 37 | } 38 | } 39 | } 40 | } 41 | } 42 | 43 | 44 | // Row 45 | // 46 | // Rows contain your columns. 47 | 48 | @if $enable-grid-classes { 49 | .row { 50 | @include make-row(); 51 | } 52 | 53 | // Remove the negative margin from default .row, then the horizontal padding 54 | // from all immediate children columns (to prevent runaway style inheritance). 55 | .no-gutters { 56 | margin-right: 0; 57 | margin-left: 0; 58 | 59 | > .col, 60 | > [class*="col-"] { 61 | padding-right: 0; 62 | padding-left: 0; 63 | } 64 | } 65 | } 66 | 67 | // Columns 68 | // 69 | // Common styles for small and large grid columns 70 | 71 | @if $enable-grid-classes { 72 | @include make-grid-columns(); 73 | } 74 | -------------------------------------------------------------------------------- /sass/vendors/bootstrap4/_images.scss: -------------------------------------------------------------------------------- 1 | // Responsive images (ensure images don't scale beyond their parents) 2 | // 3 | // This is purposefully opt-in via an explicit class rather than being the default for all ``s. 4 | // We previously tried the "images are responsive by default" approach in Bootstrap v2, 5 | // and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps) 6 | // which weren't expecting the images within themselves to be involuntarily resized. 7 | // See also https://github.com/twbs/bootstrap/issues/18178 8 | .img-fluid { 9 | @include img-fluid(); 10 | } 11 | 12 | 13 | // Image thumbnails 14 | .img-thumbnail { 15 | padding: $thumbnail-padding; 16 | background-color: $thumbnail-bg; 17 | border: $thumbnail-border-width solid $thumbnail-border-color; 18 | @include border-radius($thumbnail-border-radius); 19 | @include box-shadow($thumbnail-box-shadow); 20 | 21 | // Keep them at most 100% wide 22 | @include img-fluid(); 23 | } 24 | 25 | // 26 | // Figures 27 | // 28 | 29 | .figure { 30 | // Ensures the caption's text aligns with the image. 31 | display: inline-block; 32 | } 33 | 34 | .figure-img { 35 | margin-bottom: $spacer / 2; 36 | line-height: 1; 37 | } 38 | 39 | .figure-caption { 40 | @include font-size($figure-caption-font-size); 41 | color: $figure-caption-color; 42 | } 43 | -------------------------------------------------------------------------------- /sass/vendors/bootstrap4/_jumbotron.scss: -------------------------------------------------------------------------------- 1 | .jumbotron { 2 | padding: $jumbotron-padding ($jumbotron-padding / 2); 3 | margin-bottom: $jumbotron-padding; 4 | color: $jumbotron-color; 5 | background-color: $jumbotron-bg; 6 | @include border-radius($border-radius-lg); 7 | 8 | @include media-breakpoint-up(sm) { 9 | padding: ($jumbotron-padding * 2) $jumbotron-padding; 10 | } 11 | } 12 | 13 | .jumbotron-fluid { 14 | padding-right: 0; 15 | padding-left: 0; 16 | @include border-radius(0); 17 | } 18 | -------------------------------------------------------------------------------- /sass/vendors/bootstrap4/_media.scss: -------------------------------------------------------------------------------- 1 | .media { 2 | display: flex; 3 | align-items: flex-start; 4 | } 5 | 6 | .media-body { 7 | flex: 1; 8 | } 9 | -------------------------------------------------------------------------------- /sass/vendors/bootstrap4/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Toggles 2 | // 3 | // Used in conjunction with global variables to enable certain theme features. 4 | 5 | // Vendor 6 | @import "vendor/rfs"; 7 | 8 | // Deprecate 9 | @import "mixins/deprecate"; 10 | 11 | // Utilities 12 | @import "mixins/breakpoints"; 13 | @import "mixins/hover"; 14 | @import "mixins/image"; 15 | @import "mixins/badge"; 16 | @import "mixins/resize"; 17 | @import "mixins/screen-reader"; 18 | @import "mixins/size"; 19 | @import "mixins/reset-text"; 20 | @import "mixins/text-emphasis"; 21 | @import "mixins/text-hide"; 22 | @import "mixins/text-truncate"; 23 | @import "mixins/visibility"; 24 | 25 | // Components 26 | @import "mixins/alert"; 27 | @import "mixins/buttons"; 28 | @import "mixins/caret"; 29 | @import "mixins/pagination"; 30 | @import "mixins/lists"; 31 | @import "mixins/list-group"; 32 | @import "mixins/nav-divider"; 33 | @import "mixins/forms"; 34 | @import "mixins/table-row"; 35 | 36 | // Skins 37 | @import "mixins/background-variant"; 38 | @import "mixins/border-radius"; 39 | @import "mixins/box-shadow"; 40 | @import "mixins/gradients"; 41 | @import "mixins/transition"; 42 | 43 | // Layout 44 | @import "mixins/clearfix"; 45 | @import "mixins/grid-framework"; 46 | @import "mixins/grid"; 47 | @import "mixins/float"; 48 | -------------------------------------------------------------------------------- /sass/vendors/bootstrap4/_nav.scss: -------------------------------------------------------------------------------- 1 | // Base class 2 | // 3 | // Kickstart any navigation component with a set of style resets. Works with 4 | // `
', 25 | esc_url( $product->add_to_cart_url() ), 26 | esc_attr( isset( $args['quantity'] ) ? $args['quantity'] : 1 ), 27 | $product->is_purchasable() && $product->is_in_stock() ? 'add_to_cart_button' : '', 28 | esc_attr( $product->get_type() ), 29 | $product->get_type() == 'simple' ? 'ajax_add_to_cart' : '', 30 | isset( $args['attributes'] ) ? wc_implode_html_attributes( $args['attributes'] ) : '', 31 | esc_html( $product->add_to_cart_text() ) 32 | ), 33 | $product, $args ); 34 | -------------------------------------------------------------------------------- /woocommerce/loop/orderby.php: -------------------------------------------------------------------------------- 1 | 23 |
24 | 30 | 31 | 32 |
33 | -------------------------------------------------------------------------------- /woocommerce/myaccount/downloads.php: -------------------------------------------------------------------------------- 1 | customer->get_downloadable_products(); 26 | $has_downloads = ( bool ) $downloads; 27 | 28 | do_action( 'woocommerce_before_account_downloads', $has_downloads ); ?> 29 | 30 | 35 |
36 | 38 | 39 | 40 | 41 |
42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /woocommerce/myaccount/form-edit-address.php: -------------------------------------------------------------------------------- 1 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |

31 | 32 |
33 | 34 | 35 |
36 | $field ) { 38 | woocommerce_form_field( $key, $field, wc_get_post_data_by_key( $key, $field['value'] ) ); 39 | } 40 | ?> 41 |
42 | 43 | 44 | 45 |

46 | 48 | 49 | 50 |

51 |
52 | 53 |
54 | 55 | 56 | 57 | 22 | 23 |
24 | 25 |

26 | 27 |

28 | 29 | 31 |

32 | 33 |
34 | 35 | 36 | 37 |

38 | 39 | 41 |

42 | 43 | 44 | 45 |
46 | 22 | 23 |
24 | 25 |

26 | 27 |

28 | 30 | 32 |

33 |

34 | 36 | 38 |

39 | 40 | 41 | 42 | 43 |
44 | 45 | 46 | 47 |

48 | 49 | 51 |

52 | 53 | 54 | 55 |
56 | __( 'Billing address', 'spurs' ), 28 | 'shipping' => __( 'Shipping address', 'spurs' ), 29 | ), $customer_id ); 30 | } else { 31 | $get_addresses = apply_filters( 'woocommerce_my_account_get_addresses', array( 32 | 'billing' => __( 'Billing address', 'spurs' ), 33 | ), $customer_id ); 34 | } 35 | 36 | $oldcol = 1; 37 | $col = 1; 38 | ?> 39 | 40 |

41 | 42 |

43 | 44 | 45 |
46 | 47 | 48 | $title ) : ?> 49 | 50 |
51 |
52 |

53 | 55 |
56 |
60 |
61 | 62 | 63 | 64 | 65 |
66 | 25 | 33 | 24 | 39 | -------------------------------------------------------------------------------- /woocommerce/single-product/add-to-cart/simple.php: -------------------------------------------------------------------------------- 1 | is_purchasable() ) { 23 | return; 24 | } 25 | 26 | echo wc_get_stock_html( $product ); // WPCS: XSS ok. 27 | 28 | if ( $product->is_in_stock() ) : ?> 29 | 30 | 31 | 32 |
35 | 36 | 37 | apply_filters( 'woocommerce_quantity_input_min', $product->get_min_purchase_quantity(), $product ), 42 | 'max_value' => apply_filters( 'woocommerce_quantity_input_max', $product->get_max_purchase_quantity(), $product ), 43 | 'input_value' => isset( $_POST['quantity'] ) ? wc_stock_amount( wp_unslash( $_POST['quantity'] ) ) : $product->get_min_purchase_quantity(), 44 | // WPCS: CSRF ok, input var ok. 45 | ) ); 46 | 47 | do_action( 'woocommerce_after_add_to_cart_quantity' ); 48 | ?> 49 | 50 | 52 | 53 | 54 |
55 | 56 | 57 | 58 | 14 |
15 | 16 | 17 | apply_filters( 'woocommerce_quantity_input_min', $product->get_min_purchase_quantity(), $product ), 22 | 'max_value' => apply_filters( 'woocommerce_quantity_input_max', $product->get_max_purchase_quantity(), $product ), 23 | 'input_value' => isset( $_POST['quantity'] ) ? wc_stock_amount( wp_unslash( $_POST['quantity'] ) ) : $product->get_min_purchase_quantity(), 24 | // WPCS: CSRF ok, input var ok. 25 | ) ); 26 | 27 | do_action( 'woocommerce_after_add_to_cart_quantity' ); 28 | ?> 29 | 30 | 32 | 33 | 34 | 35 | 36 | 37 | 38 |
39 | -------------------------------------------------------------------------------- /woocommerce/single-product/product-thumbnails.php: -------------------------------------------------------------------------------- 1 | get_gallery_image_ids(); 28 | 29 | if ( $attachment_ids && $product->get_image_id() ) { 30 | foreach ( $attachment_ids as $attachment_id ) { 31 | echo apply_filters( 'woocommerce_single_product_image_thumbnail_html', wc_get_gallery_image_html( $attachment_id ), $attachment_id ); // phpcs:disable WordPress.XSS.EscapeOutput.OutputNotEscaped 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /wrapper-blank.php: -------------------------------------------------------------------------------- 1 | 17 | 18 |
19 | 20 |
21 | 22 | ', '
'); 20 | } 21 | 22 | ?> 23 | 24 |
25 | 26 |
'; 28 | } ?> 29 | 30 | 31 | 32 |
33 | 34 | 43 |
44 | 45 | 46 | 47 | 48 |
'; 50 | } ?> 51 | 52 |
53 | 54 |