web-dev-qa-db-fra.com

Obtenir un type de message personnalisé par catégorie dans un modèle de page

J'ai créé un type d'article personnalisé avec des catégories et des sous-catégories. Ce que je dois faire est de répertorier les titres et les images des articles pour une sous-catégorie ou une catégorie donnée dans un modèle de page.

J'ai eu jusqu'à obtenir tous les éléments énumérés dans le type de message personnalisé, mais je ne sais pas comment aller plus loin ... toute aide appréciée.

<?php 
$args = array( 'post_type' => 'portfolio', 'posts_per_page' => 10 );
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
the_title();
echo '<div class="entry-content">';
the_content();
echo '</div>';
endwhile;
?>

La fonction qui crée le type d'article personnalisé et la taxonomie ressemble à ceci: -

<?php

//      CUSTOM POST TYPE 1
add_action('init', 'portfolio_register');

function portfolio_register() {
    $args = array(
        'label' => __('Portfolio'),
        'singular_label' => __('Portfolio'),
        'public' => true,
        'show_ui' => true,
        'capability_type' => 'post',
        'hierarchical' => false,
        'rewrite' => true,
        'supports' => array('title', 'editor', 'thumbnail')
    );

    register_taxonomy("galleries", array("portfolio"), array(
        "hierarchical" => true, 
        "label" => "Galleries", 
        "singular_label" => "Galleries", 
        "rewrite" => true)
    );

    register_post_type( 'portfolio' , $args );
}


add_action("admin_init", "admin_init");
add_action('save_post', 'save_portfolio_options');
add_action('save_post', 'save_portfolio_single_options');

function admin_init(){
    add_meta_box("gallerymeta", "Gallery Options", "portfolio_meta_options", "portfolio", "normal", "low");
    add_meta_box("portfoliometa", "Portfolio Item Options", "portfolio_single_meta_options", "portfolio", "side", "low");
}

function portfolio_meta_options(){
    global $post;
    $custom = get_post_custom($post->ID);
    $excerpt = $custom["excerpt"][0];
    $info = $custom["info"][0];
    $linkto = $custom["linkto"][0];
?>
3
toomanyairmiles

Ceci est une version d'une fonction que j'utilise dans le cadre sur lequel je travaille, avec l'exemple html remplaçant une autre fonction contenant quelque chose de similaire.

// Custom Loop

function arrr_custom_loop( $r_type = 'post', $r_post_num, $r_tax = 'category', $r_terms = 'featured' )  {
$args = array( 
    'showposts' => $r_post_num, 
    'tax_query' => array( 
        array( 
            'post_type' => $r_type,
            'taxonomy' => $r_tax, 
            'field' => 'slug', 
            'terms' => array( 
                $r_terms 
            ), 
        )
    )
);
query_posts( $args );
if (have_posts())
while ( have_posts() ) : the_post();
$more = 0;
?>
<article>
                <header class="pagetitle">
<?php if ( is_singular() )  { ?>
                    <h1><?php the_title(); ?></h1>
<?php } else { ?>
                    <h2 class="entry"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<?php } ?>
                </header>
                <div class="content_wrapper">
                    <div class="content">
<?php the_content(); ?>
                    </div>
                </div>
<?php if ( comments_open() && ! post_password_required() )  { ?>
                <div class="comments_wrapper">
                    <div class="comments">
<?php comments_template(); ?>
                    </div>
                </div>
<?php } ?>
        </article>
<?php endwhile;
wp_reset_query();
}

Donc, vous utiliseriez simplement la fonction avec les arguments créés:

arrr_custom_loop( 'portfolio', 10, 'galleries', 'pirates' );
3
Jeff Sebring

Vous pouvez l'obtenir si vous avez/connaissez la catégorie/sous-catégorie slug ...

Il suffit de le passer dans le tableau args pour query_posts.

$args = array( 'post_type' => 'portfolio', 'posts_per_page' => 10 ,'taxonomy_name'=>'slug of category/subcategory');

query_posts($args); 
1
Rajeev Vyas

Je l'ai déjà utilisé auparavant pour faire plus que ce dont vous avez besoin, mais si vous supprimez la deuxième taxonomie, tous les articles d'une catégorie donnée seront répertoriés pour vous:

<?php
                    // set up taxonomies
                    $tax_one = 'project_category';
                    $tax_two = 'brand';
                    $post_type = 'project';

                    $categories = get_categories( array(
                        'type'                     => $post_type,
                        'orderby'                  => 'name',
                        'order'                    => 'ASC',
                        'hide_empty'               => 0,
                        'hierarchical'             => 1,
                        'taxonomy'                 => $tax_one ));

                        foreach ( $categories as $category ) : // list all categories

                            echo '<li><a href="'.get_term_link( $category->slug, $tax_one ).'">'.$category->name.'</a><ul>'?>

                                    <?php $terms = get_terms( $tax_two, array( 'hide_empty' => 0 ) );

                                            foreach ( $terms as $term ) :  // list all brands in each category

                                                $myquery['tax_query'] = array(
                                                    array(
                                                        'taxonomy' => $tax_one,
                                                        'terms' => array($category->slug),
                                                        'field' => 'slug',
                                                    ),
                                                    array(
                                                        'taxonomy' => $tax_two,
                                                        'terms' => array($term->slug),
                                                        'field' => 'slug',
                                                    )
                                                        );
                                                $the_posts = new WP_Query($myquery);

                                                if ( $the_posts->have_posts() ) : // if there are posts in the current brand and category then display it

                                                    echo '<li><a href="'.get_term_link( $term->slug, $tax_two ).'">'.$term->name.'</a></li>';

                                                endif;

                                            endforeach; ?>

                            <?php echo '</ul></li>';

                        endforeach; ?>

donc peaufiner pour votre situation:

<?php
                    // set up taxonomies
                    $tax_one = 'category';
                    $post_type = 'portfolio';

                    $categories = get_categories( array(
                        'type'                     => $post_type,
                        'orderby'                  => 'name',
                        'order'                    => 'ASC',
                        'hide_empty'               => 0,
                        'hierarchical'             => 1,
                        'taxonomy'                 => $tax_one ));

                        foreach ( $categories as $category ) : // list all categories

                            echo '<li><a href="'.get_term_link( $category->slug, $tax_one ).'">'.$category->name.'</a><ul>'?>

                                    <?php $the_posts = new WP_Query($myquery);

                                                if ( $the_posts->have_posts() ) : // if there are posts in the current category then display it

                                                foreach($the_posts as $post) :

                                                    echo '<li>Your Post stuff here</li>';
                                                endforeach;                                    



                                                endif;

                                            endforeach; ?>

                            <?php echo '</ul></li>';

                        endforeach; ?>

Je n'ai pas du tout testé cela, mais j'espère que cela aidera!

À votre santé,

Dave

0
daveaspinall

La réponse de Rajeev a fonctionné pour moi en utilisant votre code. Dans une installation vierge, j'ai fait ce qui suit:

  1. créé un fichier functions.php contenant uniquement votre fonction portfolio_register et le hook add_action qui l'appelle
  2. créé deux galeries - "aérienne" et "pas aérienne".
  3. a créé quatre portfolios - "antenne 1", "antenne 2", "pas aérienne" et "pas de galerie", en les plaçant dans les galeries comme l'indique leur nom (ou aucun dans le cas de "pas de galerie").
  4. créé index.php contenant uniquement le premier bloc de code que vous avez collé. La seule modification que j'ai apportée a été d'ajouter 'galleries'=>'aerial' à votre variable $args:

$args = array( 'post_type' => 'portfolio', 'posts_per_page' => 10, 'galleries'=>'aerial' );

Seules "antenne 1" et "antenne 2" étaient affichées.

Toute chance que votre code ne soit pas appelé (un modèle différent peut-être)?

0
Hobo