Short code template + ajax

时间:2021-04-15 作者:Marcos Felipe Donadeli Gonalez

我正在使用Ajax在Wordpress中创建一个简单的页面。为此,我创建了一个包含短代码的模板页面。

但问题是我真的不能在那个页面上做ajax工作,我在互联网上搜索类似的东西,但我一直只看到与插件相关的东西,而不是单个页面。

有人知道为什么这个代码不起作用吗?

代码位于/wp-content/themes/<;主题名称(&U)/rede模板。php

<?php /* Template Name: rede-template */ ?>
<?php get_header(); ?>
<?php
//require_once(get_template_directory() . \'/includes/shortcodes/rede-page.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();
}

function rede_page_function() 
{
    $form = "<button id=\'mybutton\'>Click Here</button>";

    echo $form;
}

add_shortcode(\'rede-page\', \'rede_page_function\');

echo do_shortcode(\'[rede-page]\')
?>
<script>
jQuery(\'#mybutton\').click(function(e){
    e.preventDefault();

    var data = {action: "ajax_action"};

    jQuery.post("<?php echo admin_url( \'admin-ajax.php\' ); ?>", data, function(response){
        console.log(response);
        return false;   
    });
});
</script>
<?php
get_footer(); 
错误为“;发布https://localhost/planoamap/wp-admin/admin-ajax.php400(错误请求)“”;

1 个回复
最合适的回答,由SO网友:Antti Koskinen 整理而成

正如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();

相关推荐

如何用PHP8设置符合WordPress编码标准的phpc?

正在尝试设置PHP_CodeSniffer 使用WordPress Codings Standards. 我在跑步PHP v8.0.3 和phpcs v3.5.8. (2021 3月)。WPCS通过以下方式安装:git clone -b master https://github.com/WordPress/WordPress-Coding-Standards.git wpcs 安装工作正常,但运行phpcs会导致此错误:phpcs: Uncaught TypeError: vsprintf()