Я хотел бы запускать шорткоды с помощью кнопки переключения. Если переключатель включен, я вызываю шорткод, а если он выключен, я вызываю другой.
В качестве теста я попытался вызвать шорткод при нажатии на одну ссылку с AJAX, это дает мне следующее:
Файл «page-recherche.php»:
<a href="" id="clicklien">CLICK HERE</a><script>
$("#clicklien").click(function(e){
e.preventDefault();
$.ajax({
url: 'http://www.capitainebar.com/wp-content/themes/Capitaine-Bar/shortcode-recherche.php',
success: function (data) {
// this is executed when ajax call finished well
console.log('content of the executed page: ' + data);
$('body').append(data);
},
error: function (xhr, status, error) {
// executed if something went wrong during call
if (xhr.status > 0) alert('got error: ' + status); // status 0 - when load is interrupted
}
});
});
</script
Файл называется «shortcode-recherche.php»:
<?php echo do_shortcode( '[search-form id="1" showall="1"]' ); ?>
Результатом является фатальная ошибка. Как будто код выполнялся в «shortcode-recherche.php», а не в «page-recherche.php».
Обратите внимание, что шорткод работает нормально, если я пишу его прямо на мою страницу, без вызова AJAX.
Ты можешь видеть результат здесь
Когда вы вызываете файл PHP напрямую, WordPress не участвует. Это означает, что функционирует как do_shortcode()
даже не существует.
Вместо этого вам нужно запросить файл, перехваченный WordPress (даже если обычно 404). Затем сообщите своему плагину URL. Вы можете сделать это с помощью переменных запроса (легко) или переписать правила (сложно, красиво). Например:
Переменная запроса: example.org/?custom_shortcode=gallery
Переписать правило: example.org/custom_shortcode/gallery/
Какой бы вариант вы ни выбрали, ваш плагин должен знать, когда вы обращаетесь к этому URL и перехватываете его. Когда вы закончите, вам нужно выйти из скрипта, чтобы WordPress не пытался показать страницу 404.
Вот пример, который вы можете просто вставить в файл functions.php.
function shortcode_test() {
if ( !empty($_REQUEST['shortcode']) ) {
// Try and sanitize your shortcode to prevent possible exploits. Users typically can't call shortcodes directly.
$shortcode_name = esc_attr($_REQUEST['shortcode']);
// Wrap the shortcode in tags. You might also want to add arguments here.
$full_shortcode = sprintf('[%s]', $shortcode_name);
// Perform the shortcode
echo do_shortcode( $full_shortcode );
// Stop the script before WordPress tries to display a template file.
exit;
}
}
add_action('init', 'shortcode_test');
Вы можете проверить это, посетив ваш сайт с этим, добавленным в конце URL:
?shortcode=gallery
Это должно отобразить шорткод галереи, развернутый как HTML. Как только это сработает, просто привяжите его к существующей функции AJAX.
Других решений пока нет …