web-dev-qa-db-fra.com

Classe WP_Query introuvable

L'idée est simple. J'ai un menu déroulant généré avec get_categories (). Ceci sort une liste de catégories dans une liste non ordonnée, chacune dans son propre élément li.
Je reçois les valeurs textuelles de ces éléments li lorsqu'un utilisateur clique dessus et, partant, je veux créer un wp_query personnalisé qui renvoie uniquement les publications de cette catégorie. Pour ce faire, je charge la valeur textuelle de l'élément de liste dans une variable JS et l'envoie dans un fichier php pour traitement. Ce fichier php construit la chaîne de la manière suivante:

$ff_query = new WP_Query('posts_per_page=2&category_name='.$_POST['JSvariable']); 

… Et devrait idéalement l'exécuter en renvoyant les informations de la base de données. L'erreur que je reçois est:

"Erreur fatale: La classe 'WP_Query' est introuvable dans C:\xampp\htdocs\suply\wp-content\themes\suply\includes\proc_cat.php en ligne 3"

Voici à quoi ressemblent mes 2 fichiers:

1) fichier qui envoie la demande ajax:

<script>
    $(document).ready(function(e) {
        $("#ddmenu li").on('click', function() {
            var cValue = $(this).text();
            $.post("<?php bloginfo('template_url');?>/includes/proc_cat.php", {name: cValue}, function(cat){                
                alert(cat);
                $(".browse-big-slider").append(cat);
            });//end of post
        });//end of click
    });//end of ready
</script>

2) fichier qui devrait traiter le

if(isset($_POST)){
        $name = 'posts_per_page=2&category_name='.$_POST['name'];
        $ff_query = new WP_Query('posts_per_page=2&category_name='.$_POST['name']);
      something else, but it won`t reach this part.
}

Que puis-je faire pour que cela fonctionne? Ou bien, comment puis-je créer le type de fonctionnalité que je souhaite? (Fondamentalement, une requête différente, générée dynamiquement, basée sur une sélection de l'utilisateur).

1
Radu Andrei

En effet, lorsque vous appelez directement un modèle de thème, vous ne disposez que de ce qui est inclus/défini dans le fichier de modèle, pas de l’environnement WordPress complet.

Certaines personnes tentent de résoudre ce problème en ajoutant une inclusion de wp-header ou load, mais ceci est incroyablement dommageable

Lorsque vous exécutez les demandes AJAX, never appelez un fichier dans le thème, appelez plutôt les API WP AJAX.

Avec l'API WP AJAX, votre fichier devient une fonction simple dans functions.php.

Je vous suggère fortement de suivre les conseils de cet article:

http://www.garyc40.com/2010/03/5-tips-for-using-ajax-in-wordpress/#js-global

par exemple. PHP:

wp_localize_script( 'my-ajax-request', 'MyAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) )
add_action( 'wp_ajax_nopriv_myajax-submit', 'myajax_submit' );
add_action( 'wp_ajax_myajax-submit', 'myajax_submit' );

function myajax_submit() {
    // get the submitted parameters
    $postID = $_POST['postID'];

    // generate the response
    $response = json_encode( array( 'success' => true ) );

    // response output
    header( "Content-Type: application/json" );
    echo $response;

    // IMPORTANT: don't forget to "exit"
    exit;
}

JS:

jQuery.post(
    // see tip #1 for how we declare global javascript variables
    MyAjax.ajaxurl,
    {
        // here we declare the parameters to send along with the request
        // this means the following action hooks will be fired:
        // wp_ajax_nopriv_myajax-submit and wp_ajax_myajax-submit
        action : 'myajax-submit',

        // other parameters can be added along with "action"
        postID : MyAjax.postID
    },
    function( response ) {
        alert( response );
    }
);
1
Tom J Nowell