Cum să transmiți o variabilă JavaScript către PHP într-un widget WordPress?

2 mar. 2017, 00:42:21
Vizualizări: 13.9K
Voturi: 3

Am petrecut mult timp căutând o soluție prin care să pot transmite valoarea unei variabile JavaScript într-o variabilă PHP în același fișier, în aceeași funcție (Widget WordPress, funcția Form). Există o metodă bună, din 2017, pentru a face acest lucru?

Am încercat metoda de mai jos. Deși partea de Ajax afișează mesajul de succes, partea de PHP nu funcționează.

repeat.php

<?php 
    echo $_POST['examplePHP']; //va cauza index nedefinit aici
?>
<script>
        jQuery(document).ready(function($){

          var exampleJS = "Salut!";

          $.ajax({
                url: ajaxurl, //Am încercat 'repeat.php' în loc de ajaxurl, dar nu funcționează.
                type: 'POST',
                data: {
                  examplePHP: exampleJS
                },
                success: function( response){
                  console.log("Succes!");
                },
                error: function(error){
                  console.log("Eroare");
                }
          });

      });
</script>
1
Comentarii

Va trebui să adăugați codul PHP într-o funcție care poate fi apelată prin AJAX. https://codex.wordpress.org/Plugin_API/Action_Reference/wp_ajax_(action)

ngearing ngearing
2 mar. 2017 00:50:09
Toate răspunsurile la întrebare 2
0

Am găsit o metodă simplă de a transmite o variabilă JavaScript către o variabilă PHP. Rețineți că această metodă funcționează în WordPress versiunea 4.7.2 și doar specific pe Widget. Am scris multe comentarii pentru a încerca să explic ce face fiecare linie. Dacă aveți o soluție mai bună, vă rugăm să o împărtășiți cu noi!

Soluție:

  • Creați un câmp de input ascuns pentru a stoca valoarea JavaScript pe care doriți să o transmiteți.
  • Accesați acel câmp de input ascuns și atribuiți-i valoarea unei variabile PHP.

Demo Widget:

  • Am creat un widget demo care adaugă cuvântul "TE IUBESC" în funcție de câte ori apăsați butonul "Adaugă TE IUBESC".

  • Rețineți că am lăsat câmpul ascuns afișat pentru o mai bună înțelegere.

  • Puteți schimba type="text" în type="hidden" pentru a-l ascunde.

  • Acest demo se concentrează doar pe funcția form a widget-ului.

  • Asigurați-vă că apăsați butonul Salvează, altfel valoarea câmpului de input ascuns nu va fi salvată de widget.

Captură de ecran Demo Widget:

Captură de ecran Widget Demo

Cod sursă:

wp-text-repeater.php

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

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 care afișează TE IUBESC repetat în funcție de apăsarea butonului',
        );
        parent::__construct( 'wp_text_repeater', 'Widget WP Text Repeater', $widget_ops );
    }

    /**
     * Outputs the content of the widget
     *
     * @param array $args
     * @param array $instance
     */
    public function widget( $args, $instance ) {
        // afișează conținutul widget-ului
    $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 ) {
        // afișează formularul de opțiuni în administrare
    $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';

  ?>
    <!-- Câmp ascuns care stochează numărul de apăsări ale butonului -->
    <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; //Numărul de apăsări ale butonului

    //dacă câmpul ascuns JavaScript de pe front-end are valoare, atribuie $max acea valoare.
    //Acest if sincronizează partea de JavaScript cu cea PHP.
    if(strlen($$tempHidden) > 0){
      $max = intval($$tempHidden);
    }

    $counter = 0;
    while($counter < $max){ //buclă în funcție de numărul de apăsări ale butonului
  ?>
      <p>TE IUBESC!</p>
  <?php
     $counter++;
    }

    $id_prefix = $this->get_field_id(''); //obține prefixul ID-ului widget-ului.
  ?>
    <!-- Puteți adăuga tot conținutul aici -->
    <span id="<?php echo $this->get_field_id('wp_text_repeater_appendee')?>"></span>

    <!-- Buton care apelează funcția jQuery pentru a adăuga cuvântul "TE IUBESC" -->
    <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="Adaugă TE IUBESC"
          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; ?>; //preia valoarea din PHP pentru a sincroniza front-end-ul cu back-end-ul.
      text_repeater = {
          addLove :function(widget_id, widget_id_string){
              preIndexID = widget_id_string; //obține prefixul corect al widget-ului.
              numberOfLove++;
              numberOfLove = numberOfLove.toString(); //converteste numărul în string pentru câmpul ascuns.
              $("#" + preIndexID + "wp_text_repeater_hidden").val(numberOfLove); //schimbă valoarea câmpului ascuns.
              $("#" + preIndexID + "wp_text_repeater_appendee").append('<p>TE IUBESC!</p>'); //actualizează live front-end-ul cu "TE IUBESC".
          }
      }
    });

    </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 ) {
        // procesează opțiunile widget-ului pentru a fi salvate
    $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;

    }
}

// înregistrează widget-ul wp_text_repeater
function register_wp_text_repeater_widget() {
    register_widget( 'wp_text_repeater' );
}
add_action( 'widgets_init', 'register_wp_text_repeater_widget' );
3 mar. 2017 20:52:12
0

Vă rugăm să rețineți că codul se execută de sus în jos.

În acest fel nu puteți 'prelua' variabila POST înainte de a o trimite prin ajax.

Ceva care ar funcționa cu configurația dvs.:

<?php 
    if(isset($_POST['examplePHP'])){ //verifică dacă $_POST['examplePHP'] există
        echo $_POST['examplePHP']; // afișează datele
        die(); // oprește execuția scriptului.
    }
?>

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

          var exampleJS = "salut!";

          $.ajax({
                url: window.location, //window.location indică URL-ul curent. este nevoie de modificare.
                type: 'POST',
                data: {
                  examplePHP: exampleJS
                },
                success: function( response){
                  console.log("Succes! Datele mele POST sunt: "+response);
                },
                error: function(error){
                  console.log("eroare");
                }
          });

      });
</script>

Mai întâi verificăm dacă variabila POST există cu isset(). Dacă aceasta există, afișăm conținutul lui 'examplePHP' și apoi oprim execuția scriptului cu die();.

Dacă nu există nicio variabilă POST disponibilă, înseamnă că cineva doar încarcă pagina. Atunci nu afișăm nimic, ci continuăm cu restul paginii.

Am adăugat window.location care este URL-ul curent. Iar variabila response returnează rezultatul afișat.

Deoarece acesta este WordPress Stack Exchange, v-aș recomanda să folosiți WordPress Ajax. Puteți citi mai multe despre aceasta pe pagina Codex!

2 mar. 2017 01:05:41