web-dev-qa-db-fra.com

do_shortcode à l'intérieur AJAX rappeler

J'ai une fonction de rappel AJAX dans mon fichier functions.php, qui affiche les publications dans une catégorie spécifique.

add_action( 'wp_ajax_ajaxified_function', 'ajaxified_function' );
add_action( 'wp_ajax_nopriv_ajaxified_function', 'ajaxified_function' );
function ajaxified_function() 
{ 
    $post = get_post($_POST['post_id']);
    $feat_image = get_the_post_thumbnail($post->ID);
    $desc_values = get_post_custom_values("designation",$post->ID);
    $title = current(explode(' ', get_the_title($post->ID)));
    if( is_array( $desc_values ) )
    {
     foreach($desc_values as $key => $value );
    }   
    $email_values = get_post_custom_values("email",$post->ID);
    if( is_array( $email_values ) )
    {
        foreach($email_values as $key => $email_value );
    }
    echo '<div id="bloggers_avatar">'.$feat_image.'</div>'.$post->post_.'<div id="bloggers_title">'.$post->post_title.'</div><div id="bloggers_desig">'.$value.'</div><div id="emailid" ><a class="email_link">Email '.$title.'</a></div><br/><div id="postContent">'.$post->post_content.'</div>'; 
    echo '<script>
        jQuery(document).ready(function(){
            jQuery(".email_link").colorbox({inline:true,
               width:400,
               height:600,
               fixed:true,
               href:"#email_id_meet_the_team"
           });
       });
       </script>';
       echo '<div style="display:none">
           <div id="email_id_meet_the_team">
          <div>';    
            echo do_shortcode('[contact-form-7 id="698" title="Meet The Team Email"]');

           echo '</div>
               </div>
          </div>';
      die();
  }

Quand j'utilise ceci c'est juste echoing le shortcode au lieu de montrer le formulaire de contact.

Je travaille sur la section locale maintenant. J'ai une démo qui utilise seulement le ajax, pas la colorbox.

Vous pouvez voir un lien Email dans le biographie div. En cliquant sur ce lien, je souhaite afficher une boîte de couleurs avec le formulaire de contact.

3
MidhuN

Le comment

Ce serait beaucoup mieux et plus facile si vous ajoutiez simplement le script directement au corps principal au lieu de l'appel AJAX.

Il en va de même avec le résultat du shortcode. Utilisez simplement le shortcode comme argument dans wp_localize_script():

wp_localize_script( 'script-handle', 'pluginObject', array(
    'contactForm' => do_shortcode( '[contact-form-7 id="698" title="Meet The Team Email"]' ),
) );

Ensuite, dans votre gestionnaire jQuery AJAX, faites tout ce que vous devez faire - par exemple. insérez le formulaire de contact.

( function( $, plugin ) {
    $.ajax( {
        url  : plugin.ajaxurl,
        data : {
            action         : plugin.action,
            _ajax_nonce    : plugin._ajax_nonce,
            data           : { 
                plugin.contactForm 
            }
        },
        beforeSend : function( d ) {
            console.log( 'Before send', d );
        }
    } )
        .done( function( response, textStatus, jqXHR ) {
            console.log( 'AJAX done', textStatus, jqXHR, jqXHR.getAllResponseHeaders() );
            // this.processAJAXResponse( response );
        } )
        .fail( function( jqXHR, textStatus, errorThrown ) {
            console.log( 'AJAX failed', jqXHR.getAllResponseHeaders(), textStatus, errorThrown );
        } )
        .then( function( jqXHR, textStatus, errorThrown ) {
            console.log( 'AJAX after finished', jqXHR, textStatus, errorThrown );
        } );
} )( jQuery, pluginObject || {} );

Vous devez maintenant avoir accès au formulaire rendu à l'intérieur de votre rappel AJAX, mais également à l'intérieur de votre gestionnaire JavaScript AJAX.

Le pourquoi

Le problème rencontré par IIRC est que les requêtes AJAX sont toujours des requêtes administratives, même publiques. Et comme il n'y a pas de sortie de codes courts sur les pages d'administration, il n'y a rien de plus qu'une valeur de retour de chaîne.

Règle: N'essayez jamais de lancer des codes courts dans les demandes AJAX ou Admin.

Notes complémentaires:

  • N'ajoutez pas de scripts dans les rappels AJAX. Ce n'est tout simplement pas la bonne chose à faire. Comme indiqué ci-dessus, transmettez des valeurs à l'aide de wp_localize_script().
  • Un shortcode est normalement juste un wrapper pour certaines API. N'utilisez jamais le shortcode - utilisez plutôt l'API. Salutations de Stephen Harris qui vient de me dire en discussion que je devrais vous indiquer cela.
5
kaiser