为什么我不能通过AJAX获取自定义字段值或帖子ID?

时间:2018-09-21 作者:arabtornado

我编写了一个基于访问者位置生成链接的代码,它工作得很好,但我发现生成的代码会被缓存,因为我使用的是全页缓存,所以我认为为了解决这个问题,我可以使用ajax加载该链接。我使用了下面的代码,这些代码在获取一些我需要的变量时非常有效,例如位置变量和链接域变量等。。但是,我无法获取WooCommerce自定义字段数据,甚至无法获取产品id,它只返回空白。

我使用这段代码来获取自定义字段,该字段在函数中直接使用时效果很好,但在ajax中无法正常工作

$uk_asin = get_post_meta(get_post()->ID, "wccaf_uk_asin", true );
我在函数中使用了该代码。php

add_action( \'woocommerce_before_add_to_cart_button\', \'affiliate_link_ajax\', 11);
function affiliate_link_ajax() {    
?>
<script>
jQuery(document).ready(function(){

             jQuery.ajax({
                url: "<?php echo admin_url(\'admin-ajax.php\'); ?>",
                type: \'POST\',
                data: {
                action: \'getmyfunctionform1\'
                },
                dataType: \'html\',
                success: function(response) {

                jQuery("#myResultsform1").html(response);

                }

        }); 
    });
</script> 
<!-- end Ajax call to getmyfunctionform1 smc 11-22-2013 -->

<div id="myResultsform1"></div>
<?php
}
这是功能代码。还有php

// Ajax Function to Load PHP Function myfunctionform1 smc 11/22/2013

add_action(\'wp_ajax_getmyfunctionform1\', \'myfunctionform1\');
add_action(\'wp_ajax_nopriv_getmyfunctionform1\', \'myfunctionform1\');

function myfunctionform1() { 

// Whatever php and or html you want outputed by the ajax call in template file

die(); } // important must use

// end Ajax Function to Load PHP Function myfunctionform1 smc 11/22/2013
如果答案很简单,我会非常感激,因为我对编码还是很陌生

1 个回复
SO网友:Tom J Nowell

因为它们是两个不同的请求,而post不会从初始加载延续到AJAX请求。页面加载之间不会记住任何内容,并且一旦生成页面,服务器上就不会存在任何内容。每次都是一目了然,为什么它会记住post变量呢?

当您请求页面时,WP创建了一个post循环和一个主查询,并调用the_post 建立了现在的职位。这就是它第一次起作用的原因。

但当您提出AJAX请求时,这些都没有,毕竟它怎么知道?每个请求都是孤立的,都有自己的东西。它没有URL来从中提取查询变量并执行查询/模板,事实上,在管理AJAX请求中没有post查询,除非您自己执行查询

因此,AJAX请求需要post ID,但它没有该信息,so send it!

        data: {
            action: \'getmyfunctionform1\',
            post_id: <?php echo get_the_ID();?>
        },
你现在可以$_POST[\'post_id\']

一些进一步的注意事项是安全性这是不安全的:

            success: function(response) {

            jQuery("#myResultsform1").html(response);

            }
特别是如果您没有使用SSL,任何人都可以拦截并将任何内容插入页面。相反,它应该返回数据,而不是HTML,然后使用这些数据在JS中构建HTML。

命名

myfunctionform1 没有告诉我们这到底是怎么回事,也许更好的名字应该是wccaf_uk_affiliate_link_ajax_handler?

RESTAPI管理AJAX很旧,当它不工作时会很痛苦,是一个完全没有线索的黑盒子。

为什么不使用更简单的RESTAPI呢?

注册端点,例如。example.com/wp-json/arabtornado/v1/affiliate_link

add_action( \'rest_api_init\', function () {
        register_rest_route( \'arabtornado/v1\', \'/affiliate_link/\', array(
                \'methods\' => \'GET\',
                \'callback\' => \'arabtornado_generate_link\'
        ) );
} );
注意回调arabtornado_generate_link, 这就是做这项工作的功能:

function arabtornado_generate_link( $request ) {
    $post_id = $request[\'post_id\'];
    // etc.. generate response
    $result = "https://example.com/affiliate";
    return $result;
}
嘿,普雷斯托:

var url = \'https://example.com/wp-json/arabtornada/v1/affiliate_link?post_id=1\';
jQuery.get( url ).done( function( data ) {
    jQuery("#myResultsform1").text( data );
}).fail( function() {
    jQuery(\'#myResultsform1\').text("couldn\'t contact server");
});
如果不起作用,它只会告诉您响应中的问题所在,因此请查看浏览器开发工具中的网络面板

结束

相关推荐

Read array in php?

我正在尝试在注册中添加一些自定义用户元。例如,我有一块地可以结水果:function some_fruits($fruit= false) { $fruits= array(); $fruits[\'1\'] = \'Apple\'; $fruits[\'2\'] = \'Banana\'; $fruits[\'3\'] = \'Apricot\'; if ($fruit) { return $frui