如何在WordPress小工具中将JavaScript变量传递给PHP?

时间:2017-03-01 作者:Sengngy Kouch

我花了很多时间寻找一个解决方案,在这个解决方案中,我可以将JavaScript变量的值传递到同一个文件、同一个函数(WordPress小部件、表单函数)中的PHP变量中。截至2017年,是否有一个好的方法可以做到这一点?

我在下面尝试过这种方法。虽然Ajax部分发出了成功的消息,但php部分失败了。

repeat.php

<?php 
    echo $_POST[\'examplePHP\']; //will cause undefined index here
?>
<script>
        jQuery(document).ready(function($){

          var exampleJS = "hi!";

          $.ajax({
                url: ajaxurl, //I have tried \'repeat.php\' instead of ajaxurl, but not working.
                type: \'POST\',
                data: {
                  examplePHP: exampleJS
                },
                success: function( response){
                  console.log("Successful!");
                },
                error: function(error){
                  console.log("error");
                }
          });

      });
</script>

2 个回复
最合适的回答,由SO网友:Sengngy Kouch 整理而成

我找到了一种将JavaScript变量传递给PHP变量的简单方法。请注意,此方法在WordPress版本4.7.2中有效,并且仅在小部件上有效。我写了很多评论来解释每一行的作用。如果您有更好的解决方案,请与我们分享!

Solution:

创建一个隐藏的输入字段来存储要传递的javascript的值

Demo Widget:

<我创建了一个演示小部件,根据你按“添加爱你”按钮的次数添加“爱你”一词。

请注意,为了更好地理解,我留下了显示的隐藏字段。

您可以更改type="text"type="hidden" 隐藏它。

本演示仅侧重于form 小部件的功能。

确保单击保存按钮,否则小部件不会保存隐藏输入的值。

Demo Widget ScreenShot:

enter image description here

Source code:

wp文本转发器。php

<?php
/**
*Plugin Name: WP Text Reapter
**/

class wp_text_repeater extends WP_Widget {

    /**
     * Sets up the widgets name etc
     */
    public function __construct() {
        $widget_ops = array(
            \'classname\' => \'wp_text_repeater\',
            \'description\' => \'Widget that prints LOVE YOU repeatedly according to button press\',
        );
        parent::__construct( \'wp_text_repeater\', \'WP Text Repeater Widget\', $widget_ops );
    }

    /**
     * Outputs the content of the widget
     *
     * @param array $args
     * @param array $instance
     */
    public function widget( $args, $instance ) {
        // outputs the content of the widget
    $wp_text_repeater_button = ! empty( $instance[\'wp_text_repeater_button\'] ) ? $instance[\'wp_text_repeater_button\'] : \'\';
    $wp_text_repeater_appendee = ! empty( $instance[\'wp_text_repeater_appendee\'] ) ? $instance[\'wp_text_repeater_appendee\'] : \'\';
    $wp_text_repeater_hidden = ! empty( $instance[\'wp_text_repeater_hidden\'] ) ? $instance[\'wp_text_repeater_hidden\'] : \'\';
    }

    /**
     * Outputs the options form on admin
     *
     * @param array $instance The widget options
     */
    public function form( $instance ) {
        // outputs the options form on admin
    $instance = wp_parse_args( (array) $instance, array( \'wp_text_repeater_button\' => \'\', \'wp_text_repeater_appendee\' => \'\', \'wp_text_repeater_hidden\' => \'\'));

    $wp_text_repeater_button = $instance[\'wp_text_repeater_button\'];
    $wp_text_repeater_appendee = $instance[\'wp_text_repeater_appendee\'];
    $wp_text_repeater_hidden = $instance[\'wp_text_repeater_hidden\'];

    $tempHidden = \'wp_text_repeater_hidden\';

  ?>
    <!-- Hidden field that store number of time user press the button -->
    <input
          class="widefat"
          id="<?php echo $this->get_field_id($tempHidden); ?>"
          name="<?php echo $this->get_field_name($tempHidden); ?>"
          type="text"
          value="<?php echo esc_attr($$tempHidden);?>"/>
  <?php

    $max = 0; //Number of time user press the button

    //if JavaScript front-end hidden input has value, assign $max to it.
    //This If statement sync between the javascript and the php part.
    if(strlen($$tempHidden) > 0){
      $max = intval($$tempHidden);
    }

    $counter = 0;
    while($counter < $max){ //loop according to how many time user press the button
  ?>
      <p>LOVE YOU!</p>
  <?php
     $counter++;
    }

    $id_prefix = $this->get_field_id(\'\'); //get the widget prefix id.
  ?>
    <!-- You can append all your content herev-->
    <span id="<?php echo $this->get_field_id(\'wp_text_repeater_appendee\')?>"></span>

    <!-- Add button that call jQery function to add "LOVE YOU" word -->
    <input style="background-color: #08a538; color:white; height: 27px;"
          class="button widefat"
          type="button"
          id="<?php echo $this->get_field_id(\'wp_text_repeater_button\'); ?>"
          value="Add LOVE YOU"
          onclick="text_repeater.addLove(\'<?php echo $this->id;?>\', \'<?php echo $id_prefix;?>\'); return false;"
          />

    <script>

    jQuery(document).ready(function($){
      var preIndexID;
      var numberOfLove = <?php echo $max; ?>; //grab value from the php in order to sync between the front and back end.
      text_repeater = {
          addLove :function(widget_id, widget_id_string){
              preIndexID = widget_id_string; //get the correct pre-index of the widget.
              numberOfLove++;
              numberOfLove = numberOfLove.toString(); //convert int to string for the hidden input field.
              $("#" + preIndexID + "wp_text_repeater_hidden").val(numberOfLove); //change the value of the hidden input field.
              $("#" + preIndexID + "wp_text_repeater_appendee").append(\'<p>LOVE YOU!</p>\'); //live update the front-end with "LOVE YOU".
          }
      }
    });

    </script>
  <?php
    }

    /**
     * Processing widget options on save
     *
     * @param array $new_instance The new options
     * @param array $old_instance The previous options
     */
    public function update( $new_instance, $old_instance ) {
        // processes widget options to be saved
    $instance = $old_instance;

    $instance[\'wp_text_repeater_button\'] = sanitize_text_field($new_instance[\'wp_text_repeater_button\']);
    $instance[\'wp_text_repeater_appendee\'] = sanitize_text_field ($new_instance[\'wp_text_repeater_appendee\']);
    $instance[\'wp_text_repeater_hidden\'] = sanitize_text_field( $new_instance[\'wp_text_repeater_hidden\'] );

    return $instance;

    }
}

// register wp_text_repeater widget
function register_wp_text_repeater_widget() {
    register_widget( \'wp_text_repeater\' );
}
add_action( \'widgets_init\', \'register_wp_text_repeater_widget\' );

SO网友:xvilo

请记住,代码是从上到下触发的。

这样你can not \'在通过ajax发送POST变量之前获取它。

可以与您的设置配合使用的内容:

<?php 
    if(isset($_POST[\'examplePHP\'])){ //check if $_POST[\'examplePHP\'] exists
        echo $_POST[\'examplePHP\']; // echo the data
        die(); // stop execution of the script.
    }
?>

<script>
        jQuery(document).ready(function($){

          var exampleJS = "hi!";

          $.ajax({
                url: window.location, //window.location points to the current url. change is needed.
                type: \'POST\',
                data: {
                  examplePHP: exampleJS
                },
                success: function( response){
                  console.log("Successful! My post data is: "+response);
                },
                error: function(error){
                  console.log("error");
                }
          });

      });
</script>
首先,我们检查POST变量是否存在isset(). 如果存在这种情况,我们会回显“examplePHP”的内容,然后使用die();.

如果没有可用的POST变量,这意味着有人只是加载页面。然后我们不回应,只继续页面的其余部分。

我添加了window.location 这是当前URL。以及response 变量给出回声。

由于这是WordPress堆栈交换,我建议您使用WordPress Ajax. 您可以在Codex页面上阅读更多信息!

相关推荐

自定义模板earch.php中的搜索结果

现在我在搜索结果页面(search.php)中遇到了一个问题,结果是由索引页面模板显示的,而不是它的模板,它显示所有帖子,不管搜索者是否输入了内容我的索引。php页面<?php get_header(); ?> <?php $search = $_get[\'search\']; $args = array( \'post_title_like\' => $search ); $res = new wp_query($args