テーマとプラグインのショートコードの競合を回避する方法
誰もがこれを経験したことがあります。本当に素晴らしいプレミアム テーマを購入し、素晴らしいプラグイン (たとえば、私のものです!) も購入しましたが、テーマとプラグインを組み合わせてもまったく機能しません。だから何?プラグインやテーマにバグがあるのでしょうか?
ほとんどの場合、これが発生するのはショートコードを使用しているときです。 「お客様の声」を処理するためのプラグインを購入したところだと想像してください。ドキュメントを注意深く読むと、お客様の声を表示するには、次のショートコード [お客様の声] を含める必要があることがわかります。しかし、そうしても何も表示されません。
ショートコードが紹介文に置き換えられない理由は、テーマとプラグインがまったく同じショートコードを定義しているためです。
プラグイン ファイルはテーマ ファイルの前にロードされるため、プラグイン ファイルは上書きされ、この場合完全には考慮されません。
だからこそ、テーマのショートコードを登録解除し、プラグインのショートコードに置き換える簡単な方法を紹介したいと思いました。
ステップ 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!';
}
ご覧のとおり、以前に宣言されたショートコードが正しいショートコードに置き換えられました。