Wordpress:使用Ajax将数据传递到页面

时间:2016-06-01 11:02:46

标签: php ajax wordpress

我正在尝试将数据从ajax调用传递到Wordpress的特定页面 以下是我正在使用的代码:

//----------Annotation --------------

iTextSharp.text.Rectangle rect_txt = rect;

rect_txt.Bottom = rect_txt.Top - 2;
rect_txt.Top = rect_txt.Top + 8;
rect_txt.Right = rect_txt.Right - ((rect_txt.Width) - Convert.ToInt32(text_num.ToString().Length) * 5);
rect_txt.Left = rect_txt.Left - 3.0f;

BaseFont helv = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
appearance = PdfAppearance.CreateAppearance(stamper.Writer, rect_txt.Width, rect_txt.Height);
appearance.Rectangle(0, 0, rect_txt.Width, rect_txt.Height);
appearance.SetFontAndSize(helv, 12);
appearance.SetColorFill(BaseColor.RED);
ColumnText.ShowTextAligned(appearance, Element.ALIGN_LEFT, new Phrase(text_num), 0, 0, 0);
//appearance.FillStroke(); 
//   appearance.ShowTextAligned(Element.ALIGN_LEFT, text_num.ToString(), 0, 0, 0);

PdfAnnotation comment = PdfAnnotation.CreateFreeText(stamper.Writer, rect_txt, text_num.ToString(), cb);
comment.PlaceInPage = x;
comment.Put(PdfName.RC, new PdfString("<?xml version=\"1.0\"?><body xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:xfa=\"http://www.xfa.org/schema/xfa-data/1.0/\" xfa:APIVersion=\"Acrobat:11.0.13\" xfa:spec=\"2.0.2\" style=\"font-size:10px;text-align:left;color:#FF0000;font-weight:bold;font-style:normal;font-family:'helvetica';font-stretch:normal\"><p dir=\"ltr\"><span style=\"font-family:helvetica\">" + text_num.ToString() + "</span></p></body>", PdfObject.TEXT_UNICODE));
comment.BorderStyle = new iTextSharp.text.pdf.PdfBorderDictionary(0, 0);
comment.SetAppearance(PdfAnnotation.APPEARANCE_NORMAL, appearance);
stamper.AddAnnotation(comment, x);

该脚本不适用于WP。我还使用控制台检查了页面,我收到一个错误:

  

single-member-page.php“未找到

我是WP的新手,我不知道如何将数据从ajax调用传递到特定页面。

3 个答案:

答案 0 :(得分:3)

@Daniel

你提出了一个非常好的问题,在继续解决之前我们需要了解wordpress ajax的拇指规则。

Thumb Rules:

  1. 根据wordpress标准,所有ajax请求都应该来到&#34; ajaxurl&#34;在javascript中。它实际上包含&#34; wp-admin / admin-ajax.php &#34;文件路径。

    示例:

    $.ajax({
        url: ajaxurl,
        data: {'action':'generateCptApiKey'},
        success:function(data) {
            console.log(data);
        },
        error: function(errorThrown){
            console.log(errorThrown);
        }
    });
    
  2. 如果您在 wp-admin信息中心部分中进行了一些sutff,或者与wp-admin部分相关,例如在wp-admin信息中心区域中创建选项页面,那么& #34; ajaxurl&#34;全局变量将始终在javascript中可用。

    如果从前端页面/帖子初始化此ajax请求的情况,则必须使用以下方法指定 admin-ajax.php 文件路径,如果您更好将其本地化为前端javascript,因此它将在javascript变量中提供,就像在wp-admin仪表板部分中可用一样。

    为了实现这一目标,我们需要添加更多行代码。

    方法:

    更新了示例代码前端ajax调用:

    // Register the script
    wp_register_script( 'ajaxsettings', 'path/to/ajaxsettings.js' );
    
    // Localize the script with new data
    $ajaxsettings = array(
        'ajaxurl' => admin_url('admin-ajax.php')
    );
    wp_localize_script( 'ajaxsettings', 'ajaxsettings', $ajaxsettings );
    
    // Enqueued script with localized data.
    wp_enqueue_script( 'ajaxsettings' );
    
    $.ajax({
            url: ajaxsettings.ajaxurl,
            data: {'action':'generateCptApiKey'},
            success:function(data) {
                console.log(data);
            },
            error: function(errorThrown){
                console.log(errorThrown);
            }
        });
    

    在此之后我们需要编写方法来处理这个ajax请求并将输出发送回ajax调用。

    为了在wordpress中检测ajax请求调用,它们有两个标准钩子,钩子就是我发送ajax请求时的事件,wordpress ajax相关钩子会触发,我可以调用该触发器上的任何函数。

    所以基本上处理ajax请求下面是两个钩子:

    1. wp_ajax_(action):它处理来自经过身份验证/已登录用户的请求。 (用于后端wp-admin仪表板相关任务)
    2. wp_ajax_nopriv_(action):它处理前端未经身份验证的请求。 (用于前端页面/发布ajax调用相关任务)
    3. 此处(操作)是您必须在当前主题function.php文件中编码的方法的名称,此方法将处理此ajax请求。

      <强>示例:

      面向对象的风格:

      add_action( 'wp_ajax_cleanResponseFiles', array($this, 'cleanResponseFiles'));
      add_action( 'wp_ajax_nopriv_cleanResponseFiles', array($this, 'cleanResponseFiles'));
      

      注意:此处&#34; cleanResponseFiles&#34;是将处理ajax请求的类的方法。和$这是指向当前的类对象。

      程序风格:

      add_action( 'wp_ajax_cleanResponseFiles',  'cleanResponseFiles');
      add_action( 'wp_ajax_nopriv_cleanResponseFiles','cleanResponseFiles');
      

      注意:此处&#34; cleanResponseFiles&#34;是在当前主题function.php文件中添加的函数,它将处理ajax请求。

      在此我们正在考虑可以从wp-admin仪表板或从前端页面/帖子发出ajax请求。

      示例ajax请求处理程序方法:

      function cleanResponseFiles(){
          echo "<pre>";
          print_r($_POST);
          echo "</pre>";
      
          //Always use exit() in ajax request handler function end
          exit();
      }
      

      Thumb规则:

      1. 始终在ajax请求处理程序方法中使用exit()方法,这是必不可少的。
      2. 发送ajax请求的最佳做法是使用Wordpress_nonce
      3. 仅仅通过添加CRSF来抓取Honeypot(跨站点请求伪造),使用生成的随机密钥隐藏输入字段,并且在请求处理程序方法中应该对其进行验证。< / p>

        这些是我们可以用来创建Wordepress nonce并验证Wordpress nonce和ajax请求处理程序或简单http请求处理程序的方法。

        Wordpress Nonce方法:

        1. wp_create_nonce:用于创建随机密钥,以便将表单作为隐藏字段发送。
        2. wp_verify_nonce:用于验证请求处理程序方法中的随机密钥。
        3. 我将在此评论中附上一个关于wordpress ajax调用的工作示例。

答案 1 :(得分:0)

请参阅此https://codex.wordpress.org/Plugin_API/Action_Reference/wp_ajax_(action)

基本上,您可以创建wp_ajax_myaction之类的操作,您可以在functions.php或您认为合适的地方进行定义。然后按照页面上的示例(使用部分)中的说明调用它。

编辑: 添加一些代码以帮助您理解

functions.php

add_action( 'wp_ajax_my_ajax', 'my_ajax' );
add_action('wp_ajax_nopriv_my_ajax', 'my_ajax');

function my_ajax() {
    die( "Hello World" );
}

在你的JS中:

$.ajax({
        url: "http://yoursite.com/wp-admin/admin-ajax.php",
        data : {action : 'my_ajax'},
        success: function( data ) {
            alert( 'The code says ' + data);
        }
    })

关于代码的一些事情:

  1. 这只是一个快速而肮脏的代码,大部分都是从示例中删除,只是为了向您展示它是如何工作的。

  2. no_priv操作用于允许未经授权的访问(即非管理员用户)

  3. url通常不会按照示例中显示的方式进行硬编码,人们通常会使用admin_url( 'admin-ajax.php' )

  4. 将其传递给脚本
  5. 数据中发送的action确定应调用哪个函数。 (在我们的案例中为my_ajax

  6. 让我们知道你是否还有问题。

答案 2 :(得分:0)

简单说明:所有ajax帖子都应该发送到admin-ajax.php每个请求都需要提供至少一个名为action的数据。基于此操作,admin-ajax.php中的代码创建了两个钩子。 如果action的值是cusom_action,则自动创建wp_ajax_custom_action和wp_ajax_nopriv_custom_ction。检查WordPress coddex。 https://codex.wordpress.org/AJAX_in_Plugins