Плагин для фильтрации индексной страницы
Я ищу плагин wordpress, который позволяет моим пользователям настраивать, какие сообщения появляются на домашней странице. У пользователей должна быть страница настроек, на которой они могут выбрать, из каких категорий и тегов они хотели бы видеть сообщения.
Знаете ли вы, было ли разработано что-либо подобное? Бесплатно или премиум.
3 answers
Я ищу плагин wordpress, который позволяет моим пользователям настраивать, какие сообщения появляются на главной странице.
Не уверен, что для этого есть какие-то конкретные плагины, но это, безусловно, возможно с помощью нескольких функций.
У пользователей должна быть страница настроек, где они могут выбрать, из каких категорий и тегов они хотели бы видеть сообщения.
Проще, чем предоставить страницу настроек, отдельную от страницы профиля, я бы на самом деле предлагаю добавить пару новых полей на страницу профиля пользователя, вы можете позвонить в раздел домашние настройки или как вам угодно.
Ниже приведен пример...
Шаг 1 - Добавьте пользовательские поля на страницу профиля пользователя
Здесь я использовал тот же подход, что и Майк, когда отвечал:
Как добавить пользовательские поля формы на страницу профиля пользователя, выполнив два действия для учета сохранения профиля пользователя и администратора пользователя правки.
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
}
Информацию о контрольных списках терминов и категорий можно найти в источнике (документов пока нет).
http://core.trac.wordpress.org/browser/tags/3.0.2/wp-admin/includes/template.php#L217
Шаг 2 - Обработка сохранения данных при обновлении профиля/пользователя
Опять же, два действия, в зависимости от того, пользователь сохраняет изменения профиля или другой пользователь вносит изменения в профиль другого пользователя.
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 );
}
ПРИМЕЧАНИЕ: Не помешало бы добавить дальнейшая дезинфекция в соответствии с вышеизложенным.
Шаг 3 - Настройка CSS
Выделяйте дочерние термины, перемещайте элементы основного списка, чтобы таксономии занятости не занимали так много места.
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
}
ПРИМЕЧАНИЕ: ширина 30% в элементах списка в основном дает вам вид 3 столбцов терминов, вы можете настроить CSS в соответствии с ними.
Это также может быть так же легко превращено в очередь, что обеспечит некоторый уровень кэширования, встроенный CSS быстрее тестируется. все...;)
Шаг 4 - Отфильтровать домашний запрос на основе пользовательских предпочтений
Добавьте фильтр к домашним запросам на основе пользовательских настроек тегов и категорий.
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;
}
ПРИМЕЧАНИЕ: Вам не нужно использовать фильтр pre_get_posts
, вы можете использовать parse_query
или передавать значения в объект WP_Query
, я лично просто нахожу выбранный крючок простым в использовании (и это то, что я привык использовать).
ОБНОВЛЕНИЕ: Переместите элементы home prefs в верхнюю часть профиля страница.
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' );
ПРИМЕЧАНИЕ: Также требуется небольшое обновление HTML для функции home_prefs_profile_fields
, я обновил функцию соответствующим образом на шаге 1.
RE: Флажки, показывающие отключенных от подписчиков (см. Комментарии). Причина, по которой это происходит, связана с проверкой возможностей в функциях контрольного списка терминов, эти функции обычно используются на экранах типов после создания, поэтому ожидайте, что у пользователя будет возможность назначать термины сообщение (или тип), это, очевидно, не относится к данному конкретному случаю, поэтому мы можем безопасно удалить из них атрибут disabled (jQuery выше был дополнен соответствующим изменением).
Надеюсь, это поможет...:)
Вы смотрели на плагин Джастина Тэдлока Для сообщений с запросами ?
Этот код не проверен, но поместите его в свой function.php подайте файл и посмотрите, что произойдет.
Теоретически это должно произойти:
- Он добавляет дополнительный пункт меню в интерфейс администратора
- Добавляет два мета-поля для категорий и тегов
В вашем шаблоне все, что вам нужно сделать, это получить значения из мета-тегов, используя следующее:
$categories = get_option('fp_categories');
$tags = get_option('fp_tags');;
Затем используйте это в себе query_post
.
Это плагин/код:
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 }