2016-05-09 8 views
0

Ich verbringe den ganzen Tag damit, ein Problem mit einer Kombination aus einer benutzerdefinierten Abfrage und benutzerdefinierten Post-Typen zu lösen. Das ist mein letztes Mittel ...

Die Einstellung

ich ein Plugin geschrieben, die einige benutzerdefinierte Post-Typen zu meinem Wordpress führt. Ich hakte sie in die Abfrage wie folgt, um sie in der Hauptabfrage angezeigt:

function add_cpt_to_query($query) { 

    *some code...* 

    // add custom post types to query 
    if (!(is_admin() || is_post_type_archive() || is_page()) && $query->is_main_query()) { 
     $query->set('post_type', array_merge(array('post'), $cpt)); 
    } 
} 
add_action('pre_get_posts','add_cpt_to_query'); 

In meinem Thema auf der anderen Seite ich Setup Ajax Paginierung wie folgt aus:

function setup_pagination() { 

    global $wp_query; 

    $max_pages = $wp_query->max_num_pages; 
    $current_page = ($wp_query->paged > 1) ? $wp_query->paged : 1; 
    $ajaxurl = admin_url('admin-ajax.php'); 


    wp_register_script('ajax-pagination', get_template_directory_uri() .'/js/dummy.js', array('jquery'), '', true); 

    wp_localize_script('ajax-pagination', 'ajaxpagination', array(
     'max_pages'  => $max_pages, 
     'current_page' => $current_page, 
     'ajaxurl'  => $ajaxurl, 
     'query_vars' => $wp_query->query_vars 
    )); 

    wp_enqueue_script('ajax-pagination'); 
} 
add_action('wp_enqueue_scripts', 'setup_pagination'); 

function pagination() { 

    $query = $_POST['query_vars']; 

    $query['paged'] = $_POST['next_page']; 

    /* 
    $query = array(
       'paged' => 2, 
       'post_type' => array('post', 'custom_post_type_1', 'custom_post_type_2') 
      ); 
    */ 

    $posts = new WP_Query($query); 
    $GLOBALS['wp_query'] = $posts; 

    // Start the loop. 
    while (have_posts()) : the_post(); 
    ?> 
    *some code...* 
    <?php endwhile; 

    die(); 

} 
add_action('wp_ajax_nopriv_ajax_pagination', 'pagination'); 
add_action('wp_ajax_ajax_pagination', 'pagination'); 

und das Skript Teil:

$.ajax({ 
      url: ajaxpagination.ajaxurl, 
      type: 'post', 
      data: { 
       action:   'ajax_pagination', 
       query_vars:  ajaxpagination.query_vars, 
       next_page:  parseInt(ajaxpagination.current_page) + 1 
      } 
     }); 

Das Problem

Wenn ich das query_vars-Array übergebe, bekomme ich von $ wp_query mit dem geänderten 'paged' -Wert zurück nach WP_QUERY, es wird der falsche Satz von Posts zurückgegeben. Es sieht so aus, dass WP_QUERY die cpts in der Schleife nicht berücksichtigt. Obwohl diese cpts im "post_type" des query_vars-Arrays erwähnt und somit an das neue WP_QUERY übergeben werden.

Wenn ich manuell "post_type" festlegen und dieses Argument nur übergeben, funktioniert es wie vorgesehen. Der Aspekt, der mir in den Sinn kommt, ist, dass die resultierenden query_vars, die im Ajax-Aufruf von WP_QUERY verwendet werden, genau gleich sind, aber nur wenn ich 'post_type' manuell setze, funktioniert die Paginierung wie sie sollte.

Ich weiß nicht, ob das eine etwas verständliche Erklärung war, aber ich bin dankbar für jede Idee, die mir helfen könnte. Großer THX!

+0

Vergewissern Sie sich, dass Sie '$ posts-> have_posts()' und '$ posts-> the_post()' und Nach dem Aufruf der Schleife 'wp_reset_postdata()' – kindisch

+0

[http://stackoverflow.com/questions/33431615/wordpress-category-post-ajax-pagination/36802388#36802388] überprüfen Sie dies könnte Ihnen helfen! –

Antwort

0

Ok ... Ich habe es jetzt.

Ich habe einen Fehler in wp_localize_script() gemacht. Die query_vars sollten eine json-Zeichenfolge sein, ich habe andererseits das Array selbst übergeben. Mein Code oben muss in zwei Zeilen geändert werden:

function mk_setup_pagination() { 

    ... 

    wp_localize_script('ajax-pagination', 'ajaxpagination', array(
     ... 
     'query_vars'  => json_encode($wp_query->query_vars) <- convert to json-string 
    )); 

    ... 
} 

function mk_pagination() { 

    $query = json_decode(stripslashes($_POST['query_vars']) , true); <- convert json-string to array 

... 

Funktioniert wie ein Charme jetzt. :)

btw: Der Code basiert auf einem Tutorial von wpmudev.org: Loading WordPress Posts Dynamically With AJAX