Плагин для фильтрации индексной страницы


Я ищу плагин wordpress, который позволяет моим пользователям настраивать, какие сообщения появляются на домашней странице. У пользователей должна быть страница настроек, на которой они могут выбрать, из каких категорий и тегов они хотели бы видеть сообщения.

Знаете ли вы, было ли разработано что-либо подобное? Бесплатно или премиум.

Author: Travis Northcutt, 2010-12-12

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 выше был дополнен соответствующим изменением).

Надеюсь, это поможет...:)

 1
Author: t31os, 2017-04-13 12:37:34

Вы смотрели на плагин Джастина Тэдлока Для сообщений с запросами ?

 0
Author: ZaMoose, 2010-12-13 12:19:02

Этот код не проверен, но поместите его в свой 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 }
 0
Author: Steven, 2010-12-15 14:08:33