web-dev-qa-db-fra.com

Devrais-je utiliser le menu personnalisé, C.P.T. ou des options de thème, ou quelque chose d'autre pour cela?

Sur de nombreux sites (en particulier les sites commerciaux de style CMS), il y a 2, 3 4 ou parfois plusieurs zones contenant généralement un titre, une icône et du texte. Ceux-ci apparaissent sous l’en-tête des liens vers les parties stratégiques du site.

J'ai configuré mon thème personnalisé afin que l'utilisateur puisse choisir les parties du site auxquelles lier ces zones via les options de thème; mais je peux penser à au moins deux ou trois autres moyens de le faire, et je me demande si j'ai fait le bon choix.

Les options alternatives incluent

  1. Configuration sous forme de menu personnalisé WordPress (qui n’afficherait que les 4 premiers liens dans mon cas) (même si dans les menus, j’espérais vraiment afficher ces 4 liens dans un div, c’est pas du tout, alors je ne suis pas sûr des menus
  2. un type de message personnalisé dans lequel l'utilisateur peut configurer des "mosaïques" ou quelque chose du genre, fonctionnant de la même manière.
  3. Je pourrais aussi imaginer une catégorie spéciale et utiliser une requête, mais je ne pense pas que cela fonctionnerait pour moi.

Quelqu'un a-t-il une sagesse/expérience/avantages et inconvénients à partager à ce sujet? Y a-t-il une raison d'éviter complètement l'une des options?

1
byronyasgur

Sur mon site Web, j'ai utilisé les types de publication personnalisés pour obtenir une version légèrement plus complexe de ce que vous essayez de faire.

Front-end

Mes exigences étaient;

  • Texte enrichi sur le titre
  • Animation JavaScript pour basculer entre les "éléments en vedette" (non abordés ici)
  • Possibilité de modifier facilement les éléments présentés à partir du back-end pour les utilisateurs administrateurs
  • Possibilité de créer un lien hypertexte des éléments en vedette avec n'importe quoi sur notre site Web, que ce soit un article; Blog; nouvelles post; profil d'espèce ou entrée dans le glossaire

J'ai décidé que les TPC étaient la voie à suivre; C’est l’interface que j’ai développée dans la zone administrative de notre installation WP un peu sur mesure.

Admin area


Le code du type de message personnalisé lui-même est assez simple. J'ai créé un dossier dans mon répertoire plugins appelé sf-featured-items et créé un fichier php portant le même nom.

Voici le code complet. Cela a l'air beaucoup plus complexe qu'il ne l'est réellement!

<?php
/*
   Plugin Name: Seriously Fish: Featured Items
   Plugin URI: http://dunc.seriouslyfish.com
   Description: This plugin allows administrators to control the "Featured.." banner on index.php of Seriously Fish.
   Version: 0.1
   Author: Duncan Wraight
   Author URI: http://dunc.seriouslyfish.com
   License: GPL2

   Copyright 2012  DUNCAN WRAIGHT  (email : [email protected])

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License, version 2, as
   published by the Free Software Foundation.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

if (!class_exists('FeaturedItem')) :

class FeaturedItem {

    var $plugin_url;

    function FeaturedItem()
    {
    $this->plugin_url = trailingslashit(plugins_url('sf-featured-items'));
    }

    function enqueue_scripts() {
        /* start of replacement tinyMCE instance
        wp_register_script('cleditor', $this->plugin_url .'cleditor/jquery.cleditor.min.js', array('jquery'));
    wp_enqueue_script('cleditor'); */
    }

    function enqueue_styles() {
        /* Image upload styles
    wp_enqueue_style('thickbox'); */
    }

    function register_featured_item(){

        $labels = array(
          'name' => _x('Featured Item', 'post type general name'),
          'singular_name' => _x('Featured Item', 'post type singular name'),
          'add_new' => _x('Add New', 'profile'),
          'add_new_item' => __('Add New Featured Item'),
          'edit_item' => __('Edit Featured Item'),
          'new_item' => __('New Featured Item'),
          'view_item' => __('View Featured Item'),
          'search_items' => __('Search Featured Items'),
          'not_found' =>  __('No featured items found'),
          'not_found_in_trash' => __('No featured items found in Trash'),
          'parent_item_colon' => '',
          'menu_name' => 'Featured'

        );
        $args = array(
          'labels' => $labels,
          'public' => true,
          'publicly_queryable' => false,
          'exclude_from_search' => true,    
          'show_ui' => true,
          'show_in_menu' => true,
          'query_var' => true,
          'rewrite' => false,
          'capability_type' => 'post',
          'has_archive' => false,
          'hierarchical' => false,
          'menu_position' => 50,
          'menu_icon' => $this->plugin_url . 'images/star.png',
          'supports' => array('title','editor','thumbnail')
        );

        add_filter('post_updated_messages', 'featured_items_updated_messages');

        function featured_items_updated_messages( $messages ) {
            global $post, $post_ID;

            $messages['species'] = array(
                0 => '', // Unused. Messages start at index 1.
                1 => sprintf( __('Featured item updated. <a href="%s">View</a>.'), esc_url( get_permalink($post_ID) ) ),
                2 => __('Custom field updated.'),
                3 => __('Custom field deleted.'),
                4 => __('Featured item updated.'),
                /* translators: %s: date and time of the revision */
                5 => isset($_GET['revision']) ? sprintf( __('Featured item restored to revision from %s.'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
                6 => sprintf( __('Featured item published. <a href="%s">View</a>.'), esc_url( get_permalink($post_ID) ) ),
                7 => __('Featured item saved.'),
                8 => sprintf( __('Featured item submitted. <a target="_blank" href="%s">Preview</a>.'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
                9 => sprintf( __('Featured item scheduled for: <strong>%1$s</strong>. <a target="_blank" href="%2$s">Preview</a>.'),
                // translators: Publish box date format, see http://php.net/date
                date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ),
                10 => sprintf( __('Featured item draft updated. <a target="_blank" href="%s">Preview</a>.'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
            );

            return $messages;
        }

        register_post_type('featured-item', $args);
    }

    function meta_link(){
        global $post;

        if ($post->ID) {
            $link_to_post = get_post_meta( $post->ID , 'link_to_post', TRUE );
        }

        ?>

    <?php wp_nonce_field( plugin_basename( __FILE__ ), 'sf_featured_noncename' ); ?>
    <div class="meta_control">
        <p>Make sure you use the permalink (i.e. written link) rather than the short link (numeric).</p>
        <input type="text" name="link_to_post" class="range" value="<?php if (isset($link_to_post)) { echo esc_attr($link_to_post); } ?>" />
    </div>
        <?php
    }

    function register_featured_meta(){
        add_meta_box("link_to_post", "Link to Post", array($this, 'meta_link'), "featured-item", "normal", "core");
    }

    function update_featured_meta(){
        global $post;

        if ($post) {
            if($post->post_type != 'featured-item')
                return;

            if ( !wp_verify_nonce( $_POST['sf_featured_noncename'], plugin_basename( __FILE__ ) ) )
                return;

            // Taxonomy meta
            update_post_meta( $post->ID, "link_to_post", $_POST["link_to_post"] );
        }
    }

}

else :
    exit("Class FeaturedItem already exists.");
endif ;

/* INSTANCE CLASS */
if (!isset($FeaturedItem)) {
    $FeaturedItem = new FeaturedItem();
}

if (isset($FeaturedItem)) {
    add_action( 'init' , array (&$FeaturedItem, 'register_featured_item' ));
    add_action( 'admin_enqueue_scripts', array (&$FeaturedItem, 'enqueue_scripts' ));
    add_action( 'admin_enqueue_scripts', array (&$FeaturedItem, 'enqueue_styles' ));
    add_action( 'admin_init' , array( &$FeaturedItem, 'register_featured_meta' ));
    add_action( 'save_post' , array( &$FeaturedItem, 'update_featured_meta' ));
}


?>

La complexité ajoutée est quelque chose dont vous n'avez peut-être pas besoin - le lien vers l'article. En regardant en arrière, j'aurais pu laisser cela complètement et simplement utiliser la fonction d'hyperlien intégrée de l'éditeur de texte enrichi.

Le code pour le front-end est assez simple aussi:

  • créer une requête post secondaire (WP_Query)
  • récupérer les publications de type featured-item uniquement
  • limiter les publications en utilisant posts_per_page => 3;
  • lancer <?php while ( $query->have_posts() ) : $query->the_post(); ?>
  • afficher les messages, modifier pour la mise en forme si nécessaire (la mise en forme du code ci-dessous est assez complexe, car j’ai un demi exemple esthétique sur Internet dont j’ai aimé le look)

...

<?php $query = new WP_Query(
        array(
            'post_type' => 'featured-item',
            'posts_per_page' => 3,
            'meta_query' => array( array( 'key' => '_thumbnail_id' ) )
        )
    ); 
?>

<div id="featured" >
    <?php
        $li = ''; 
        $content = '';
        $count = 1;
    ?>

    <?php while ( $query->have_posts() ) : $query->the_post(); ?>

    <?php 
        if ($count == 1) {
            $li .= '<li class="ui-tabs-nav-item ui-tabs-selected" id="nav-fragment-'. $count .'"><a href="#fragment-'. $count .'"><p>'. get_the_title() . '</p><span>'. get_the_content() .'</span></a></li>';
            $content .= '<div id="fragment-'. $count .'" class="ui-tabs-panel" style="">
                    '. get_the_post_thumbnail($post->ID, 'indexheader-thumb') .'
                     <div class="info" >
                        <p>'. get_the_title() . '</p>
                        <h2><a href="'. get_post_meta( $post->ID , 'link_to_post', TRUE ) .'" >'. get_the_content() .'</a></h2>
                     </div>
                </div>';
        } else {
            $li .= '<li class="ui-tabs-nav-item" id="nav-fragment-'. $count .'"><a href="#fragment-'. $count .'"><p>'. get_the_title() .'</p><span>'. get_the_content() .'</span></a></li>';
            $content .= '<div id="fragment-'. $count .'" class="ui-tabs-panel ui-tabs-hide" style="">
                    '. get_the_post_thumbnail($post->ID, 'indexheader-thumb') .'
                     <div class="info" >
                        <p>'. get_the_title() . '</p>
                        <h2><a href="'. get_post_meta( $post->ID , 'link_to_post', TRUE ) .'" >'. get_the_content() .'</a></h2>
                     </div>
                </div>';
        }

        $count++;
    ?>

    <?php endwhile; ?>

    <?php wp_reset_query(); ?>

    <ul class="ui-tabs-nav">
        <?php echo $li; ?>
    </ul>

    <!-- First Content -->
    <?php echo $content; ?>

</div>

Si vous voulez essayer cela, n'hésitez pas à me harceler pour des informations supplémentaires.

2
dunc