it-swarm.com.de

Wie erreiche ich die nächsthöhere Kategorie in derselben Taxonomie?

Wie WP get_adjacent_post Funktion gibt die nächsten und vorherigen Post-Daten basierend auf den Parametern, die ich erhalten möchte, die nächsten/vorherigen Kategoriedaten. Gibt es eine WP eingebaute Funktion, die den richtigen Job macht oder ich muss eine benutzerdefinierte schreiben danach fragen.

// Next/previous post example
$in_same_cat = false;
$excluded_categories = '';
$previous = true;
$previous_post = get_adjacent_post($in_same_cat,$excluded_categories,$previous);

ich möchte die nächste Kategorie nach category slug oder nach category id

Jede Hilfe wäre dankbar

1
M Khalid Junaid

Das ist, was ich mit einer benutzerdefinierten Abfragelösung gefunden habe. Hoffe, es hilft anderen. Ich habe eine benutzerdefinierte Funktion dafür geschrieben. Es funktioniert für alle Post-Typ-Kategorien (Post, benutzerdefinierte Post-Typen).

function get_adjacent_category($category_slug,$taxonomy,$type){
    global $wpdb;
    if($type=="next"){
        $operater=" > ";
        $orderby=" ORDER BY tt.`term_id` ASC ";
    }else{
        $operater=" < ";
        $orderby=" ORDER BY tt.`term_id` DESC ";
    }
    $query="SELECT *,(SELECT `term_id` FROM wp_terms WHERE `slug`='".$category_slug."') AS given_term_id,
        (SELECT parent FROM wp_term_taxonomy WHERE `term_id`=given_term_id) AS parent_id
        FROM  `wp_terms` t
        INNER JOIN `wp_term_taxonomy` tt ON (`t`.`term_id` = `tt`.`term_id`)
        HAVING  tt.taxonomy='".$taxonomy."' AND tt.`parent`=parent_id AND tt.`term_id` $operater given_term_id $orderby LIMIT 1";
    return $wpdb->get_row($query);
}

$next_category =  get_adjacent_category($slug,$taxonomy,"next");
$previous_category =  get_adjacent_category($slug,$taxonomy,"previous");
0
M Khalid Junaid

Gibt es eine WP eingebaute Funktion, die den richtigen Job macht?

Nein.

[Muss ich] dafür eine benutzerdefinierte Abfrage schreiben?

Verwenden Sie get_terms () . Hier ist ein Beispiel.


Fügen Sie die Klasse wpse_99513_adjacent_category zur Themendatei functions.php hinzu und rufen Sie sie folgendermaßen auf:

$category_ids = new wpse_99513_adjacent_category( 'category', 'id', false );

- "Kategorie" ist die Taxonomie;
- 'id' ist das Feld, um die Datenbankabfrage nach und zu ordnen
- false zeigt leere Kategorien an.

Um die nächste Taxonomie zu erhalten, benutze dies:

$next_category = $category_ids->next( $category );

- $ category ist die ID der Kategorie, die Sie überprüfen.
- $ next_category wird auf false gesetzt, wenn ein Fehler vorliegt, andernfalls auf die nächste ID.

Zurück funktioniert genauso:

$previous_category = $category_ids->previous( $category );

- $ category ist die ID der Kategorie, die Sie überprüfen.
- $ previous_category wird auf false gesetzt, wenn ein Fehler vorliegt, andernfalls auf die vorherige ID.

Für Slugs, die leere Kategorien überspringen, verwenden Sie:

$category_ids = new wpse_99513_adjacent_category( 'category', 'slug' );


class wpse_99513_adjacent_category {

    public $sorted_taxonomies;

    /**
     * @param string Taxonomy name. Defaults to 'category'.
     * @param string Sort key. Defaults to 'id'.
     * @param boolean Whether to show empty (no posts) taxonomies.
     */
    public function __construct( $taxonomy = 'category', $order_by = 'id', $skip_empty = true ) {

        $this->sorted_taxonomies = get_terms(
            $taxonomy,
            array(
                'get'          => $skip_empty ? '' : 'all',
                'fields'       => 'ids',
                'hierarchical' => false,
                'order'        => 'ASC',
                'orderby'      => $order_by,
            )
        );
    }

    /**
     * @param int Taxonomy ID.
     * @return int|bool Next taxonomy ID or false if this ID is last one. False if this ID is not in the list.
     */
    public function next( $taxonomy_id ) {

        $current_index = array_search( $taxonomy_id, $this->sorted_taxonomies );

        if ( false !== $current_index && isset( $this->sorted_taxonomies[ $current_index + 1 ] ) )
            return $this->sorted_taxonomies[ $current_index + 1 ];

        return false;
    }

    /**
     * @param int Taxonomy ID.
     * @return int|bool Previous taxonomy ID or false if this ID is last one. False if this ID is not in the list.
     */
    public function previous( $taxonomy_id ) {

        $current_index = array_search( $taxonomy_id, $this->sorted_taxonomies );

        if ( false !== $current_index && isset( $this->sorted_taxonomies[ $current_index - 1 ] ) )
            return $this->sorted_taxonomies[ $current_index - 1 ];

        return false;
    }
}
4

Das habe ich mir ausgedacht. Vielleicht nicht die beste, aber funktioniert :)

Angenommen, wir befinden uns auf einer benutzerdefinierten Taxonomie-Kategorieseite und möchten zur nächsten wechseln

// get the term used on this current taxonomy page
$term = get_term_by( 'slug', get_query_var('term'), get_query_var('taxonomy') );

//set your arguments
$args = array(
     'hide_empty' => 0,
     'orderby' => 'name',
     'order' => 'DESC',
);

    //set your vars
$cycletaxonomy = 'author';
    // get all terms in a custom taxonomy

$cycleterms = get_terms($taxonomy, $args);

    // A for loop to cycle through all terms
for ($x=0; $x<count($cycleterms); $x++){
            // assign current cycled category slug - i could have used id too actually
    $thisslug = $cycleterms[$x]->slug;

    if ($curslug == $thisslug) {
        $nextslug = $cycleterms[$x+1]->slug;
        $prevslug = $cycleterms[$x-1]->slug;
        echo $nextslug;
        echo $prevslug;
                    // now do what you want with this slug - like putting it into a link tag
    }
};
1
alemur

Platziere diese Funktion in deiner functions.php:

function adjacent_post_by_category( $category, $direction, $content ) {

    // Info
    $postIDs = array();
    $currentPost = get_the_ID();


    // Get posts based on category
    $postArray = get_posts( array(

        'category' => $category,
        'orderby'=>'post_date',
        'order'=> 'DESC'

    ) );


    // Get post IDs
    foreach ( $postArray as $thepost ):

        $postIDs[] = $thepost->ID;

    endforeach;


    // Get prev and next post ID
    $currentIndex = array_search( $currentPost, $postIDs );
    $prevID = $postIDs[ $currentIndex - 1 ];
    $nextID = $postIDs[ $currentIndex + 1 ];


    // Return information
    if( $direction == 'next' AND $nextID ):

        return '<a rel="next" href="' . get_permalink( $nextID ) . '">' . $content . '</a>';

    elseif( $direction == 'prev' AND $prevID ):

        return '<a rel="prev" href="' . get_permalink( $prevID ) . '">' . $content . '</a>';

    else:

        return false;

    endif;

}

Und dies als Ihre vorherigen/nächsten Links (Funktionsparameter sind Beispiele):

<?php echo adjacent_post_by_category( 10, 'prev', 'Show previous post' ); ?>

<?php echo adjacent_post_by_category( 10, 'next', 'Show next post' ); ?>
0
Grandy

Kleines Update basierend auf Akmur-Antwort

$term = get_term_by('slug', get_query_var('term'), get_query_var('taxonomy'));
$curslug = $term->name;
$args = array(
    'hide_empty' => 0,
);
$cycletaxonomy = 'YOUR_TERM';
// get all terms in a custom taxonomy
$cycleterms = get_terms($taxonomy, $args);
// A for loop to cycle through all terms
for ($x = 0; $x < count($cycleterms); $x++) {
    // assign current cycled category slug - i could have used id too actually
    $thisslug = $cycleterms[$x]->name;

    if ($curslug == $thisslug) {
        $nextslug = $cycleterms[$x + 1]->name;
        $prevslug = $cycleterms[$x - 1]->name;
        echo '<ul class="post-nav">';
        if (!empty($nextslug)) {
            echo '<li class="next"><a href="' . get_term_link(intval($cycleterms[$x + 1]->term_id), 'YOUR_TERM') . '">' . $nextslug . '</a><li>';
        }
        if (!empty($prevslug)) {
            echo '<li class="previous"><a href="' . get_term_link(intval($cycleterms[$x - 1]->term_id), 'YOUR_TERM') . '">' . $prevslug . '</a><li>';
        }
        echo '</ul>';
        // now do what you want with this slug - like putting it into a link tag
    }
}
0
Morskia

Ich bin nicht sicher, welche Funktionen in WordPress integriert sind, aber Sie können

Holen Sie sich die nächsten und vorherigen Seiten und dann ihre Kategorie unter Verwendung der nächsten und vorherigen Beitrags-ID.

0
0_0