Поиск по сайту:

Как избежать конфликтов шорткодов тем и плагинов


Мы все сталкивались с этим: вы покупаете премиальную тему, которая действительно великолепна, а также потрясающий плагин (например, один из моих!), но объединить тему и плагин совершенно не работает. Ну и что? Есть ли в плагине или теме ошибки?

Большую часть времени это происходит, когда вы используете шорткоды. Предположим, вы только что купили плагин для обработки «отзывов». Вы внимательно прочитали документацию и знаете, что для отображения отзывов вам необходимо включить следующий короткий код [testimonials]. Но когда вы это сделаете, ничего не появится.

Причина, по которой шорткод не заменяется отзывами, заключается в том, что ваша тема И плагин определяют один и тот же шорткод.

Поскольку файлы плагинов загружаются раньше файлов тем, они перезаписываются и в этом случае не полностью учитываются.

Вот почему я хотел показать вам простой способ отменить регистрацию шорткода темы и заменить его кодом плагина.

Шаг 1. Создайте простой плагин

Нам нужно создать простой плагин:

<?php
/*
Plugin Name: Avoid Shortcodes conflicts
Plugin URL: http://remicorson.com
Description: A little plugin to avoid conflicts bewteen shortcodes
Version: 1.0
Author: Remi Corson
Author URI: http://remicorson.com
Contributors: corsonr
Text Domain: rc_asc
Domain Path: languages
*/

Шаг 2. Проверьте, существует ли короткий код

Это самый важный шаг. Здесь вы проверяете наличие короткого кода. В WordPress есть глобальная переменная «$shortcode_tags», в которой хранится список всех зарегистрированных шорткодов. Итак, нам просто нужно просмотреть эту переменную и проверить, входит ли в нее шорткод, который мы ищем.

/**
 * Check if a shortcode is already registered
 *
 * @since 1.0
 *
 * @param $shortcode string The shortcode slug to test
 *
 * @return void
 */
function rc_asc_shortcode_exists( $shortcode = false ) {
	
	global $shortcode_tags;

	//echo '<pre>'; var_dump($shortcode_tags); echo '</pre>';
 
	if ( ! $shortcode )
		return false;
 
	if ( array_key_exists( $shortcode, $shortcode_tags ) )
		return true;
 
	return false;

}

Это общая функция, которую мы будем использовать в более конкретной функции, включая искомый фрагмент короткого кода. Эта функция возвращает TRUE, если короткий код существует, или FALSE, если его нет.

Шаг 3. Удалите короткий код и зарегистрируйте новый

Следующая функция использует только что созданный rc_asc_shortcode_exists(). Он просто проверяет наличие короткого кода, заменяет его, если он существует, или добавляет короткий код, если он еще не зарегистрирован.

/**
 * Check if a shortcode is already registered and replace it
 *
 * @since 1.0
 *
 * @return void
 */
function rc_asc_replace_shortcode() {

	$shortcode = 'testimonials';
	
	if( rc_asc_shortcode_exists( $shortcode ) ) {
		remove_shortcode( $shortcode );
		add_shortcode( $shortcode, 'my_testimonials_function' );
	} else {
		add_shortcode( $shortcode, 'my_testimonials_function' );
	}
}

Шаг 4. Определите новую функцию короткого кода

Все, что вам нужно сделать, это определить содержимое функции «my_testimonials_shortcode()», и все готово!

/**
 * Creates the new shortcode
 *
 * @since 1.0
 *
 * @return void
 */
function my_testimonials_function() {

	return 'this replaces the previous shortcode!';
}

Как вы можете видеть, ранее объявленный шорткод теперь заменен правильным шорткодом.