0

私のメニューでは、「ランダム」と呼ばれるリンクになりたいと思っています。クリックすると、つまずきのようにランダムな記事が開きます。私はそこから行ってこれを達成するかもしれないテンプレートthinkinkを作りました。しかし、私はできませんでした。ページ上に存在する唯一のリンクを開き、テンプレート自体によって(そのphpコードの助けを借りて)ランダムに生成されたリンクを開く方法を尋ねています。私が望むリダイレクトの種類(ただし高速)これは2ステップのアクションで機能する可能性があると思いました:最初に、ユーザーがメニューから[ランダム]をクリックすると、/ randompageが開き、ランダムリンク(私の記事リンクの1つ)が表示されますその上に。2番目に私はそのリンクを直接(自動)開くようにしたいので、ページの他のロードインは必要ありません。このように行うことはできますか?またはそれに何か他のものがありますか?ページは完全に空です。(DNSの変更により、私のWebサイトはオフラインになりました。数時間で稼働します)。私が自分自身を理解させたことを願っています、私はこれを説明する他の方法がわかりません。これをもっとよく説明できないのなら、私は本当に申し訳ありません。

4

2 に答える 2

0

たぶん、このアプローチの方が良いでしょう:

管理メニューから割り当てられたクラス「ランダム」を持つメニュー項目の投稿へのランダムリンクを生成する、ナビゲーションメニュー用のカスタムウォーカーを用意しました。

したがって、この作業を行うには、このコードをコピーしてfunctions.phpに貼り付ける必要があります

class Random_Walker_Nav_Menu extends Walker_Nav_Menu {

    function start_el(&$output, $item, $depth, $args) {
        global $wp_query;
        $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

        $class_names = $value = '';

        $classes = empty( $item->classes ) ? array() : (array) $item->classes;
        if ( !empty( $classes ) && in_array( 'random', $classes ) ){
            $args = array( 'numberposts' => 1, 'orderby' => 'rand' ); 
            $rand_posts = get_posts( $args ); 
            foreach( $rand_posts as $p ){
                $item->url = get_permalink( $p->ID );       
            }           
        }
        $classes[] = 'menu-item-' . $item->ID;

        $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );
        $class_names = ' class="' . esc_attr( $class_names ) . '"';

        $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args );
        $id = strlen( $id ) ? ' id="' . esc_attr( $id ) . '"' : '';

        $output .= $indent . '<li' . $id . $value . $class_names .'>';

        $attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) .'"' : '';
        $attributes .= ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) .'"' : '';
        $attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) .'"' : '';
        $attributes .= ! empty( $item->url )        ? ' href="'   . esc_attr( $item->url        ) .'"' : '';

        $item_output = $args->before;
        $item_output .= '<a'. $attributes .'>';
        $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
        $item_output .= '</a>';
        $item_output .= $args->after;

        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
    }
}

それよりも、テンプレートでwp_nav_menuのコードを見つけて、パラメータ「walker」に「newRandom_Walker_Nav_Menu()」を割り当てる必要があります。このように:

wp_nav_menu( array( 'theme_location' => 'primary', 'walker' => new Random_Walker_Nav_Menu() ) );

管理の外観->メニューに入り、目的のメニューに新しいカスタムリンクを追加します。URLは実際には重要ではありません。だから、あなたのブログULRを選択してください。それを「ランダムポスト」または「ランダム」と呼んでください、それはあなた次第です。クラス「ランダム」(qoutesなし)を割り当てるよりも。クラスフィールドが表示されていない場合は、右上隅の[画面オプション]から有効にします。保存する。

出来上がり!

于 2013-01-26T22:35:52.963 に答える
0

大丈夫です。私は別の解決策も持っています。おそらく実装が簡単です。

このコードを functions.php に挿入し、カスタム テンプレートを使用して $page_id 値をページの ID に変更します。

function binda_redirect_to_rand( $query ) {
    $page_id = 234; //ID of your page with custom template  
    if ( $query->is_page() && $query->query_vars['page_id'] == $page_id && $query->is_main_query() ) {          
        $args = array( 'numberposts' => 1, 'orderby' => 'rand' ); 
        $rand_posts = get_posts( $args ); 
        foreach( $rand_posts as $p ){
            $query->set( 'p', $p->ID );
            $query->set( 'page_id', '' );   
        }     
    }
    return $query;
}
add_action( 'pre_get_posts', 'binda_redirect_to_rand' );

このコードは、投稿データが DB からフェッチされる前に、指定された ID を持つページにつながるクエリをランダムな投稿にリダイレクトするため、最初のソリューションと同じくらい高速です。冗長なページを作成する必要がないため、前のものを好みますが、これは実装が非常に簡単です。

于 2013-01-27T09:09:30.947 に答える