Cum să filtrez articolele după taxonomie folosind AJAX

20 apr. 2013, 22:47:52
Vizualizări: 27.6K
Voturi: 3

Am găsit acest articol care descrie cum să filtrez articolele după categorie folosind Ajax și funcționează excelent, dar vreau să filtrez și taxonomiile mele personalizate în același mod și nu reușesc să îl fac să funcționeze. Îmi arată toate articolele în loc să le arate doar pe cele din taxonomia mea.

Știu că meniul trebuie modificat pentru a folosi get_the_terms în loc de get_the_categories, dar am nevoie în mod specific de ajutor cu ce trebuie schimbat în funcția jQuery și în funcția PHP de la final. Am încercat să adaug un tax_query care apelează taxonomia mea, dar tot nu afișează articolele corecte. Poate cineva să mă îndrume în direcția corectă?

8
Comentarii

Am o eroare fatală de funcție nedefinită când încerc să folosesc get_the_categories() Ești sigur că nu te referi la get_the_category?

s_ha_dum s_ha_dum
20 apr. 2013 23:00:59

@s_ha_dum Asta a folosit dezvoltatorul original, dar poate ai dreptate. Codul acela are câțiva ani, deci poate funcția s-a schimbat? Nici nu folosesc asta pentru a afișa lista de categorii, deoarece vreau să le pot lista într-o anumită ordine. Legăturile mele de categorii arată astfel: <li id="cat-8"><a class="category ajax" onclick="cat_ajax_get('8');" href="#">Category</a></li>

Emily Emily
20 apr. 2013 23:46:02

Se pare că faci ceva diferit de postarea la care ai făcut referire. Te rog să editezi întrebarea ta pentru a include codul tău.

s_ha_dum s_ha_dum
21 apr. 2013 00:32:56

@s_ha_dum Ok, nicio problemă. Nu am crezut că ar fi util deoarece este evident greșit. Practic, am încercat să înlocuiesc toate aparițiile cuvântului "cat" cu "term". Nu am suficientă experiență în PHP pentru a ști exact ce trebuie modificat ca să funcționeze și nu știu nimic despre jQuery.

Emily Emily
21 apr. 2013 01:36:22

Am rezolvat problema! Se pare că trebuia doar să redenumesc toate acțiunile ajax deoarece erau deja folosite pentru filtrarea pe categorii. După ce am făcut asta și am ajustat tax_query-ul, a început să funcționeze. Am editat codul pentru a arăta varianta corectă în caz că ajută pe cineva.

Emily Emily
21 apr. 2013 22:40:03

Ar trebui să postezi soluția ta ca un răspuns propriu-zis și să o marchezi ca "Acceptată"

s_ha_dum s_ha_dum
21 apr. 2013 22:55:54

@s_ha_dum Bine, tocmai am făcut asta. Nu mă lasă să accept răspunsul timp de 23 de ore, dar voi reveni mâine să fac asta.

Emily Emily
21 apr. 2013 23:21:44

Însă te pot upvota. Rezolvarea singur îmi încălzește inima. :)

s_ha_dum s_ha_dum
21 apr. 2013 23:33:16
Arată celelalte 3 comentarii
Toate răspunsurile la întrebare 3
0

Am reușit să rezolv! Iată codul pe care l-am folosit:

Adăugați în functions.php:

add_action( 'wp_ajax_nopriv_load-filter2', 'prefix_load_term_posts' );
add_action( 'wp_ajax_load-filter2', 'prefix_load_term_posts' );
function prefix_load_term_posts () {
        $term_id = $_POST[ 'term' ];
            $args = array (
            'term' => $term_id,
            'posts_per_page' => -1,
            'order' => 'DESC',
                 'tax_query' => array(
                  array(
                      'taxonomy' => 'yourtaxonomyhere',
                      'field'    => 'id',
                      'terms'    => $term_id,
                      'operator' => 'IN'
                      )
                  )
             );

        global $post;
        $myposts = get_posts( $args );
        ob_start (); ?>

        <ul class="list">
        <?php foreach( $myposts as $post ) : setup_postdata($post); ?>
            <li><a href="<?php the_permalink(); ?>" id="post-<?php the_ID(); ?>"><?php echo get_post_meta($post->ID, 'image', $single = true); ?></a><br />
             <?php the_title(); ?></li>
       <?php endforeach; ?>
        </ul>

       <?php wp_reset_postdata(); 
       $response = ob_get_contents();
       ob_end_clean();
       echo $response;
       die(1);
}

Script jQuery:

<script>
function term_ajax_get(termID) {
    jQuery("a.ajax").removeClass("current");
    jQuery("a.ajax").addClass("current"); //adaugă clasa current la elementul de meniu afișat pentru a-l stiliza cu css
    jQuery("#loading-animation").show();
    var ajaxurl = 'http://yourdomain.com/wp-admin/admin-ajax.php';
    jQuery.ajax({
        type: 'POST',
        url: ajaxurl,
        data: {"action": "load-filter2", term: termID },
        success: function(response) {
            jQuery("#category-post-content").html(response);
            jQuery("#loading-animation").hide();
            return false;
        }
    });
}
</script>

Nu folosesc o funcție pentru a lista categoriile, ci le listez separat pe fiecare. Înlocuiți numărul cu ID-ul termenului vostru:

<ul class="nav">
     <li id="term-166"><a class="yourtermname ajax" onclick="term_ajax_get('166');" href="#">Numele Termenului Tău</a></li>
     <li id="term-354"><a class="yourtermname ajax" onclick="term_ajax_get('354');" href="#">Numele Termenului Tău</a></li>
</ul>

De asemenea, dacă doriți să filtrați etichetele în loc de termeni, înlocuiți:

  • 'term' cu 'tag__in',
  • $term_id cu $tag_id
  • și schimbați 'taxonomy' => 'yourtaxonomyhere' în 'taxonomy' => 'post_tag'.
21 apr. 2013 23:14:58
0

Vă sugerez să utilizați un shortcode pentru a afișa taxonomia la alegere: creați o clasă pentru a declara shortcode-ul și apelați această funcție

  public function shortcode($atts)
{
 extract(shortcode_atts( array(
    'data' => 'taxonomy',
    'taxonomy' => 'category',
    //argumentele get_terms
    'parent' => 0, //implicit preia doar termenii de nivel superior
    'exclude'=>'',
    'type'=>'radio' // checkbox,radio
    ), $atts,'astSearchInput' ));

$arrStr =array();
$arrStr[]= "<div class='astSearchInput " . $taxonomy. "' taxonomy='" .$taxonomy. "'>"  ;
if ($type=="checkbox" || $type=="radio")
{
    if ($data=="taxonomy")
        {
        //echo $datatata;
        $arrValues=get_terms($taxonomy, array("parent"=>$parent, "exclude"=>$exclude)); 
        }


     if ($type=="checkbox")$arrStr[]= $this->inputCheckBox($arrValues,$atts);
     if ($type=="radio")$arrStr[]= $this->inputRadio($arrValues,$atts);
}
$arrStr[]= "</div>";
$str=join("\n",$arrStr);
return $str  ;
}




    function inputCheckBox($arrValues,$attr)
{
    $arrStr =array();
    $arrStr[]='<div class="formcb">';
    foreach($arrValues as $k=>$term)
        {
            $title=$term->name; //$term->description 
            //  print_r($term);
            $id="cb" . $term->term_id;
            $arrStr[]='<div class="cb"><input class="astInpuntTerm astcheckBox" type="checkbox" id="' . $id  .'" value="' . $term->term_id . '" ><label for="' . $id . '">' . $title. '</label></div>';
        }
    $arrStr[]='</div>'; 
    $str=join("\n",$arrStr);    
        return $str;
}

http://www.webmasterbulletin.net/wordpress-ajax-taxonomy-search-shortcode

15 iul. 2014 14:53:29
0

Am avut o problemă similară.

Codul este bun, dar are nevoie de mici modificări pentru a funcționa.

            $args = array (
        'term' => $term_id,
        'posts_per_page' => -1,
        'order' => 'DESC',
             'tax_query' => array(
              array(
                  'taxonomy' => 'yourtaxonomyhere',
                  'field'    => 'id',
                  'terms'    => $term_id,
                  'operator' => 'IN'
                  )
              ),
               'post_type' => 'yourcustomposttype', // <== lipsea acest parametru
'posts_per_page' => 10,
'order' => 'DESC'
         );
18 apr. 2015 12:07:50