Tổng hợp đoạn mã chủ đề WordPress

Custom Metaviewport Tag

add_filter( 'wpex_meta_viewport', function() {
    return '';
} );

Altering Layouts (Full Screen, No Sidebar, Left Sidebar, Right Sidebar)

/**
 * Alter your post layouts
 *
 * @return full-width, full-screen, left-sidebar or right-sidebar
 *
 */
add_filter( 'wpex_post_layout_class', function( $class ) {

	// Alter your custom post type layout
	if ( is_singular( 'YOUR_CPT' ) ) {
		$class = 'full-width';
	}

	// Return correct class
	return $class;

}, 20 );

Remove Recommended Plugins Notice

// Remove certain plugins
function my_recommended_plugins( $plugins ) {
    
    // Remove notice to install WooCommerce
    unset( $plugins['woocommerce'] );

    // Return plugins
    return $plugins;

}
add_filter( 'wpex_recommended_plugins', 'my_recommended_plugins' );

// Remove all plugins
// THIS IS NOT RECOMMENDED IF YOU ARE USING SOME OF THE PLUGINS SINCE THE NOTICE IS IS ALSO USED TO LET YOU KNOW OF UPDATES
add_filter( 'wpex_recommended_plugins', '__return_empty_array' );

Add/Remove Image Sizes

// Add & remove image sizes from the "Image Sizes" panel
add_filter( 'wpex_image_sizes', function( $sizes ) {

    // Remove "blog_post_full" image size
    unset( $sizes['blog_post_full'] );

    // Add new image size "my_image_sizes"
    $sizes['my_image_size'] = array(
        'label'     => __( 'My Image Size', 'wpex' ), // Label
        'width'     => 'my_image_size_width', // id for theme_mod width
        'height'    => 'my_image_size_height', // id for theme_mod height
        'crop'      => 'my_image_size_crop', // id for theme_mod crop
    );

    // Return sizes
    return $sizes;

}, 9999 );

Allow Skype Links In The Theme

add_filter( 'kses_allowed_protocols', function( $protocols ){
    $protocols[] = 'skype';
    return $protocols;
} );

Alter The Default Excerpt Arguments

/* The Default arguments look like this:
$defaults = array(
'output' => '',
'length' => '30',
'readmore' => false,
'readmore_link' => '',
'more' => '…',
);
*/

// You can use a filter to alter these. It will also override any values inputed for the wpex_get_excerpt() function
function my_wpex_excerpt_args( $args ) {

// Set more tag to nothing
$args['more'] == '';

// Change more tag into a more link for portfolio posts
if ( 'portfolio' == get_post_type() ) {
$args['more'] = '…<a href="'. get_permalink() .'" title="'. wpex_get_esc_title() .'">'. __( 'Read More', 'wpex' ) .' →</a>';
}

// Return args
return $args;

}
add_filter( 'wpex_excerpt_args', 'my_wpex_excerpt_args' );

Remove Recommended Plugins

// Remove recommended plugins
add_filter( 'wpex_recommended_plugins', '__return_empty_array' );

Remove/Hide The Edit Page/Post Links

body .post-edit { display: none !important; }

Conditionally Show/Hide The Footer Callout

function my_callout_visibility( $bool ) {

	// Hide on the front page
	if ( is_front_page() ) {
		$bool = false;
	}

	// Return boolean
	return $bool;

}
add_filter( 'wpex_callout_enabled', 'my_callout_visibility', 20 );

Alter Any Post Type Archive To Display Like the Blog

add_filter( 'wpex_is_blog_query', function( $bool ) {
	if ( is_post_type_archive( 'events' ) ) {
		$bool = true; // Make events post type archive render like blog posts
	}
	return $bool;
} );

Conditionally Disable/Enable The “Togglebar”

add_action( 'wpex_toggle_bar_active', function( $bool ) {

	// Disable on blog archives (category/tag/date/author/blog template/format archives)
	if ( wpex_is_blog_query() ) {
		$bool = false;
	}

	// Return display
	return $bool;

} );

Move Top Bar Outside The Header

/* The top bar is by default hooked into the header so when the header is disabled
 * so is the top bar. However, you can move the Top Bar into a different hook to prevent that
 *
 * @deprecated Please update your theme because this is now the default structure in the latest version
 * no need to add any code to your site.
 */
function my_move_top_bar() {

	// Remove from the header hook
    remove_action( 'wpex_hook_header_before', 'wpex_top_bar' );

    // Re-add with low priority to make sure it comes before the header
	add_action( 'wpex_hook_wrap_top', 'wpex_top_bar', 5 );

}
add_action( 'init', 'my_move_top_bar', 20 );

Conditionally Enable/Disable The “Topbar”

add_action( 'wpex_is_top_bar_enabled', function( $bool ) {

	// Disable on checkout
	if ( function_exists( 'is_checkout' ) && is_checkout() ) {
		$bool = false;
	}

	// Return display
	return $bool;

} );

Move Topbar Under Main Header

function myprefix_move_topbar() {

	// Remove from wrap top
	remove_action( 'wpex_hook_wrap_top', 'wpex_top_bar', 5 );

	// Re-add to header after hook
	add_action( 'wpex_hook_header_after', 'wpex_top_bar' );

}
add_action( 'init', 'myprefix_move_topbar' );

Topbar Custom Image Icons

function my_alter_top_bar_social_img_url() {
	return get_stylesheet_directory_uri() .'/images/social/'; // Adjust accordingly.
}
add_filter( 'top_bar_social_img_url', 'my_alter_top_bar_social_img_url' );

Move Topbar Inside Header Wrapper (useful to add it inside the header Overlay)

function myprefix_move_topbar_to_header() {
    remove_action( 'wpex_hook_wrap_top', 'wpex_top_bar', 5 );
    add_action( 'wpex_hook_header_top', 'wpex_top_bar', 1 );
}
add_action( 'init', 'myprefix_move_topbar_to_header' );

Custom Topbar Social Link for Another Language (WPML)

add_action( 'after_setup_theme', function() {

	// Get global Customizer settings
	global $wpex_theme_mods;

	// Check if topbar facebook value is set
	if ( isset( $wpex_theme_mods['top_bar_social_profiles']['facebook'] ) ) {

		// Get current language
		$current_language = defined( 'ICL_LANGUAGE_CODE' ) ? ICL_LANGUAGE_CODE : '';

		// Update global variable to alter the value of the topbar social facebook link for this language
		if ( 'he' == $current_language ) {
			$wpex_theme_mods['top_bar_social_profiles']['facebook'] = 'HEBREW FACEBOOK PAGE';
		}

	}

}, 40 );

Add New Top Bar Social Options

add_filter( 'wpex_topbar_social_options', function( $options ) {

	// Add phone number option
	$options['phone'] = array(
		'label' => 'Phone',
		'icon_class' => 'ticon ticon-phone', // See http://fontawesome.io/icons/
	);

	// Return options
	return $options;

} );

Conditionally Alter Topbar Content

add_filter( 'wpex_top_bar_content', function( $content ) {
	if ( is_page( 'about' ) ) {
		$content = 'Custom Content'; // Return custom content for the about page
	}
	return $content;
} );

Add Rel Nofollow To Top Bar Social Links

add_filter( 'wpex_topbar_social_link_attrs', function( $attrs ) {
	$attrs['rel'] = 'nofollow';
	return $attrs;
} );

Remove Top Bar Social Links Title Attributes

add_filter( 'wpex_topbar_social_link_attrs', function( $attrs ) {
	unset( $attrs['title'] );
	return $attrs;
} );

Move Aside Content On Top Of Logo For Header Three

// Move header aside content above logo by tweaking the action hooks
function move_header_aside() {

	// Remove action
	remove_action( 'wpex_hook_header_inner', 'wpex_header_aside' );

	// Re-add with higher priority
	add_action( 'wpex_hook_header_inner', 'wpex_header_aside', 0 );
	
}
add_action( 'init', 'move_header_aside' );

Add Secondary Custom Menu Under Header

function add_custom_menu_above_main_content() { ?>

<div class="my-nav-wrapper clr">

<div class="container clr"> <!-- .center the navbar content -->

<?php
// Solution 1 add the navbar shortcode
echo do_shortcode( '[vcex_navbar menu="60"]' ); // change the menu ID

// Solution 2 using WP menu see
// @ https://codex.wordpress.org/Function_Reference/wp_nav_menu for args
$args = array();
wp_nav_menu( $args );

// Solution 3 use a menu plugin such as uberMenu
do_shortcode( '[menu_shortcode_here]' ); ?>

</div>

</div>

<?php }
add_action( 'wpex_hook_header_after', 'add_custom_menu_above_main_content' );

Hide Footer Callout For All Blog Archives & Posts

function my_hide_callout_on_blog_archives( $bool ) {
	if ( wpex_is_blog_query() || is_singular( 'post' ) ) {
		$bool = false;
	}
	return $bool;
}
add_filter( 'wpex_callout_enabled', 'my_hide_callout_on_blog_archives', 20 );

Change Post Series Archive Layout

// Change Post Series Archive Layout
function my_alter_post_series_layout( $layout ) {
   if ( is_tax( 'post_series' ) ) {
        return 'full-width';
    }
    return $layout;
}
add_filter( 'wpex_post_layout_class', 'my_alter_post_series_layout' );

Change Post Series Archive Entry Style

/**
 * Change Post Series Archive Entry Style
 * Available options: large-image-entry-style, thumbnail-entry-style, grid-entry-style
 */
function my_post_series_entry_style( $style ) {
	if ( is_tax( 'post_series' ) ) return 'grid-entry-style';
	return $style;
}
add_filter( 'wpex_blog_style', 'my_post_series_entry_style' );
add_filter( 'wpex_blog_entry_style', 'my_post_series_entry_style' );

Change Post Series Order

// Change post series order from ASC to DESC
function myprefix_post_series_query_args( $args ) {
	$args['order'] = 'DESC';
	return $args;
}
add_filter( 'wpex_post_series_query_args', 'myprefix_post_series_query_args' );

Enable Post Series For Custom Post Type

/**
 * Register series for post types
 * This function register the taxonomy so you can now start using it, however it won't
 * display the actual post series on the front-end, for that you need to use some extra code,
 * we recommend adding a new blog for your post type via the theme filters (see useful links below)
 * and in your custom blog you can use the code get_template_part( 'partials/blog/blog-single-series' )
 * or you can copy and paste the code from the file at Total/partials/blog/blog-single-series into your new
 * block for your post type so you can also modify it accordingly.
 *
 * @link http://wpexplorer-themes.com/total/snippets/add-new-portfolio-single-blocks/
 * @link http://wpexplorer-themes.com/total/snippets/cpt-single-blocks/
 * @link https://codex.wordpress.org/Function_Reference/register_taxonomy_for_object_type
 *
 */
function myprefix_register_tax_for_objects() {
	register_taxonomy_for_object_type( 'post_series', 'portfolio' );
}
add_action( 'init', 'myprefix_register_tax_for_objects' );

Automatically Display Featured Image At The Top Of Pages

function my_page_featured_image() {
if ( is_page() && has_post_thumbnail() ) {
echo '<div class="my-page-featured-image clr">'. get_the_post_thumbnail() .'</div>';
}
}
add_action( 'wpex_hook_main_top', 'my_page_featured_image', 10 );

Disable Page Header Title on ALL Pages

function my_disable_page_header( $bool ) {
	if ( is_page() ) {
		$bool = false; // this will allow meta options to work still
	}
	return $bool;
}
add_filter( 'wpex_display_page_header', 'my_disable_page_header' );

Hide Related Portfolio Heading

body .related-portfolio-posts-heading { display: none; }

Hide Related Portfolio Item Excerpt (CSS)

.related-portfolio-posts .portfolio-entry-excerpt { display: none; }

Disable Related Portfolio Item Excerpt (PHP)

function my_related_portfolio_excerpt_length( $length ) {
	if ( is_singular() ) {
		$length = '0';
	}
	return $length;
}
add_filter( 'wpex_portfolio_entry_excerpt_length', 'my_related_portfolio_excerpt_length' );

Tweak The Visual Composer Total Grid Filter Links Arguments

/**
 * Tweak the VC portfolio grid filter arguments 
 *
 * @link https://codex.wordpress.org/Function_Reference/get_terms
 */
function my_portfolio_grid_filter_args( $args ) {
    $args['order']  = 'DESC';
    return $args;
}
add_filter( 'vcex_portfolio_grid_filter_args', 'my_portfolio_grid_filter_args' );

Add Portfolio Category To Single Portfolio Post Slug

/**
 * Add portfolio category to slug by altering register_post_type args.
 * You can also do this in the editor dashboard instead
 *
 */
function my_add_portfolio_category_term_to_slug( $args ) {

    // Alter slug
    $args['rewrite']['slug'] = 'portfolio-item/%portfolio_category%';

    // Remove with front
    $args['rewrite']['with_front'] = false;

    // Return args
    return $args;

}
add_filter( 'wpex_portfolio_args', 'my_add_portfolio_category_term_to_slug' );

/**
 * Alter portfolio post type link
 * This method can be used for any post type (staff/testimonials/portfolio) if tweaked correctly.
 */
function my_alter_portfolio_link( $url, $post ) {

    // Return $url if %portfolio_category%/ not in slug or is not portfolio post type
    if ( 'portfolio' != get_post_type( $post ) || strpos( $url, '%portfolio_category%' ) === false ) {
        return $url;
    }

    // Get post terms
    $terms = wp_get_object_terms( $post->ID, 'portfolio_category' );

    // Get first term to use in front of slug
    if ( ! is_wp_error( $terms ) && ! empty( $terms ) && is_object( $terms[0] ) ) {
        $taxonomy_slug = $terms[0]->slug;
    }

    // Tweak url to turn %portfolio_category% into the first term slug
    if ( ! empty( $taxonomy_slug ) ) {
        $url = str_replace( '%portfolio_category%', $taxonomy_slug, $url );
    }

    // No terms found so simply remove %portfolio_category%
    else {
        $url = str_replace( '%portfolio_category%', '', $url );
    }

    // Return $url
    return $url;

}
add_filter( 'post_type_link', 'my_alter_portfolio_link', 10, 2 );

Add Meta Option To Portfolio Posts For Disabling Auto Media

// Add option to Portfolio items to disable media
function my_new_portfolio_meta_options( $options ) {

	// Add new setting to portfolio tab
	$options['portfolio']['settings']['wpex_post_media'] = array(
		'title'       => __( 'Post Media', 'wpex' ),
		'description' => __( 'Display media on single post?', 'wpex' ),
		'id'          => 'wpex_post_media',
		'type'        => 'select',
		'options'     => array(
			''   => __( 'Yes', 'wpex' ),
			'no' => __( 'No', 'wpex' ),
		),
	);

	// Return all options
	return $options;

}
add_filter( 'wpex_metabox_array', 'my_new_portfolio_meta_options', 40 );

// Disable portfolio post media by tweaking single blocks if disabled via custom-field
function my_portfolio_media_visibility( $blocks ) {

	// Set block vals equal to keys for ease
	$blocks = array_combine( $blocks, $blocks );

	// If wpex_post_media field is set to 'no' then remove the media
	if ( 'no' == get_post_meta( get_the_ID(), 'wpex_post_media', true ) ) {
		unset( $blocks['media'] );
	}

	// Return layout blocks
	return $blocks;

}
add_filter( 'wpex_portfolio_single_blocks', 'my_portfolio_media_visibility', 20 );

Add New “Blocks” To The Portfolio Post Layout

/**
* Example function for adding new "blocks" to the portfolio post layout manager.
*
* IMPORTANT: The module will be disabled by default, be sure to go to the Customizer
* to enable it.
*
*/
add_filter( 'wpex_portfolio_single_blocks', function( $blocks, $instance ) {

// Used for customizer setting to drag/drop the new module
if ( 'customizer' == $instance ) {
$blocks['tags'] = __( 'Tags', 'wpex' );
}

// Used for the front-end output
// Here you can define an anonymous function for the output or set the value to a function name used for the output.
else {

$blocks = array_combine( $blocks, $blocks );

// Add custom output for the tags
if ( isset( $blocks['tags'] ) ) {

$blocks['tags'] = function() {

// Get tags
$taxonomy = 'portfolio_tag';
$show_links = true;
$echo = false;
$tags = wpex_list_post_terms( $taxonomy, $show_links, $echo );

// Output tags
if ( $tags ) {
echo '<div class="my-portfolio-tags clr">' . $tags . '</div>';
}

};

}

}

// Return blocks
return $blocks;

}, 10, 2 );

Alter The Portfolio Related Posts Heading

// Alter The Portfolio Related Posts Heading
function my_portfolio_related_heading_args( $args ) {

	// Show different text for items in category "design"
	if ( has_term( 'design', 'portfolio_category' ) ) {
		$args['content'] = 'Custom heading';
	}

	// Return args
	return $args;

}
add_filter( 'wpex_heading_portfolio_related', 'my_portfolio_related_heading_args' );

Change Related Portfolio Query Arguments

// Change Related Portfolio Query Arguments
add_filter( 'wpex_related_portfolio_args', function( $args ) {

    // Remove tax_query parameter so it doesn't try and display items from the same category
    $args['tax_query'] = NULL;

    // Change orderby parameter from random to date
    $args['orderby'] = 'date';

    // Return args
    return $args;

} );

Portfolio Category Description Above Loop

function my_portfolio_category_description_above_loop( $bool ) {
	if ( is_tax( 'portfolio_category' ) ) {
		return true;
	}
	return $bool;
}
add_filter( 'wpex_has_term_description_above_loop', 'my_portfolio_category_description_above_loop' );

Add new staff social profiles

// Add new staff social profiles
add_filter( 'wpex_staff_social_array', function( $profiles ) {

	// Add instagram
	$profiles['instagram'] = array (
		'key'        => 'instagram',
		'meta'       => 'wpex_staff_instagram',
		'icon_class' => 'ticon ticon-instagram',
		'label'      => 'Instagram',
	);

	// Return profiles
	return $profiles;

} );

Add New “Blocks” To The Staff Post Layout

/**
 * Example function for adding new "blocks" to the staff post layout manager.
 *
 * After adding your new blocks simply create a new file with the name "staff-single-YOUR_KEY.php"
 * and place this file at partials/staff/ in your child theme. Make sure to replace "YOUR_KEY" with
 * the key given in the array. So as an example for the function below you will create a file
 * called single-custom-fields.php for your custom code
 *
 * IMPORTANT: This module will be disabled by default, so you will have to go to the Customizer to enable it.
 *
 */
function my_staff_post_blocks( $blocks ) {

    // Add new block "categories"
    $blocks['custom-fields'] = __( 'Custom Fields', 'wpex' );

    // Return blocks
    return $blocks;

}
add_filter( 'wpex_staff_single_blocks', 'my_staff_post_blocks' );

Staff Category Description Above Loop

function my_staff_tax_description_above_loop( $bool ) {
	if ( is_tax( 'staff_category' ) ) {
		return true;
	}
	return $bool;
}
add_filter( 'wpex_has_term_description_above_loop', 'my_staff_tax_description_above_loop' );

Enable HTML For Staff Position

function myprefix_allow_staff_position_html( $position ) {
	if ( $position ) {
		return html_entity_decode( $position );
	}
}
add_filter( 'wpex_staff_entry_position', 'myprefix_allow_staff_position_html' );

Order Related Staff by Name

// Alter the related staff posts query
function myprefix_custom_related_staff_args( $args ) {
    // Change order from random to name
    $args['orderby'] = 'title';
    // Return args
    return $args;
}
add_filter( 'wpex_related_staff_args', 'myprefix_custom_related_staff_args' );

Adding a First & Last Name Field for Staff Members

add_filter( 'wpex_metabox_array', function( $array ) {

	// Make sure staff tab exists in arrray
	if ( isset( $array['staff'] ) ) {

		// Add First name to staff
		$array['staff']['settings']['first_name'] = array(
			'title'         => __( 'First Name', 'total' ),
			'description'   => __( 'Field description', 'total' ),
			'id'            => 'wpex_first_name', // Custom field ID used to retrive via get_post_meta
			'type'          => 'text',
		);

		// Add Last name to staff
		$array['staff']['settings']['last_name'] = array(
			'title'         => __( 'Last Name', 'total' ),
			'description'   => __( 'Field description', 'total' ),
			'id'            => 'wpex_last_name', // Custom field ID used to retrive via get_post_meta
			'type'          => 'text',
		);

	}

	// Return meta array
	return $array;

}, 40 );

Remove Staff Social Options

add_filter( 'wpex_staff_social_array', function( $profiles ) {
	unset( $profiles['dribbble'] ); // Remove Dribble
	unset( $profiles['skype'] );    // Remove Skype
	return $profiles;
} );

Add Xing to Staff Social Profiles

// Add new staff social profiles
add_filter( 'wpex_staff_social_array', function( $profiles ) {
	$profiles['xing'] = array (
		'key'        => 'xing',
		'meta'       => 'wpex_staff_xing',
		'icon_class' => 'ticon ticon-xing',
		'label'      => 'Xing',
	);
	return $profiles;
}, 40 );

Remove Staff Meta Settings & Image Gallery

// Remove staff settings metabox
add_filter( 'wpex_main_metaboxes_post_types', function( $types ) {
	unset( $types['staff'] );
	return $types;
}, 40 );

// Remove staff gallery
add_filter( 'wpex_gallery_metabox_post_types', function( $types ) {
	$types = array_combine( $types, $types );
	unset( $types['staff'] );
	return $types;
}, 40 );

Display Testimonial Post Title On Single Testimonials Page Header

function my_testimonials_page_title( $title ) {
    if ( is_singular( 'testimonials' ) ) {
        $title = get_the_title();
    }
    return $title;
}
add_filter( 'wpex_title', 'my_testimonials_page_title', 40 );

Add A Single Testimonial Shortcode

// Add a single testimonial shortcode
// Usage: [single_testimonial id="128"]
function myprefix_single_testimonial_shortcode( $atts ) {
	ob_start();
	extract( shortcode_atts( array(
		'id' => '',
	), $atts, 'single_testimonial' ) );
	if ( $id ) {
		$wpex_query = new WP_Query( array(
			'post_type'     => 'testimonials',
			'post__in'      => array( $id ),
			'no_found_rows' => true,
		) );
		if ( $wpex_query->have_posts() ) :
			while ( $wpex_query->have_posts() ) : $wpex_query->the_post();
			if ( $template = locate_template( 'partials/testimonials/testimonials-entry.php', false ) ) {
				include( $template );
			}
			endwhile;
		endif;
		wp_reset_postdata();
	}
	return ob_get_clean();
}
add_shortcode( 'single_testimonial', 'myprefix_single_testimonial_shortcode' );

Display Read More link for Testimonials with Custom Excerpts

add_filter( 'wpex_excerpt_output', function( $excerpt ) {

global $post;

if ( $post && 'testimonials' == $post->post_type && $post->post_excerpt ) {

$readmore = '<a href="'. get_permalink( $post->ID ) .'" title="Read More" rel="bookmark">read more <span class="wpex-readmore-rarr">→</span></a>';

return $post->post_excerpt .' '. $readmore;

}

return $excerpt;

} );

Enable the “Media” Post Settings For Custom Post Types

// Enable the "Media" post settings tab for custom post types
function my_add_meta_media_to_my_custom_type( $array ) {
    $array['media']['post_type'][] = 'my_custom_type';
    return $array;
}
add_filter( 'wpex_metabox_array', 'my_add_meta_media_to_my_custom_type', 40 );

Alter Meta Sections (date, comments, author, etc) For Custom Post Types

// Alter the meta sections array via the "wpex_meta_sections" filter
// For the blog use the 'wpex_blog_entry_meta_sections' or 'wpex_blog_single_meta_sections' instead
add_filter( 'wpex_meta_blocks', function( $sections ) {

	// Your meta sections array ( you can move them around or remove some )
	// This is the default array you could also just use unset to remove any
	$sections = array( 'date', 'author', 'categories', 'comments' );

	// Example of a meta section with a custom output
	$sections['my_custom_block'] = function() {
		echo 'my custom content';
	};
	
	// Return sections
	return $sections;

} );

Enable Social Sharing On Custom Post Types

// Enable Social Sharing On Custom Post Types
add_filter( 'wpex_has_social_share', function( $bool ) {
	if ( is_singular( 'YOUR_POST_TYPE_NAME' ) ) {
		$bool = true;
	}
	return $bool;
}, 40 );

Add Overlay To Custom Post Type Entry

/**
 * Example function for altering your entry overlay style for custom post types
 * outside the scope of the theme.
 *
 * Available options: see Total/framework/overlays.php wpex_overlay_styles_array()
 *
 * @since 3.2.0
 * @return string
 */
function myprefix_edd_entry_overlay() {
	return 'title-push-up'; // Alter overlay for Easy Digital Downloads entry
}
add_filter( 'wpex_download_entry_overlay_style', 'myprefix_edd_entry_overlay' );

Add/Remove “Blocks” (Sections) From Custom Post Type Posts

/**
 * Any custom post type post layout can be altered via the wpex_{post_type}_single_blocks filter
 * which returns an array of the "blocks" or parts for the layout
 * that will be loaded from partials/cpt/cpt-single-{block}.php
 *
 * Default array: array( 'media', 'title', 'meta', 'content', 'page-links', 'share', 'comments' );
 *
 * You can use the filter to add, remove or re-order elements in the array as you wish.
 * Below is an example showing how to add a new block for a custom post type and remove one.
 *
 * After adding your new blocks simply create a new file with the name "cpt-single-YOUR_KEY.php"
 * and place this file at partials/cpt/ in your child theme.
 *
 * IMPORTANT: Make sure to change {post_type} with your post type name
 * IMPORTANT: Make sure to replace "YOUR_KEY" with the key given in the array (advertisement is the key for the block added below)
 *
 */
add_filter( 'wpex_{post_type}_single_blocks', function( $blocks ) {

    // Option 1: Add new block "advertisement" and create your cpt-single-advertisement.php file to add to your child theme
    $blocks['advertisement'] = __( 'My Advertisement', 'total' );

    // Option 2: Total 4.0+ only
    // Add new blocks with custom function output
    // Below is an example with an anonymous function but you can use custom functions as well ;)
    $blocks['custom_block'] = function() {

        echo 'my custom block';

    };

    // Remove the featured image from this post type
    unset( $blocks['media'] );

    // Return blocks
    return $blocks;

} );

Add/Remove “Blocks” (Sections) From Custom Post Type Entries

/**
 * Any custom post type post entry can be altered via the wpex_{post_type}_entry_blocks filter
 * which returns an array of the "blocks" or parts for the layout
 * that will be loaded from partials/cpt/cpt-entry-{block}.php
 *
 * Default array: array( 'media', 'title', 'meta', 'content', 'readmore' );
 *
 * You can use the filter to add, remove or re-order elements in the array as you wish.
 * Below is an example showing how to add a new block for a custom post type and remove one.
 *
 * After adding new blocks simply create a new file with the name "cpt-entry-YOUR_KEY.php"
 * and place this file at partials/cpt/ in your child theme.
 *
 * IMPORTANT: Make sure to change {post_type} with your post type name
 * IMPORTANT: Make sure to replace "YOUR_KEY" with the key given in the array (advertisement is the key for the block added below)
 *
 */
function myprefix_cpt_entry_blocks( $blocks ) {

    // Example 1 - Add new block "advertisement" ( requires template part for output )
    $blocks['advertisement'] = __( 'My Advertisement', 'total' );

    // Example 2 - Added in Total 4.0+
    // Add new blocks with custom function output
    // Below is an example with an anonymous function but you can use custom functions as well ;)
    $blocks['custom_block'] = function() {

    	echo 'my custom block';

    };

    // Return blocks
    return $blocks;

}
add_filter( 'wpex_{post_type}_entry_blocks', 'myprefix_cpt_entry_blocks' );

Custom Post Type Post Thumbnail Arguments (size, alt, schema, style, etc)

/**
 * Alter custom post type thumbnail arguments
 * @see framework/core-functions wpex_get_post_thumbnail() function for a list of all available arguments
 *
 * IMPORTANT: Don't forget to change where it says "YOUR_POST_TYPE_NAME" to your post type name
 */
function my_prefix_cpt_post_thumbnail_arguments( $args ) {
	return array(
		'size'          => 'full',
		'width'         => '900',
		'height'        => '400',
		'crop'          => 'center-center',
		'alt'           => wpex_get_esc_title(),
		'schema_markup' => true,
	);

}
add_filter( 'wpex_YOUR_POST_TYPE_NAME_entry_thumbnail_args', 'my_prefix_cpt_post_thumbnail_arguments' );

Enable The Image Gallery For Custom Post Types

add_filter( 'wpex_gallery_metabox_post_types', function( $types ) {
	$types[] = 'your_post_type';
	return $types;
} );

Easy Custom Post Type Entry Override

function myprefix_custom_template_parts( $parts ) {

	// Override the output for your 'books' post type
	// Now you can simply create a book-entry.php file in your child theme
	// and whatever you place there will display for the entry
	if ( 'books' == get_post_type() ) {
		$parts['cpt_entry'] = 'book-entry';
	}

	// Return parts
	return $parts;

}
add_filter( 'wpex_template_parts', 'myprefix_custom_template_parts' );

Related Items for Custom Post Type

// There isn't any built-in function for related items but you can easily add your own section with some code like this
// IMPORTANT => change "book" to your post type name
// IMPORTANT => change myprefix to your custom prefix for styling purposes
// IMPORTANT => this will add related to the bottom of your post
// if you don't want it there you can change the order of your "blocks" array or you can instead
// hook the output into a different theme hook http://wpexplorer-themes.com/total/docs/action-hooks/
add_filter( 'wpex_book_single_blocks', function( $blocks ) {
$blocks['related'] = function() {

// Query posts
$related = new WP_Query( array(
'post_type' => 'book',
'posts_per_page' => 3,
'no_found_rows' => true,
'post__not_in' => array( get_the_ID() ),
) );

if ( $related->have_posts() ) : ?>

<div class="myprefix-related-posts wpex-row clr">

<?php
// Columns number
$columns = 3;

// Define counter variable
$count = 0;

// Your loop
while ( $related->have_posts() ) : $related->the_post();

// Add to counter
$count++; ?>

<div class="myprefix-related-entry col span_1_of_<?php echo $columns; ?> col-<?php echo $count; ?> clr">
<a href="<?php wpex_permalink(); ?>" title="<?php wpex_esc_title(); ?>">
<?php wpex_post_thumbnail( array(
'width' => 500,
'height' => 300,
) ); ?>
</a>
<h2><a href="<?php wpex_permalink(); ?>" title="<?php wpex_esc_title(); ?>"><?php the_title(); ?></a></h2>
<?php wpex_excerpt( array(
'length' => 20,
) ); ?>
</div>

<?php
// Reset counter
if ( $count == $columns ) {
$count = 0;
}

endwhile; ?>

</div>

<?php endif; wp_reset_postdata(); ?>

<?php };
return $blocks;
}, 40 );
How To Remove Script Version Numbers
function wpex_remove_script_version( $src ) {
	if ( strpos( $src, 'ver=' ) ) {
		$src = remove_query_arg( 'ver', $src );
	}
	return $src;
}
add_filter( 'script_loader_src', 'wpex_remove_script_version', 15, 1 );
add_filter( 'style_loader_src', 'wpex_remove_script_version', 15, 1 );
Custom Google Font Lists
function myprefix_google_fonts( $array ) {
    return array( 'Open Sans', 'Roboto', 'Source Sans Pro' );
}
add_filter( 'wpex_google_fonts_array', 'myprefix_google_fonts' );
Add Version Number to Child Theme to Prevent Browser Cache
add_action( 'wp_enqueue_scripts', function() {
if ( ! defined( 'WPEX_THEME_STYLE_HANDLE' ) ) {
	return;
}

// First de-register the main child theme stylesheet
wp_deregister_style( WPEX_THEME_STYLE_HANDLE );

// Then add it again, using filemtime for the version number so everytime the child theme changes so will the version number
wp_register_style( WPEX_THEME_STYLE_HANDLE, get_stylesheet_uri(), array(), filemtime( get_stylesheet_directory() . '/style.css' ) );

// Finally enqueue it again
wp_enqueue_style( WPEX_THEME_STYLE_HANDLE );

} );


Place An Advertisement Under Your Header/Menu

/**
* Place An Advertisement Under Your Header
* Use conditionals to show/hide accordingly
*
* @link https://codex.wordpress.org/Conditional_Tags
*
*/
function add_banner_after_header() { ?>
<div class="my-header-ad clr">
<div class="container clr"> <!-- .center the content -->
YOUR ADVERTISEMENT CODE HERE
</div><!-- .container -->
</div><!-- .my-header-ad -->
<?php }
add_action( 'wpex_hook_header_after', 'add_banner_after_header' );

Alter Editor Shortcodes Insert Button Default Value

add_filter( 'wpex_shortcodes_tinymce_json', function( $data ) {

	// Alter the default insert code for the button shortcode
	$data['shortcodes']['vcex_button']['insert'] = '[vcex_button url="http://www.google.com/" title="Visit Site" style="graphical" align="left" color="black" size="small" target="self" rel="none"]Button Text[/vcex_button]';

	// Return data
	return $data;

}, 40 );

Get & Display Term Thumbnail

if ( $thumb_id = wpex_get_term_thumbnail_id() ) {
	
	$image = wpex_get_post_thumbnail( array(
		'attachment'    => $thumb_id,
		'width'         => '',              // Int: Custom image width
		'height'        => '',              // Int: Custom image height
		'crop'          => 'center-center', // Str: Crop location
		'alt'           => '',              // Str: Custom alt tag for image
		'class'         => '',              // Str: Add custom classes
		'return'        => 'html',          // Str: Return html or src
	) );

	echo $image;

}

Disable WordPress SEO by Yoast Page Analysis

// Disable WordPress SEO by Yoast Page Analysis which seems to cause issues with the Visual Composer
function disable_wpseo_use_page_analysis() {
	return false;
}
add_filter( 'wpseo_use_page_analysis', 'disable_wpseo_use_page_analysis' );

Re-Order Social Sharing Sites

// Re-Order Social Sharing Sites
function my_wpex_social_share_sites( $sites ) {

	// Define the sites in your own order
	$sites = array( 'twitter', 'facebook', 'google_plus', 'pinterest', 'linkedin' );

	// Return sites
	return $sites;

}
add_filter( 'wpex_social_share_sites', 'my_wpex_social_share_sites' );

Change The Theme Heading Border Color

body .theme-heading span.text:after {
    border-color: #000;
}

Better RSS Feeds (Removes Shortcodes & Displays Thumbnail)

// IMPORTANT: Use this function to clear your RSS cache so you can see your changes, then REMOVE it
function prefix_set_feed_cache_time( $seconds ) {
	return 0;
}
add_filter( 'wp_feed_cache_transient_lifetime' , 'prefix_set_feed_cache_time' );

// Custom RSS feed
function my_custom_rss_feed( $content ) {

	// Get post
	global $post;

	// Generate 50 word excerpt using the Total wpex_excerpt function
	// This will strip out shortcodes from the Visual Composer
	$content = wpex_get_excerpt( array(
		'length' => 50,
		'more'   => false // remove hellip
	) );

	// Display post thumbnail if defined
	if ( has_post_thumbnail( $post->ID ) ){
		$content = get_the_post_thumbnail( $post->ID, 'full', array( 'style' => 'float:left; margin:0 15px 15px 0;' ) ) . $content;
	}

	// Return the content
	return $content;

}
add_filter( 'the_excerpt_rss', 'my_custom_rss_feed', 999 );
add_filter( 'the_content_feed', 'my_custom_rss_feed', 999 );

Add “nocookie” To WordPress oEmbeded Youtube Videos

// Add "nocookie" To WordPress oEmbeded Youtube Videos
function wpex_youtube_nocookie_oembed( $return ) {
	$return = str_replace( 'youtube', 'youtube-nocookie', $return );
	return $return;
}
add_filter( 'oembed_dataparse', 'wpex_youtube_nocookie_oembed' );

Alter The Image Width In The 1 Column Left Image & Right Content Grid

/* edit globally (can also be added in the VC custom CSS to target a specific page only) */
body .entries.left-thumbs .entry .entry-media { width: 20% }
body .entries.left-thumbs .entry .entry-details { width: 76% }

/* target specific grid */
.my-custom-class .entries.left-thumbs .entry .entry-media { width: 20% }
.my-custom-class .entry .entry-details { width: 76% }

Remove Text On Post Social Share Icons

body .wpex-social-share .wpex-label { display: none; }

TagCloud With Different Font Sizes

add_filter( 'widget_tag_cloud_args', function( $args ) {
	$args['largest']  = '0.923'; // add your custom largest size here
	$args['smallest'] = '0.923'; // Add your custom smallest size here
	$args['unit']     = 'em';    // You can choose between em or px values
	return $args;
}, 40 );

Disable URL Hash Update For Local Scroll Links

/**
 * Disable hash update when clicking local scroll links
 *
 * @link 1.6.0
 *
 */
function myprefix_disable_local_scroll_hash_update( $array ) {
	$array['localScrollUpdateHash'] = false;
	return $array;
}
add_filter( 'wpex_localize_array', 'myprefix_disable_local_scroll_hash_update' );

Make Page Content Background Transparent for Boxed Layout

/* Option 1 => Using Opacity */
.boxed-main-layout #wrap {
    opacity: 0.8;
}

/* Option 2 => Using RGBA Colors */
.boxed-main-layout #wrap {
    background: rgba(255,255,255,0.5);
}

.wpex-sticky-header-holder {
    background: none;
}

.page-header,
#footer-callout-wrap {
    background: rgba(255,255,255,0.5);
}

.site-footer {
    background: rgba(000,000,000,0.7);
}

#footer-bottom {
    background: rgba(000,000,000,0.5);
}