web-dev-qa-db-fra.com

Filtrer le plugin de la page d'index

Je recherche un plugin wordpress qui permette à mes utilisateurs de personnaliser les publications qui apparaissent sur la page d'accueil. Les utilisateurs doivent avoir une page de paramètres où ils peuvent sélectionner les catégories et les tags pour lesquels ils souhaitent voir les publications.

Savez-vous si quelque chose comme ça a été développé? Gratuit ou premium.

1
user1635

Je recherche un plugin wordpress qui permette à mes utilisateurs de personnaliser les publications qui apparaissent sur la page d'accueil.

Pas sûr qu'il y ait des plugins particuliers pour cela, mais c'est certainement possible avec quelques fonctions.

Les utilisateurs doivent avoir une page de paramètres où ils peuvent sélectionner les catégories et les tags pour lesquels ils souhaitent voir les publications.

Plus simple que de fournir une page de paramètres distincte de la page de profil, je suggère en fait d'ajouter quelques nouveaux champs à la page de profil de l'utilisateur. Vous pouvez appeler la section préférences de la page d'accueil ou tout ce que tu aimes.

L'exemple suit ...

Étape 1 - Ajouter des champs personnalisés à la page de profil de l'utilisateur

Ici, j’ai adopté la même approche que Mike en répondant:
Comment ajouter des champs de formulaire personnalisés à la page de profil utilisateur , en activant deux actions pour prendre en compte les sauvegardes de profil utilisateur et les modifications apportées par l'administrateur.

add_action( 'show_user_profile', 'home_prefs_profile_fields' );
add_action( 'edit_user_profile', 'home_prefs_profile_fields' );

function home_prefs_profile_fields( $user ) { 

    $um = get_user_option( 'taxonomy_selection', $user->ID );
    $tags = ( isset( $um['post_tag'] ) ) ? $um['post_tag'] : array();
    $cats = ( isset( $um['categories'] ) ) ? $um['categories'] : array();
    ?>
    <div id="home-prefs">
    <h3>Home Preferences</h3>
    <table class="form-table">
        <tr>
            <th>
                <label for="tax_input[post_tag]">Tags</label><br />
                <span class="description">Choose which tags you want to display on the home page.</span>
            </th>
            <td>
                <ul id="tag-checklist">
                    <?php wp_terms_checklist( 0, array( 'taxonomy' => 'post_tag', 'selected_cats' => $tags ) ); ?>
                </ul>
                <br class="clear" />
                <hr />
            </td>
        </tr>
        <tr>
            <th>
                <label for="post_category">Categories</label><br />
                <span class="description">Choose which categories you want to display on the home page.</span>
            </th>
            <td>
                <ul id="category-checklist">
                    <?php wp_category_checklist( 0, 0, $cats, false ) ?>
                </ul>
            </td>
        </tr>
    </table>
    </div>
    <?php 
}

Des informations sur les listes de contrôle des termes et des catégories sont disponibles dans le code source (pas encore de documentation).
http://core.trac.wordpress.org/browser/tags/3.0.2/wp-admin/includes/template.php#L217

Étape 2 - Gérez la sauvegarde des données sur la mise à jour de profil/utilisateur

Encore une fois, deux actions, selon qu’il s’agit d’un utilisateur qui enregistre les modifications de profil ou d’un autre utilisateur qui modifie le profil d’un autre utilisateur.

add_action( 'personal_options_update', 'save_home_prefs' );
add_action( 'edit_user_profile_update', 'save_home_prefs' );

function save_home_prefs( $user_id ) {

    if ( !current_user_can( 'edit_user', $user_id ) )
        return false;

    $data = array();

    if( isset( $_POST['tax_input'] ) ) {
        foreach( $_POST['tax_input'] as $taxonomy => $term_ids )
            if( !taxonomy_exists( $taxonomy ) )
                continue;
            else
                $data[$taxonomy] = array_map( 'intval', $term_ids );
    }

    if( isset( $_POST['post_category'] ) )
        $data['categories'] = $_POST['post_category'];

    update_user_meta( $user_id, 'taxonomy_selection', $data );
}

REMARQUE: Il ne serait pas mal d'ajouter une désinfection supplémentaire à ce qui précède.

Étape 3 - Ajustez le CSS

Indentez les termes enfants, faites flotter les éléments de la liste principale, de sorte que les taxonomies trop occupées consomment moins de hauteur.

add_action( 'admin_print_styles-user-edit.php', 'tax_checklist_css' );
add_action( 'admin_print_styles-profile.php', 'tax_checklist_css' );

function tax_checklist_css() {
    ?>
    <style type="text/css">
        .children { text-indent: 20px }
        #tag-checklist li { float:left;width:30% }
        #category-checklist li { float:left;width:30% }
        #category-checklist li li { float:none;width:auto }
    </style>
    <?php
}

REMARQUE: Une largeur de 30% sur les éléments de la liste vous donne en gros l'apparence de 3 colonnes de termes. Nous vous invitons à ajuster le code CSS à votre guise.

Cela pourrait aussi facilement être transformé en une file d'attente, ce qui offrira un certain niveau de mise en cache, le CSS en ligne est plus rapide à tester, c'est tout ...;)

Étape 4 - Filtrer la requête d'accueil en fonction des préférences de l'utilisateur

Ajoutez un filtre sur les requêtes personnelles en fonction des paramètres configurés par l'utilisateur pour les balises et les catégories.

add_action( 'pre_get_posts', 'do_user_post_selection' );

function do_user_post_selection( $query ) {

    if( !is_home() || !is_user_logged_in() )
        return;

    if( isset( $query->query_vars['post_type'] ) && ( 'nav_menu_item' == $query->query_vars['post_type'] ) )
        return; 
    if( 1 < did_action('wp') )
        return;
    global $current_user;

    $tax_selection = get_user_option( 'taxonomy_selection', $current_user->ID );

    if( empty( $tax_selection ) )
        return;

    if( isset( $tax_selection['categories'] ) && ( is_array( $tax_selection['categories'] ) ) && ( !empty( $tax_selection['categories'] ) ) ) 
        $query->set( 'category__in', $tax_selection['categories'] );
    if( isset( $tax_selection['post_tag'] ) && ( is_array( $tax_selection['post_tag'] ) ) && ( !empty( $tax_selection['post_tag'] ) ) ) 
        $query->set( 'tag__in', $tax_selection['post_tag'] );

    return;
}

NOTE: Vous n'avez pas besoin d'utiliser un filtre pre_get_posts, vous pouvez utiliser parse_query ou transmettre des valeurs à un objet WP_Query. Personnellement, je trouve le hook choisi facile à utiliser (et ce que je suis habitué à utiliser).

UPDATE: Déplace les éléments de la préfecture vers le haut de la page de profil.

function move_prefs() {
    ?>
    <script type="text/javascript">
        jQuery(document).ready(function($){
            $('#home-prefs').prependTo('#your-profile');
            $('input[type=checkbox]').attr('disabled',false);
        });
    </script>
    <?php
}

add_action( 'admin_head-user-edit.php', 'move_prefs' );
add_action( 'admin_head-profile.php', 'move_prefs' );

NOTE: Il y a une légère mise à jour HTML de la fonction home_prefs_profile_fields également requise, j'ai mis à jour la fonction comme il convient dans Étape 1 .

RE: Cases à cocher désactivées des abonnés (voir les commentaires). La raison en est due à une vérification de la fonctionnalité des fonctions de liste de contrôle. Ces fonctions sont généralement utilisées. sur les écrans de type post-création, attendez-vous donc à ce que l'utilisateur ait la possibilité d'attribuer des termes à un post (ou un type), cela ne s'applique évidemment pas à ce cas particulier, nous pouvons donc supprimer en toute sécurité l'attribut désactivé (jQuery ci-dessus a été modifié avec le changement approprié).

J'espère que cela pourra aider... :)

1
t31os

Ce code n'a pas été testé, mais mettez-le dans votre fichier function.php et voyez ce qui se passe.

En théorie, cela devrait arriver:

  • Il ajoute un élément de menu supplémentaire dans l'interface d'administration
  • Ajoute deux méta-boîtes pour les catégories et les balises

Dans votre modèle, tout ce que vous avez à faire est d’obtenir les valeurs des balises META en utilisant ceci:

$categories = get_option('fp_categories');
$tags = get_option('fp_tags');;

Ensuite, utilisez ceci dans votre query_post.

C'est le plugin/code:

add_action('admin_menu', 'cms_options_menu');


function cms_options_menu() {

    //create new top-level menu
    add_menu_page('CMS options', __('CMS options'), 'administrator', __FILE__, 'cms_options_page',plugins_url('/images/icon.png', __FILE__));
    //call register settings function
    add_action( 'admin_init', 'register_cms_options' );
}


function register_cms_options() {
  //register our settings
  register_setting( 'cms-options', 'fp_categories' );
  register_setting( 'cms-options', 'fp_tags' );
}


function cms_options_page() {
?>
<div class="wrap">
<h2>CMS settings</h2>

<form method="post" action="options.php">
    <?php settings_fields( 'cms-options' ); ?>
    <table class="form-table">
        <tr valign="top">
          <td scope="row"><?php _e('Categories');?></td>
          <td><input type="text" name="fp_categories" class="regular-text" value="<?php echo get_option('fp_categories'); ?>" /></td>
        </tr>
        <tr valign="top">
          <td scope="row"><?php _e('Tags');?></td>
          <td><input type="text" name="fp_tags" class="regular-text" value="<?php echo get_option('fp_tags); ?>" /></td>
        </tr>                       
    </table>

    <div id="fileBrowser" title="File browser"> </div>

    <p class="submit">
    <input type="submit" class="button-primary" value="<?php _e('Save Changes') ?>" />
    </p>

</form>
</div>
<?php }
0
Steven

Avez-vous examiné le plug-in des requêtes de requêtes de Justin Tadlock?

0
ZaMoose