web-dev-qa-db-ja.com

フィルタインデックスページプラグイン

私は私のユーザーがどの投稿がホームページに表示されるかをカスタマイズすることを可能にするワードプレスプラグインを探しています。ユーザーは、自分が投稿を見たいカテゴリとタグを選択できる設定ページを用意する必要があります。

そのようなものが開発されたかどうか知っていますか?無料またはプレミアム.

1
user1635

私は私のユーザーがどの投稿がホームページに表示されるかをカスタマイズすることを可能にするワードプレスプラグインを探しています。

このための特定のプラグインがあるかどうかわからないが、それは確かにいくつかの機能で可能です。

ユーザーは、自分が投稿を見たいカテゴリとタグを選択できる設定ページを用意する必要があります。

プロフィールページとは別の設定ページを用意するよりも簡単です。実際には、ユーザーのプロフィールページに新しいフィールドをいくつか追加することをお勧めします。home preferencesというセクションを呼び出します。 /またはあなたが好きなものは何でも。

例が続きます...

ステップ1 - ユーザープロフィールページにカスタムフィールドを追加する

ここで私は答えるときマイクがしたのと同じアプローチを取りました:
ユーザープロファイルページにカスタムフォームフィールドを追加する方法 、ユーザープロファイルの保存と管理者ユーザーによる編集を考慮して2つのアクションを実行する方法。

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 - プロファイル/ユーザーアップデートの保存データを処理する

繰り返しますが、ユーザーがプロファイルの変更を保存しているのか、別のユーザーが別のユーザーのプロファイルを変更しているのかに応じて、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オブジェクトに値を渡すこともできます。それが私が使っているものです。).

UPDATE:ホーム設定要素をプロファイルページの一番上に移動します。

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' );

注:home_prefs_profile_fields関数へのHTMLのわずかな更新も必要です。で必要に応じて関数を更新しました。 /ステップ1 .

RE:購読者から無効になっていることを示すチェックボックス(コメントを参照)。これが発生するのは、チェックリスト機能という用語の機能チェックによるものです。通常は投稿作成タイプの画面で使用されるので、ユーザーが投稿(またはタイプ)に用語を割り当てる機能を持っていることを期待します。これは明らかにこの特定のケースには当てはまりません。適切な変更を加えて修正されました。

それが役立つことを願っています... :)

1
t31os

このコードはテストされていませんが、それをあなたのfunction.phpファイルに入れて、何が起こるのかを見てください。

理論的にはこうなるはずです。

  • それは管理インターフェイスに追加のメニュー項目を追加します
  • カテゴリとタグに2つのメタボックスを追加します

あなたのテンプレートでは、これを使用してメタタグから値を取得するだけです。

$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
Steven

Justin Tadlockの Query Posts プラグインを見ましたか?

0
ZaMoose