web-dev-qa-db-fra.com

Comment obtenir la catégorie précédente suivante dans la même taxonomie?

Comme la fonction WP get_adjacent_post donne les données de publication suivantes et précédentes en fonction des paramètres que je souhaite obtenir, les données de catégorie suivantes/précédentes sont-elles présentes dans la fonction WP qui effectue le bon travail ou doit écrire une commande personnalisée requête pour cela.

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

je veux la catégorie suivante par category slug ou par category id

Toute aide serait appréciée

1
M Khalid Junaid

C’est ce que j’ai proposé avec une solution de requête personnalisée pour espérer pouvoir aider les autres. J’ai écrit une fonction personnalisée qui fonctionne pour toutes les catégories de type de publication (publication, types de publication personnalisés)

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

Existe-t-il une fonction intégrée WP qui effectue le bon travail?

Non.

[Dois-je] écrire une requête personnalisée pour cela?

Utilisez get_terms () . Voici un exemple.


Ajoutez la classe wpse_99513_adjacent_category au fichier de thème functions.php et appelez-la comme suit:

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

- 'catégorie' est la taxonomie,
- 'id' est le champ pour commander la requête de base de données par et
- false affiche les catégories vides.

Pour obtenir la taxonomie suivante, utilisez ceci:

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

- $ category est l'id de la catégorie que vous vérifiez,
- $ next_category est défini sur false s'il existe une erreur et l'ID suivant dans le cas contraire.

Le précédent fonctionne de la même manière:

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

- $ category est l'id de la catégorie que vous vérifiez,
- $ previous_category est défini sur false s'il existe une erreur et l'ID précédent dans le cas contraire.

Pour les slugs qui ignorent les catégories vides, utilisez:

$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
Charles Clarkson

C'est ce que je suis venu avec. Peut-être pas le meilleur mais ça marche :)

En supposant que nous sommes sur une page de catégorie de taxonomie personnalisée, et que nous voulons aller à la prochaine

// 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

Placez cette fonction dans votre 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;

}

Et ceci comme liens précédent/suivant (les paramètres de fonction sont des exemples):

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

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

Petite mise à jour basée sur la réponse d'Akmur

$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

Je ne suis pas sûr des fonctions intégrées à WordPress, mais vous pouvez

Obtenez les pages suivantes et précédentes et que leur catégorie en utilisant les identifiants des publications suivantes et précédentes.

0
0_0