web-dev-qa-db-fra.com

Widget code Javascript (ajax)

J'ai un widget comme celui-ci:

class test_widget extends WP_Widget{

  function test_widget(){
    $widget_ops = array('description' => 'test widget');
    $this->WP_Widget(false, 'Test', $widget_ops);

    add_action('init', array(&$this, 'ajax'), 99);

    // include in jQuery(document).ready()
    add_action('jquery_init', array(&$this, 'js'));
  }

  function js(){
    // get settings from all widget instances
    $widget_settings = get_option($this->option_name);

    // identify this instance
    foreach($widget_settings as $instance => $options):

      $id = $this->id_base.'-'.$instance;
      $block_id = 'instance-'.$id;

      if (is_active_widget(false, $id, $this->id_base)): ?>

      $("#<?php echo $block_id; ?> .button").click(function(){

        $.ajax({
          type: "GET",
          url: "<?php echo get_bloginfo('url'); ?>",
          data: { id: "<?php echo $block_id; ?>",
                  some_data: "<?php echo $options['some_widget_option']; ?>",
                  my_widget_ajax: 1 },
          success: function(response){
             alert(response);
             // yey
          }
        });
        return false;

      });

      <?php endif;
    endforeach;
  }

  function ajax(){
    if(isset($_GET['my_widget_ajax'])):

      $some_data = esc_attr($_GET['some_data']);

      echo $some_data;
      exit();
    endif;
  }

  function widget($args, $instance){
    // the widget front-end

  }

  function update($new_instance, $old_instance){
    // update form
    return $instance;
  }

  function form($instance){
    // the form
  }
}

En gros, il y a un bouton qui déclenche une requête ajax qui récupère des informations ...

Comme vous pouvez le constater, la seule façon dont j'ai pu ajouter la fonction ajax était de la relier à la balise init et à js à une fonction de thème qui gère le javascript.

Le problème est que cela ne fonctionne que lorsque le widget est présent dans une barre latérale. Et j’ai aussi besoin que cela fonctionne lorsque j’appelle ce widget avec la fonction the_widget () , par exemple. dans une page. Je ne sais pas comment puis-je récupérer les options du widget pour les transmettre dans le code javascript ...

Des idées?

1
Alex

Le problème est que cela ne fonctionne que lorsque le widget est présent dans une barre latérale.

Si vous avez besoin que du code soit exécuté indépendamment du widget, je pense qu'il est logique d'ajouter ce code séparément de la classe du widget.

Et j'en ai aussi besoin pour fonctionner lorsque j'appelle ce widget avec la fonction the_widget (), par exemple. dans une page. Je ne sais pas comment puis-je récupérer les options du widget pour les transmettre dans le code javascript ...

Cette fonction prend un tableau d'instances avec des données de widget. Je ne suis pas sûr de vos spécificités, mais je pense que vous pouvez y apporter tout ce dont vous avez besoin.

Le widget appelé directement ne contient aucune donnée, autre que celle passée dans l'instance (ou extraite par elle-même).

0
Rarst