正如TomJ Nowell在评论中指出的那样,您的设置有点不稳定,这就是它无法工作的原因。您需要提前添加ajax操作并注册短代码,即在自定义插件或主题函数中。php。这与WordPress处理请求的方式以及加载和执行操作的顺序有关action reference on Codex 这说明了一些问题。
例如,您可以按照以下方式构造主题,将代码拆分为更多可管理的部分。我发现在编写代码时更容易记住和理解您的想法,因为它是较小的片段,而不是将所有内容都放在一个长文件中。
// theme structure
your-theme
style.css
index.php
rede-template.php
functions.php
/assets
scripts.js
/inc
shortcodes.php
ajax.php
如果这样设置主题,则需要在函数的子目录中要求/包括部分文件。php文件。作为个人偏好,我将脚本放在一个单独的js文件中,然后在wp\\u enqueue\\u scripts操作中排队-这也可以在函数中完成。php。
// functions.php
<?php
// include theme files
add_action(\'after_setup_theme\', \'your_theme_files\', 1);
function your_theme_files() {
$path = get_template_directory();
require_once $path . \'/inc/shortcodes.php\';
require_once $path . \'/inc/ajax.php\';
}
// load assets
add_action(\'wp_enqueue_scripts\', \'your_theme_assets\');
function your_theme_assets() {
$url = get_template_directory_uri();
// enqueue scripts
wp_enqueue_script( \'your-theme\', $url . \'/assets/scripts.js\', array(\'jquery\'), \'1.0.0\', true );
// localize admin ajax url to be used in script
wp_localize_script(
\'your-theme\',
\'yourTheme\',
array(
\'ajaxUrl\' => admin_url( \'admin-ajax.php\' )
)
);
}
然后只需在各自的文件中添加ajax操作、短代码注册和脚本。
// inc/ajax.php
<?php
add_action(\'wp_ajax_ajax_action\', \'handle_ajax_request\');
add_action(\'wp_ajax_nopriv_ajax_action\', \'handle_ajax_request\');
function handle_ajax_request(){
echo "oi";
wp_die();
// you could also use wp_send_json(),
// wp_send_json_error(),
// or wp_send_json_success() here
}
// inc/shortcodes.php
<?php
add_shortcode(\'rede-page\', \'rede_page_function\');
function rede_page_function($atts, $content = null) {
$output = \'<div>some html</div>\';
// shortcode should return, not echo, its output
return $output;
}
如果需要添加其他ajax函数或短代码,只需将它们的代码与第一个文件一起放在上面的文件中即可。
// assets/scripts.js
jQuery(\'#mybutton\').click(function(e){
e.preventDefault();
var data = {action: "ajax_action"};
// get admin ajax url from the localized variable
jQuery.post(yourTheme.ajaxUrl, data, function(response){
console.log(response);
return false;
});
});
脚本也是如此,将所需的其他javascript/jquery添加到相同的脚本文件中。(
如果你真的想玩得开心,可以使用gulp、webpack等从部分脚本文件构建排队脚本文件,即将所有脚本合并到一个文件中,通过Babel运行它们,并缩小文件大小。)
此外,您可以考虑将所需的html元素直接添加到页面模板中,而不是从短代码中获取。或者直接在模板上调用shortcode回调。或者添加循环,让用户使用编辑器向页面添加短代码和他们想要的任何内容。
// rede-template.php
<?php
/* Template Name: rede-template */
get_header();
?>
<div id="some-wrapper">
<button id="myButton">Add button directly to the template</button>
<?php
// or with the shortcode callback
// do_shortcode not strictly required here
$args = array(
// \'some\' => \'parameter\',
);
echo rede_page_function($args);
// or use the Loop and let the user add shortcodes to the page content
while ( have_posts() ) {
the_post();
// the_content takes care of rendering shortcodes
the_content();
}
?>
</div>
<?php get_footer();