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.
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 ...
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
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.
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 ...;)
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... :)
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:
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 }
Avez-vous examiné le plug-in des requêtes de requêtes de Justin Tadlock?