skip to Main Content

I just launched my store on wordpress and I ran into a problem:
When I am on the home page of the site, all my product titles are in H2 and should be in h3 (SEO reasons), my recommendation products are also in h2 instead of h3 (on the single product page and in collections, i would like to change them all to h3). I looked for a long time where the problem could come from, searched all the files of the theme to change any title from h2 to h3 but nothing helped, I can’t find where it is!
I also asked the theme creators for help but they told me it was woocomerce’s fault and there was nothing they could do ..

A lot of people have had some of the same problem under other themes but they don’t have the same "function.php" as me.
I also followed this: How can I change the product <h2> in Woocommerce Storefront to <h3>? but it didn’t work for me.

Can someone help me on this problem ?

here is my "function.php" but i dont think it’ll help..

/**
 * Theme functions and definitions.
 *
 * Sets up the theme and provides some helper functions
 *
 * When using a child theme (see http://codex.wordpress.org/Theme_Development
 * and http://codex.wordpress.org/Child_Themes), you can override certain
 * functions (those wrapped in a function_exists() call) by defining them first
 * in your child theme's functions.php file. The child theme's functions.php
 * file is included before the parent theme's file, so the child theme
 * functions would be used.
 *
 *
 * For more information on hooks, actions, and filters,
 * see http://codex.wordpress.org/Plugin_API
 *
 * @package OceanWP WordPress theme
 */

// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

// Core Constants.
define( 'OCEANWP_THEME_DIR', get_template_directory() );
define( 'OCEANWP_THEME_URI', get_template_directory_uri() );

/**
 * OceanWP theme class
 */
final class OCEANWP_Theme_Class {

    /**
     * Main Theme Class Constructor
     *
     * @since   1.0.0
     */
    public function __construct() {

        // Define theme constants.
        $this->oceanwp_constants();

        // Load required files.
        $this->oceanwp_has_setup();

        // Load framework classes.
        add_action( 'after_setup_theme', array( 'OCEANWP_Theme_Class', 'classes' ), 4 );

        // Setup theme => add_theme_support, register_nav_menus, load_theme_textdomain, etc.
        add_action( 'after_setup_theme', array( 'OCEANWP_Theme_Class', 'theme_setup' ), 10 );

        // Setup theme => Generate the custom CSS file.
        add_action( 'admin_bar_init', array( 'OCEANWP_Theme_Class', 'save_customizer_css_in_file' ), 9999 );

        // register sidebar widget areas.
        add_action( 'widgets_init', array( 'OCEANWP_Theme_Class', 'register_sidebars' ) );

        // Registers theme_mod strings into Polylang.
        if ( class_exists( 'Polylang' ) ) {
            add_action( 'after_setup_theme', array( 'OCEANWP_Theme_Class', 'polylang_register_string' ) );
        }

        /** Admin only actions */
        if ( is_admin() ) {

            // Load scripts in the WP admin.
            add_action( 'admin_enqueue_scripts', array( 'OCEANWP_Theme_Class', 'admin_scripts' ) );

            // Outputs custom CSS for the admin.
            add_action( 'admin_head', array( 'OCEANWP_Theme_Class', 'admin_inline_css' ) );

            /** Non Admin actions */
        } else {

            // Load theme CSS.
            add_action( 'wp_enqueue_scripts', array( 'OCEANWP_Theme_Class', 'theme_css' ) );

            // Load his file in last.
            add_action( 'wp_enqueue_scripts', array( 'OCEANWP_Theme_Class', 'custom_style_css' ), 9999 );

            // Remove Customizer CSS script from Front-end.
            add_action( 'init', array( 'OCEANWP_Theme_Class', 'remove_customizer_custom_css' ) );

            // Load theme js.
            add_action( 'wp_enqueue_scripts', array( 'OCEANWP_Theme_Class', 'theme_js' ) );

            // Add a pingback url auto-discovery header for singularly identifiable articles.
            add_action( 'wp_head', array( 'OCEANWP_Theme_Class', 'pingback_header' ), 1 );

            // Add meta viewport tag to header.
            add_action( 'wp_head', array( 'OCEANWP_Theme_Class', 'meta_viewport' ), 1 );

            // Add an X-UA-Compatible header.
            add_filter( 'wp_headers', array( 'OCEANWP_Theme_Class', 'x_ua_compatible_headers' ) );

            // Loads html5 shiv script.
            add_action( 'wp_head', array( 'OCEANWP_Theme_Class', 'html5_shiv' ) );

            // Outputs custom CSS to the head.
            add_action( 'wp_head', array( 'OCEANWP_Theme_Class', 'custom_css' ), 9999 );

            // Minify the WP custom CSS because WordPress doesn't do it by default.
            add_filter( 'wp_get_custom_css', array( 'OCEANWP_Theme_Class', 'minify_custom_css' ) );

            // Alter the search posts per page.
            add_action( 'pre_get_posts', array( 'OCEANWP_Theme_Class', 'search_posts_per_page' ) );

            // Alter WP categories widget to display count inside a span.
            add_filter( 'wp_list_categories', array( 'OCEANWP_Theme_Class', 'wp_list_categories_args' ) );

            // Add a responsive wrapper to the WordPress oembed output.
            add_filter( 'embed_oembed_html', array( 'OCEANWP_Theme_Class', 'add_responsive_wrap_to_oembeds' ), 99, 4 );

            // Adds classes the post class.
            add_filter( 'post_class', array( 'OCEANWP_Theme_Class', 'post_class' ) );

            // Add schema markup to the authors post link.
            add_filter( 'the_author_posts_link', array( 'OCEANWP_Theme_Class', 'the_author_posts_link' ) );

            // Add support for Elementor Pro locations.
            add_action( 'elementor/theme/register_locations', array( 'OCEANWP_Theme_Class', 'register_elementor_locations' ) );

            // Remove the default lightbox script for the beaver builder plugin.
            add_filter( 'fl_builder_override_lightbox', array( 'OCEANWP_Theme_Class', 'remove_bb_lightbox' ) );

        }

    }

    /**
     * Define Constants
     *
     * @since   1.0.0
     */
    public static function oceanwp_constants() {

        $version = self::theme_version();

        // Theme version.
        define( 'OCEANWP_THEME_VERSION', $version );

        // Javascript and CSS Paths.
        define( 'OCEANWP_JS_DIR_URI', OCEANWP_THEME_URI . '/assets/js/' );
        define( 'OCEANWP_CSS_DIR_URI', OCEANWP_THEME_URI . '/assets/css/' );

        // Include Paths.
        define( 'OCEANWP_INC_DIR', OCEANWP_THEME_DIR . '/inc/' );
        define( 'OCEANWP_INC_DIR_URI', OCEANWP_THEME_URI . '/inc/' );

        // Check if plugins are active.
        define( 'OCEAN_EXTRA_ACTIVE', class_exists( 'Ocean_Extra' ) );
        define( 'OCEANWP_ELEMENTOR_ACTIVE', class_exists( 'ElementorPlugin' ) );
        define( 'OCEANWP_BEAVER_BUILDER_ACTIVE', class_exists( 'FLBuilder' ) );
        define( 'OCEANWP_WOOCOMMERCE_ACTIVE', class_exists( 'WooCommerce' ) );
        define( 'OCEANWP_EDD_ACTIVE', class_exists( 'Easy_Digital_Downloads' ) );
        define( 'OCEANWP_LIFTERLMS_ACTIVE', class_exists( 'LifterLMS' ) );
        define( 'OCEANWP_ALNP_ACTIVE', class_exists( 'Auto_Load_Next_Post' ) );
        define( 'OCEANWP_LEARNDASH_ACTIVE', class_exists( 'SFWD_LMS' ) );
    }

    /**
     * Load all core theme function files
     *
     * @since 1.0.0oceanwp_has_setup
     */
    public static function oceanwp_has_setup() {

        $dir = OCEANWP_INC_DIR;

        require_once $dir . 'helpers.php';
        require_once $dir . 'header-content.php';
        require_once $dir . 'oceanwp-strings.php';
        require_once $dir . 'oceanwp-theme-icons.php';
        require_once $dir . 'customizer/controls/typography/webfonts.php';
        require_once $dir . 'walker/init.php';
        require_once $dir . 'walker/menu-walker.php';
        require_once $dir . 'third/class-gutenberg.php';
        require_once $dir . 'third/class-elementor.php';
        require_once $dir . 'third/class-beaver-themer.php';
        require_once $dir . 'third/class-bbpress.php';
        require_once $dir . 'third/class-buddypress.php';
        require_once $dir . 'third/class-lifterlms.php';
        require_once $dir . 'third/class-learndash.php';
        require_once $dir . 'third/class-sensei.php';
        require_once $dir . 'third/class-social-login.php';
        require_once $dir . 'third/class-amp.php';
        require_once $dir . 'third/class-pwa.php';

        // WooCommerce.
        if ( OCEANWP_WOOCOMMERCE_ACTIVE ) {
            require_once $dir . 'woocommerce/woocommerce-config.php';
        }

        // Easy Digital Downloads.
        if ( OCEANWP_EDD_ACTIVE ) {
            require_once $dir . 'edd/edd-config.php';
        }

    }

    /**
     * Returns current theme version
     *
     * @since   1.0.0
     */
    public static function theme_version() {

        // Get theme data.
        $theme = wp_get_theme();

        // Return theme version.
        return $theme->get( 'Version' );

    }

    /**
     * Compare WordPress version
     *
     * @access public
     * @since 1.8.3
     * @param  string $version - A WordPress version to compare against current version.
     * @return boolean
     */
    public static function is_wp_version( $version = '5.4' ) {

        global $wp_version;

        // WordPress version.
        return version_compare( strtolower( $wp_version ), strtolower( $version ), '>=' );

    }


    /**
     * Check for AMP endpoint
     *
     * @return bool
     * @since 1.8.7
     */
    public static function oceanwp_is_amp() {
        return function_exists( 'is_amp_endpoint' ) && is_amp_endpoint();
    }

    /**
     * Load theme classes
     *
     * @since   1.0.0
     */
    public static function classes() {

        // Admin only classes.
        if ( is_admin() ) {

            // Recommend plugins.
            require_once OCEANWP_INC_DIR . 'plugins/class-tgm-plugin-activation.php';
            require_once OCEANWP_INC_DIR . 'plugins/tgm-plugin-activation.php';

            // Front-end classes.
        } else {

            // Breadcrumbs class.
            require_once OCEANWP_INC_DIR . 'breadcrumbs.php';

        }

        // Customizer class.
        require_once OCEANWP_INC_DIR . 'customizer/customizer.php';

    }

    /**
     * Theme Setup
     *
     * @since   1.0.0
     */
    public static function theme_setup() {

        // Load text domain.
        load_theme_textdomain( 'oceanwp', OCEANWP_THEME_DIR . '/languages' );

        // Get globals.
        global $content_width;

        // Set content width based on theme's default design.
        if ( ! isset( $content_width ) ) {
            $content_width = 1200;
        }

        // Register navigation menus.
        register_nav_menus(
            array(
                'topbar_menu' => esc_html__( 'Top Bar', 'oceanwp' ),
                'main_menu'   => esc_html__( 'Main', 'oceanwp' ),
                'footer_menu' => esc_html__( 'Footer', 'oceanwp' ),
                'mobile_menu' => esc_html__( 'Mobile (optional)', 'oceanwp' ),
            )
        );

        // Enable support for Post Formats.
        add_theme_support( 'post-formats', array( 'video', 'gallery', 'audio', 'quote', 'link' ) );

        // Enable support for <title> tag.
        add_theme_support( 'title-tag' );

        // Add default posts and comments RSS feed links to head.
        add_theme_support( 'automatic-feed-links' );

        // Enable support for Post Thumbnails on posts and pages.
        add_theme_support( 'post-thumbnails' );

        /**
         * Enable support for header image
         */
        add_theme_support(
            'custom-header',
            apply_filters(
                'ocean_custom_header_args',
                array(
                    'width'       => 2000,
                    'height'      => 1200,
                    'flex-height' => true,
                    'video'       => true,
                )
            )
        );

        /**
         * Enable support for site logo
         */
        add_theme_support(
            'custom-logo',
            apply_filters(
                'ocean_custom_logo_args',
                array(
                    'height'      => 45,
                    'width'       => 164,
                    'flex-height' => true,
                    'flex-width'  => true,
                )
            )
        );

        /*
         * Switch default core markup for search form, comment form, comments, galleries, captions and widgets
         * to output valid HTML5.
         */
        add_theme_support(
            'html5',
            array(
                'comment-form',
                'comment-list',
                'gallery',
                'caption',
                'widgets',
            )
        );

        // Declare WooCommerce support.
        add_theme_support( 'woocommerce' );
        add_theme_support( 'wc-product-gallery-zoom' );
        add_theme_support( 'wc-product-gallery-lightbox' );
        add_theme_support( 'wc-product-gallery-slider' );

        // Add editor style.
        add_editor_style( 'assets/css/editor-style.min.css' );

        // Declare support for selective refreshing of widgets.
        add_theme_support( 'customize-selective-refresh-widgets' );

    }

    /**
     * Adds the meta tag to the site header
     *
     * @since 1.1.0
     */
    public static function pingback_header() {

        if ( is_singular() && pings_open() ) {
            printf( '<link rel="pingback" href="%s">' . "n", esc_url( get_bloginfo( 'pingback_url' ) ) );
        }

    }

    /**
     * Adds the meta tag to the site header
     *
     * @since 1.0.0
     */
    public static function meta_viewport() {

        // Meta viewport.
        $viewport = '<meta name="viewport" content="width=device-width, initial-scale=1">';

        // Apply filters for child theme tweaking.
        echo apply_filters( 'ocean_meta_viewport', $viewport ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped

    }

    /**
     * Load scripts in the WP admin
     *
     * @since 1.0.0
     */
    public static function admin_scripts() {
        global $pagenow;
        if ( 'nav-menus.php' === $pagenow ) {
            wp_enqueue_style( 'oceanwp-menus', OCEANWP_INC_DIR_URI . 'walker/assets/menus.css', false, OCEANWP_THEME_VERSION );
        }
    }

    /**
     * Load front-end scripts
     *
     * @since   1.0.0
     */
    public static function theme_css() {

        // Define dir.
        $dir           = OCEANWP_CSS_DIR_URI;
        $theme_version = OCEANWP_THEME_VERSION;

        // Remove font awesome style from plugins.
        wp_deregister_style( 'font-awesome' );
        wp_deregister_style( 'fontawesome' );

        // Load font awesome style.
        wp_enqueue_style( 'font-awesome', OCEANWP_THEME_URI . '/assets/fonts/fontawesome/css/all.min.css', false, '5.15.1' );

        // Register simple line icons style.
        wp_enqueue_style( 'simple-line-icons', $dir . 'third/simple-line-icons.min.css', false, '2.4.0' );

        // Register the lightbox style.
        wp_enqueue_style( 'magnific-popup', $dir . 'third/magnific-popup.min.css', false, '1.0.0' );

        // Register the slick style.
        wp_enqueue_style( 'slick', $dir . 'third/slick.min.css', false, '1.6.0' );

        // Main Style.css File.
        wp_enqueue_style( 'oceanwp-style', $dir . 'style.min.css', false, $theme_version );

        // Register hamburgers buttons to easily use them.
        wp_register_style( 'oceanwp-hamburgers', $dir . 'third/hamburgers/hamburgers.min.css', false, $theme_version );

        // Register hamburgers buttons styles.
        $hamburgers = oceanwp_hamburgers_styles();
        foreach ( $hamburgers as $class => $name ) {
            wp_register_style( 'oceanwp-' . $class . '', $dir . 'third/hamburgers/types/' . $class . '.css', false, $theme_version );
        }

        // Get mobile menu icon style.
        $mobileMenu = get_theme_mod( 'ocean_mobile_menu_open_hamburger', 'default' );

        // Enqueue mobile menu icon style.
        if ( ! empty( $mobileMenu ) && 'default' !== $mobileMenu ) {
            wp_enqueue_style( 'oceanwp-hamburgers' );
            wp_enqueue_style( 'oceanwp-' . $mobileMenu . '' );
        }

        // If Vertical header style.
        if ( 'vertical' === oceanwp_header_style() ) {
            wp_enqueue_style( 'oceanwp-hamburgers' );
            wp_enqueue_style( 'oceanwp-spin' );
        }

    }

    /**
     * Returns all js needed for the front-end
     *
     * @since 1.0.0
     */
    public static function theme_js() {

        if ( self::oceanwp_is_amp() ) {
            return;
        }

        // Get js directory uri.
        $dir = OCEANWP_JS_DIR_URI;

        // Get current theme version.
        $theme_version = OCEANWP_THEME_VERSION;

        // Get localized array.
        $localize_array = self::localize_array();

        // Comment reply.
        if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) {
            wp_enqueue_script( 'comment-reply' );
        }

        // Add images loaded.
        wp_enqueue_script( 'imagesloaded' );

        // Register nicescroll script to use it in some extensions.
        wp_register_script( 'nicescroll', $dir . 'third/nicescroll.min.js', array( 'jquery' ), $theme_version, true );

        // Enqueue nicescroll script if vertical header style.
        if ( 'vertical' === oceanwp_header_style() ) {
            wp_enqueue_script( 'nicescroll' );
        }

        // Register Infinite Scroll script.
        wp_register_script( 'infinitescroll', $dir . 'third/infinitescroll.min.js', array( 'jquery' ), $theme_version, true );

        // WooCommerce scripts.
        if ( OCEANWP_WOOCOMMERCE_ACTIVE
            && 'yes' !== get_theme_mod( 'ocean_woo_remove_custom_features', 'no' ) ) {
            wp_enqueue_script( 'oceanwp-woocommerce', $dir . 'third/woo/woo-scripts.min.js', array( 'jquery' ), $theme_version, true );
        }

        // Load the lightbox scripts.
        wp_enqueue_script( 'magnific-popup', $dir . 'third/magnific-popup.min.js', array( 'jquery' ), $theme_version, true );
        wp_enqueue_script( 'oceanwp-lightbox', $dir . 'third/lightbox.min.js', array( 'jquery' ), $theme_version, true );

        // Load minified js.
        wp_enqueue_script( 'oceanwp-main', $dir . 'main.min.js', array( 'jquery' ), $theme_version, true );

        // Localize array.
        wp_localize_script( 'oceanwp-main', 'oceanwpLocalize', $localize_array );

    }

    /**
     * Functions.js localize array
     *
     * @since 1.0.0
     */
    public static function localize_array() {

        // Create array.
        $sidr_side   = get_theme_mod( 'ocean_mobile_menu_sidr_direction', 'left' );
        $sidr_side   = $sidr_side ? $sidr_side : 'left';
        $sidr_target = get_theme_mod( 'ocean_mobile_menu_sidr_dropdown_target', 'link' );
        $sidr_target = $sidr_target ? $sidr_target : 'link';
        $vh_target   = get_theme_mod( 'ocean_vertical_header_dropdown_target', 'link' );
        $vh_target   = $vh_target ? $vh_target : 'link';
        $array       = array(
            'isRTL'                => is_rtl(),
            'menuSearchStyle'      => oceanwp_menu_search_style(),
            'sidrSource'           => oceanwp_sidr_menu_source(),
            'sidrDisplace'         => get_theme_mod( 'ocean_mobile_menu_sidr_displace', true ) ? true : false,
            'sidrSide'             => $sidr_side,
            'sidrDropdownTarget'   => $sidr_target,
            'verticalHeaderTarget' => $vh_target,
            'customSelects'        => '.woocommerce-ordering .orderby, #dropdown_product_cat, .widget_categories select, .widget_archive select, .single-product .variations_form .variations select',
        );

        // WooCart.
        if ( OCEANWP_WOOCOMMERCE_ACTIVE ) {
            $array['wooCartStyle'] = oceanwp_menu_cart_style();
        }

        // Apply filters and return array.
        return apply_filters( 'ocean_localize_array', $array );
    }

    /**
     * Add headers for IE to override IE's Compatibility View Settings
     *
     * @param obj $headers   header settings.
     * @since 1.0.0
     */
    public static function x_ua_compatible_headers( $headers ) {
        $headers['X-UA-Compatible'] = 'IE=edge';
        return $headers;
    }

    /**
     * Load HTML5 dependencies for IE8
     *
     * @since 1.0.0
     */
    public static function html5_shiv() {
        wp_register_script( 'html5shiv', OCEANWP_JS_DIR_URI . 'third/html5.min.js', array(), OCEANWP_THEME_VERSION, false );
        wp_enqueue_script( 'html5shiv' );
        wp_script_add_data( 'html5shiv', 'conditional', 'lt IE 9' );
    }

    /**
     * Registers sidebars
     *
     * @since   1.0.0
     */
    public static function register_sidebars() {

        $heading = get_theme_mod( 'ocean_sidebar_widget_heading_tag', 'h4' );
        $heading = apply_filters( 'ocean_sidebar_widget_heading_tag', $heading );

        $foo_heading = get_theme_mod( 'ocean_footer_widget_heading_tag', 'h4' );
        $foo_heading = apply_filters( 'ocean_footer_widget_heading_tag', $foo_heading );

        // Default Sidebar.
        register_sidebar(
            array(
                'name'          => esc_html__( 'Default Sidebar', 'oceanwp' ),
                'id'            => 'sidebar',
                'description'   => esc_html__( 'Widgets in this area will be displayed in the left or right sidebar area if you choose the Left or Right Sidebar layout.', 'oceanwp' ),
                'before_widget' => '<div id="%1$s" class="sidebar-box %2$s clr">',
                'after_widget'  => '</div>',
                'before_title'  => '<' . $heading . ' class="widget-title">',
                'after_title'   => '</' . $heading . '>',
            )
        );

        // Left Sidebar.
        register_sidebar(
            array(
                'name'          => esc_html__( 'Left Sidebar', 'oceanwp' ),
                'id'            => 'sidebar-2',
                'description'   => esc_html__( 'Widgets in this area are used in the left sidebar region if you use the Both Sidebars layout.', 'oceanwp' ),
                'before_widget' => '<div id="%1$s" class="sidebar-box %2$s clr">',
                'after_widget'  => '</div>',
                'before_title'  => '<' . $heading . ' class="widget-title">',
                'after_title'   => '</' . $heading . '>',
            )
        );

        // Search Results Sidebar.
        if ( get_theme_mod( 'ocean_search_custom_sidebar', true ) ) {
            register_sidebar(
                array(
                    'name'          => esc_html__( 'Search Results Sidebar', 'oceanwp' ),
                    'id'            => 'search_sidebar',
                    'description'   => esc_html__( 'Widgets in this area are used in the search result page.', 'oceanwp' ),
                    'before_widget' => '<div id="%1$s" class="sidebar-box %2$s clr">',
                    'after_widget'  => '</div>',
                    'before_title'  => '<' . $heading . ' class="widget-title">',
                    'after_title'   => '</' . $heading . '>',
                )
            );
        }

        // Footer 1.
        register_sidebar(
            array(
                'name'          => esc_html__( 'Footer 1', 'oceanwp' ),
                'id'            => 'footer-one',
                'description'   => esc_html__( 'Widgets in this area are used in the first footer region.', 'oceanwp' ),
                'before_widget' => '<div id="%1$s" class="footer-widget %2$s clr">',
                'after_widget'  => '</div>',
                'before_title'  => '<' . $foo_heading . ' class="widget-title">',
                'after_title'   => '</' . $foo_heading . '>',
            )
        );

        // Footer 2.
        register_sidebar(
            array(
                'name'          => esc_html__( 'Footer 2', 'oceanwp' ),
                'id'            => 'footer-two',
                'description'   => esc_html__( 'Widgets in this area are used in the second footer region.', 'oceanwp' ),
                'before_widget' => '<div id="%1$s" class="footer-widget %2$s clr">',
                'after_widget'  => '</div>',
                'before_title'  => '<' . $foo_heading . ' class="widget-title">',
                'after_title'   => '</' . $foo_heading . '>',
            )
        );

        // Footer 3.
        register_sidebar(
            array(
                'name'          => esc_html__( 'Footer 3', 'oceanwp' ),
                'id'            => 'footer-three',
                'description'   => esc_html__( 'Widgets in this area are used in the third footer region.', 'oceanwp' ),
                'before_widget' => '<div id="%1$s" class="footer-widget %2$s clr">',
                'after_widget'  => '</div>',
                'before_title'  => '<' . $foo_heading . ' class="widget-title">',
                'after_title'   => '</' . $foo_heading . '>',
            )
        );

        // Footer 4.
        register_sidebar(
            array(
                'name'          => esc_html__( 'Footer 4', 'oceanwp' ),
                'id'            => 'footer-four',
                'description'   => esc_html__( 'Widgets in this area are used in the fourth footer region.', 'oceanwp' ),
                'before_widget' => '<div id="%1$s" class="footer-widget %2$s clr">',
                'after_widget'  => '</div>',
                'before_title'  => '<' . $foo_heading . ' class="widget-title">',
                'after_title'   => '</' . $foo_heading . '>',
            )
        );

    }

    /**
     * Registers theme_mod strings into Polylang.
     *
     * @since 1.1.4
     */
    public static function polylang_register_string() {

        if ( function_exists( 'pll_register_string' ) && $strings = oceanwp_register_tm_strings() ) {
            foreach ( $strings as $string => $default ) {
                pll_register_string( $string, get_theme_mod( $string, $default ), 'Theme Mod', true );
            }
        }

    }

    /**
     * All theme functions hook into the oceanwp_head_css filter for this function.
     *
     * @param obj $output output value.
     * @since 1.0.0
     */
    public static function custom_css( $output = null ) {

        // Add filter for adding custom css via other functions.
        $output = apply_filters( 'ocean_head_css', $output );

        // If Custom File is selected.
        if ( 'file' === get_theme_mod( 'ocean_customzer_styling', 'head' ) ) {

            global $wp_customize;
            $upload_dir = wp_upload_dir();

            // Render CSS in the head.
            if ( isset( $wp_customize ) || ! file_exists( $upload_dir['basedir'] . '/oceanwp/custom-style.css' ) ) {

                // Minify and output CSS in the wp_head.
                if ( ! empty( $output ) ) {
                    echo "<!-- OceanWP CSS -->n<style type="text/css">n" . wp_strip_all_tags( oceanwp_minify_css( $output ) ) . "n</style>"; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
                }
            }
        } else {

            // Minify and output CSS in the wp_head.
            if ( ! empty( $output ) ) {
                echo "<!-- OceanWP CSS -->n<style type="text/css">n" . wp_strip_all_tags( oceanwp_minify_css( $output ) ) . "n</style>"; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
            }
        }

    }

    /**
     * Minify the WP custom CSS because WordPress doesn't do it by default.
     *
     * @param obj $css minify css.
     * @since 1.1.9
     */
    public static function minify_custom_css( $css ) {

        return oceanwp_minify_css( $css );

    }

    /**
     * Save Customizer CSS in a file
     *
     * @param obj $output output value.
     * @since 1.4.12
     */
    public static function save_customizer_css_in_file( $output = null ) {

        // If Custom File is not selected.
        if ( 'file' !== get_theme_mod( 'ocean_customzer_styling', 'head' ) ) {
            return;
        }

        // Get all the customier css.
        $output = apply_filters( 'ocean_head_css', $output );

        // Get Custom Panel CSS.
        $output_custom_css = wp_get_custom_css();

        // Minified the Custom CSS.
        $output .= oceanwp_minify_css( $output_custom_css );

        // We will probably need to load this file.
        require_once ABSPATH . 'wp-admin' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'file.php';

        global $wp_filesystem;
        $upload_dir = wp_upload_dir(); // Grab uploads folder array.
        $dir        = trailingslashit( $upload_dir['basedir'] ) . 'oceanwp' . DIRECTORY_SEPARATOR; // Set storage directory path.

        WP_Filesystem(); // Initial WP file system.
        $wp_filesystem->mkdir( $dir ); // Make a new folder 'oceanwp' for storing our file if not created already.
        $wp_filesystem->put_contents( $dir . 'custom-style.css', $output, 0644 ); // Store in the file.

    }

    /**
     * Include Custom CSS file if present.
     *
     * @param obj $output output value.
     * @since 1.4.12
     */
    public static function custom_style_css( $output = null ) {

        // If Custom File is not selected.
        if ( 'file' !== get_theme_mod( 'ocean_customzer_styling', 'head' ) ) {
            return;
        }

        global $wp_customize;
        $upload_dir = wp_upload_dir();

        // Get all the customier css.
        $output = apply_filters( 'ocean_head_css', $output );

        // Get Custom Panel CSS.
        $output_custom_css = wp_get_custom_css();

        // Minified the Custom CSS.
        $output .= oceanwp_minify_css( $output_custom_css );

        // Render CSS from the custom file.
        if ( ! isset( $wp_customize ) && file_exists( $upload_dir['basedir'] . '/oceanwp/custom-style.css' ) && ! empty( $output ) ) {
            wp_enqueue_style( 'oceanwp-custom', trailingslashit( $upload_dir['baseurl'] ) . 'oceanwp/custom-style.css', false, false );
        }
    }

    /**
     * Remove Customizer style script from front-end
     *
     * @since 1.4.12
     */
    public static function remove_customizer_custom_css() {

        // If Custom File is not selected.
        if ( 'file' !== get_theme_mod( 'ocean_customzer_styling', 'head' ) ) {
            return;
        }

        global $wp_customize;

        // Disable Custom CSS in the frontend head.
        remove_action( 'wp_head', 'wp_custom_css_cb', 11 );
        remove_action( 'wp_head', 'wp_custom_css_cb', 101 );

        // If custom CSS file exists and NOT in customizer screen.
        if ( isset( $wp_customize ) ) {
            add_action( 'wp_footer', 'wp_custom_css_cb', 9999 );
        }
    }

    /**
     * Adds inline CSS for the admin
     *
     * @since 1.0.0
     */
    public static function admin_inline_css() {
        echo '<style>div#setting-error-tgmpa{display:block;}</style>';
    }

    /**
     * Alter the search posts per page
     *
     * @param obj $query query.
     * @since 1.3.7
     */
    public static function search_posts_per_page( $query ) {
        $posts_per_page = get_theme_mod( 'ocean_search_post_per_page', '8' );
        $posts_per_page = $posts_per_page ? $posts_per_page : '8';

        if ( $query->is_main_query() && is_search() ) {
            $query->set( 'posts_per_page', $posts_per_page );
        }
    }

    /**
     * Alter wp list categories arguments.
     * Adds a span around the counter for easier styling.
     *
     * @param obj $links link.
     * @since 1.0.0
     */
    public static function wp_list_categories_args( $links ) {
        $links = str_replace( '</a> (', '</a> <span class="cat-count-span">(', $links );
        $links = str_replace( ' )', ' )</span>', $links );
        return $links;
    }

    /**
     * Alters the default oembed output.
     * Adds special classes for responsive oembeds via CSS.
     *
     * @param obj $cache     cache.
     * @param url $url       url.
     * @param obj $attr      attributes.
     * @param obj $post_ID   post id.
     * @since 1.0.0
     */
    public static function add_responsive_wrap_to_oembeds( $cache, $url, $attr, $post_ID ) {...```

3

Answers


  1. Chosen as BEST ANSWER

    I finally find an anwser, it suffice to change "h2" to "h3" into the file "owp-archive-product-hover.php" (woocommerce/owp-archive-product-hover.php) thanks to @Johannes and special thanks for @Ruvee for your time !

    // Display product title.
    do_action( 'ocean_before_archive_product_title' );
    
    echo '<li class="title">';
    
        do_action( 'ocean_before_archive_product_title_inner' );
    
        if ( false === $ocean_woo_disable_links
            || ( $disable_links && is_user_logged_in() ) ) {
    
            echo '<h3><a href="' . esc_url( get_the_permalink() ) . '">' . get_the_title() . '</a></h3>';
    
        } else {
            
            echo '<h3>' . get_the_title() . '</h3>';
    
        }
        
        do_action( 'ocean_after_archive_product_title_inner' );
    
    echo '</li>';
    
    do_action( 'ocean_after_archive_product_title' );```
    

  2. I don’t think the functions.php file has anything to do with it – usually HTML structures like this are created in template php files which are in the themes folder – either on the top level of that folder or as "template parts" in an according subfolder. You have to edit those( or actually those among them that are used by the pages you are referring to), changing all <h3> tags to <h2> (also the closing tags).

    However, since any not-selfmade theme will be updated every now and then, those changes would be overwritten with updated files when available, it would be necessary to create a child theme, which only contains those templates which you want to change (see also https://developer.wordpress.org/themes/advanced-topics/child-themes/). Then again, updated themes might contain template updates which are necessary, so you’d always have to check which details were updated in that particular template file, integrating it into your child theme templates or editing the updated original themes and using them in your child theme.

    P.S.: I think the title of your question is a bit misleading: In the question text you are asking about certain title tags in the product pages, not about parts of the menu, aren’t you?

    Login or Signup to reply.
  3. This is a Woocommerce template issue. It isn’t the theme issue.

    The action you are looking to replace is: woocommerce_shop_loop_item_title which is located in: plugins/woocommerce/templates/content-product.php

    This is the function being called in the action: woocommerce_template_loop_product_title (which is where the output is coming from. You can find the original markup in wc-template-functions.php.

    What you need to do to replace it because there is no filter for the actual HTML tags (just the content between them). In your functions.php (in your child theme) you can add this:

    // First we remove the original output that is hooked.
    remove_action( 'woocommerce_shop_loop_item_title', 'woocommerce_template_loop_product_title', 10 );
    
    // Now we will add your new output to the hook
    add_action( 'woocommerce_shop_loop_item_title', 'wp67610449_woocommerce_template_loop_product_title', 10 );
    
    /* Now we have your function. You can name this whatever you want, but it needs to match the name in the add_action */
    
    function wp67610449_woocommerce_template_loop_product_title() {
        //We'll just copy this from the existing function to keep all the functionality the same.
        echo '<h3 class="' . esc_attr( apply_filters( 'woocommerce_product_loop_title_classes', 'woocommerce-loop-product__title' ) ) . '">' . get_the_title() . '</h3>'; 
    }
    

    If you add this to the main theme’s functions.php, it will get overwritten if you update the theme. You should create a child theme, it can be as sparse as an empty styles.css (with required comments at the top) and functions.php with this code.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search