কাস্টম পোস্ট প্রকারের জন্য কাস্টম পৃষ্ঠাগুলি (নাম অনুসারে)


10

আমার কাছে দুটি কাস্টম পোস্ট প্রকার রয়েছে যা মানুষের নাম নিয়ে কাজ করে। এই মুহুর্তে, ব্রাউজিং দর্শনগুলিতে, এটি কেবল তাদের সমস্ত বর্ণানুক্রমিকভাবে তালিকাবদ্ধ করে এবং পৃষ্ঠাগুলি তাদের সংখ্যা দ্বারা বিভক্ত করে দেয়, যখন আপনি কোনও নির্দিষ্ট ব্যক্তির সন্ধানের চেষ্টা করছেন তখন মারাত্মকভাবে কার্যকর হয় না।

বিশেষত, আমাকে দেখতে দেখতে এমন লোকদের জন্য পৃষ্ঠা লিঙ্ক তৈরি করতে বলা হয়েছে:

  • এজি
  • এইচ এম
  • NQ
  • RQ

আমার সমস্যা - আমি এক ক্ষেত্রের প্রথম অক্ষর দ্বারা কীভাবে কাস্টম পোস্টের প্রকারগুলি জিজ্ঞাসা করতে পারি তা বুঝতে পারি না। তারপরে, আমি নিশ্চিত নই যে আমি কীভাবে এইভাবে পৃষ্ঠাটি তৈরি করতে পারি। কারো কোন পরামর্শ আছে? ধন্যবাদ!


আকর্ষণীয় .. আমি খুব শীঘ্রই এটি একটি শট দেব। কয়েক দিন পরে আমার একটি ফ্রি স্লট আছে। এর আগে যদি কিছু খুঁজে পান তবে আপনার সমাধানটি ভাগ করুন। লুকিং পরিবর্তন করতে এবং পুনরায় লেখার নিয়মগুলি নিয়ে আপনার যে প্যাফিকেশনটি খেলতে হবে তা দেখতে পোস্ট_এই ফিল্টারটি দেখার জন্য, ক্যোয়ারী_ভারস, ক্যোয়ারী_পোস্ট এবং ডাব্লুপি_রাইটরাইট ক্লাসটি একবার দেখুন। আমি নিশ্চিত যে আপনি এটি এই জিনিস দিয়ে পেরেক হবে।
হামেদুল্লাহ খান

@ মেকডম 3 তাই কি ??
কায়সার

উত্তর:


4

মজার প্রশ্ন! আমি ক্লাউজের WHEREএকগুচ্ছ দিয়ে ক্যোয়ারীটি প্রসারিত করে সমাধান করেছি post_title LIKE 'A%' OR post_title LIKE 'B%' ...। আপনি একটি ব্যাপ্তি অনুসন্ধান করতে একটি নিয়মিত প্রকাশটিও ব্যবহার করতে পারেন তবে আমি বিশ্বাস করি যে ডাটাবেসগুলি তখন কোনও সূচক ব্যবহার করতে সক্ষম হবে না।

এটি সমাধানের মূল: ধারাটিতে একটি ফিল্টার WHERE:

add_filter( 'posts_where', 'wpse18703_posts_where', 10, 2 );
function wpse18703_posts_where( $where, &$wp_query )
{
    if ( $letter_range = $wp_query->get( 'wpse18703_range' ) ) {
        global $wpdb;
        $letter_clauses = array();
        foreach ( $letter_range as $letter ) {
            $letter_clauses[] = $wpdb->posts. '.post_title LIKE \'' . $letter . '%\'';
        }
        $where .= ' AND (' . implode( ' OR ', $letter_clauses ) . ') ';
    }
    return $where;
}

অবশ্যই আপনি আপনার ক্যোয়ারিতে এলোমেলো বাহ্যিক ইনপুটটিকে অনুমতি দিতে চান না। এজন্য আমার কাছে একটি ইনপুট স্যানিটাইজেশন পদক্ষেপ রয়েছে pre_get_posts, যা দুটি ক্যোয়ারী ভেরিয়েবলকে বৈধ পরিসরে রূপান্তর করে। (যদি আপনি এটি ভাঙার কোনও উপায় খুঁজে পান তবে দয়া করে একটি মন্তব্য করুন যাতে আমি এটি সংশোধন করতে পারি)

add_action( 'pre_get_posts', 'wpse18703_pre_get_posts' );
function wpse18703_pre_get_posts( &$wp_query )
{
    // Sanitize input
    $first_letter = $wp_query->get( 'wpse18725_first_letter' );
    $last_letter = $wp_query->get( 'wpse18725_last_letter' );
    if ( $first_letter || $last_letter ) {
        $first_letter = substr( strtoupper( $first_letter ), 0, 1 );
        $last_letter = substr( strtoupper( $last_letter ), 0, 1 );
        // Make sure the letters are valid
        // If only one letter is valid use only that letter, not a range
        if ( ! ( 'A' <= $first_letter && $first_letter <= 'Z' ) ) {
            $first_letter = $last_letter;
        }
        if ( ! ( 'A' <= $last_letter && $last_letter <= 'Z' ) ) {
            if ( $first_letter == $last_letter ) {
                // None of the letters are valid, don't do a range query
                return;
            }
            $last_letter = $first_letter;
        }
        $wp_query->set( 'posts_per_page', -1 );
        $wp_query->set( 'wpse18703_range', range( $first_letter, $last_letter ) );
    }
}

চূড়ান্ত পদক্ষেপটি হ'ল একটি সুন্দর পুনর্লিখনের নিয়ম তৈরি করা যাতে আপনি যেতে পারেন example.com/posts/a-g/বা example.com/posts/aএই পোস্টের (ব্যাপ্তি) অক্ষর দিয়ে শুরু হওয়া সমস্ত পোস্ট দেখতে পারেন see

add_action( 'init', 'wpse18725_init' );
function wpse18725_init()
{
    add_rewrite_rule( 'posts/(\w)(-(\w))?/?', 'index.php?wpse18725_first_letter=$matches[1]&wpse18725_last_letter=$matches[3]', 'top' );
}

add_filter( 'query_vars', 'wpse18725_query_vars' );
function wpse18725_query_vars( $query_vars )
{
    $query_vars[] = 'wpse18725_first_letter';
    $query_vars[] = 'wpse18725_last_letter';
    return $query_vars;
}

আপনি অন্য কিছু দিয়ে শুরু করতে পুনরায় লেখার নিয়ম প্যাটার্নটি পরিবর্তন করতে পারেন। এটি যদি কাস্টম পোস্টের ধরণের জন্য &post_type=your_custom_post_typeহয় তবে সাবস্টিটিউশনটিতে যুক্ত হওয়া নিশ্চিত করুন (দ্বিতীয় স্ট্রিং যা শুরু হয় index.php)।

পৃষ্ঠাগুলি লিঙ্ক যুক্ত করা পাঠকের জন্য অনুশীলন হিসাবে ছেড়ে গেছে :-)


কেবল একটি ইঙ্গিত: like_escape():)
কায়সার

3

এটি আপনাকে শুরু করতে সহায়তা করবে। আমি জানি না আপনি কীভাবে নির্দিষ্ট চিঠিতে ক্যোয়ারীটি ভেঙে ফেলবেন এবং তারপরে ডব্লিউপিকে বলবেন যে আরও চিঠিযুক্ত আরও একটি পৃষ্ঠা রয়েছে, তবে নীচের বাকীগুলির 99% লাগে।

আপনার সমাধান পোস্ট করতে ভুলবেন না!

query_posts( array( 'orderby' => 'title' ) );

// Build an alphabet array
foreach( range( 'A', 'G' ) as $letter )
    $alphabet[] = $letter;

foreach( range( 'H', 'M' ) as $letter )
    $alphabet[] = $letter;

foreach( range( 'N', 'Q' ) as $letter )
    $alphabet[] = $letter;

foreach( range( 'R', 'Z' ) as $letter )
    $alphabet[] = $letter;

if ( have_posts() ) 
{
    while ( have_posts() )
    {
        global $wp_query, $post;
        $max_paged = $wp_query->query_vars['max_num_pages'];
        $paged = $wp_query->query_vars['paged'];
        if ( ! $paged )
            $paged = (int) 1;

        the_post();

        $first_title_letter = (string) substr( $post->post_title, 1 );

        if ( in_array( $first_title_letter, $alphabet ) )
        {
            // DO STUFF
        }

        // Pagination
        if ( $paged !== (int) 1 )
        {
            echo 'First: '._wp_link_page( 1 );
            echo 'Prev: '._wp_link_page( $paged - 1 );
        }
        while ( $i = 1; count($alphabet) < $max_paged; i++; )
        {
            echo $i._wp_link_page( $i );
        }
        if ( $paged !== $max_paged )
        {
            echo 'Next: '._wp_link_page( $paged + 1 );
            echo 'Last: '._wp_link_page( $max_paged );
        }
    } // endwhile;
} // endif;

এটি পরীক্ষা করা হয়নি।
কায়সার

2

@ কায়সার উদাহরণ ব্যবহার করে একটি উত্তর, একটি কাস্টম পোস্ট টাইপ হিসাবে একটি ফাংশন হিসাবে আলফা শুরু এবং শেষের প্যারামগুলি গ্রহণ করে। এই উদাহরণটি অবশ্যই আইটেমগুলির একটি সংক্ষিপ্ত তালিকার জন্য, কারণ এটিতে মাধ্যমিক পেজিং অন্তর্ভুক্ত নয়। আমি এটি পোস্ট করছি যাতে আপনি functions.phpযদি পছন্দ করেন তবে ধারণাকে নিজের মধ্যে অন্তর্ভুক্ত করতে পারেন।

// Dr Alpha Paging
// Tyrus Christiana, Senior Developer, BFGInteractive.com
// Call like alphaPageDr( "A","d" );
function alphaPageDr( $start, $end ) {
    echo "Alpha Start";
    $loop = new WP_Query( 'post_type=physician&orderby=title&order=asc' );      
    // Build an alphabet array of capitalized letters from params
    foreach ( range( $start, $end ) as $letter )
        $alphabet[] = strtoupper( $letter );    
    if ( $loop->have_posts() ) {
        echo "Has Posts";
        while ( $loop->have_posts() ) : $loop->the_post();              
            // Filter by the first letter of the last name
            $first_last_name_letter = ( string ) substr( get_field( "last_name" ), 0, 1 );
            if ( in_array( $first_last_name_letter, $alphabet ) ) {         
                //Show things
                echo  "<img class='sidebar_main_thumb' src= '" . 
                    get_field( "thumbnail" ) . "' />";
                echo  "<div class='sidesbar_dr_name'>" . 
                    get_field( "salutation" ) . " " . 
                    get_field( 'first_name' ) . " " . 
                    get_field( 'last_name' ) . "</div>";
                echo  "<div class='sidesbar_primary_specialty ' > Primary Specialty : " . 
                    get_field( "primary_specialty" ) . "</div>";                
            }
        endwhile;
    }
}

1

ফিল্টার query_varsএবং posts_whereফিল্টার ব্যবহার করে এটি করার একটি উপায় এখানে রয়েছে :

public  function range_add($aVars) {
    $aVars[] = "range";
    return $aVars;
}
public  function range_where( $where, $args ) {
    if( !is_admin() ) {
        $range = ( isset($args->query_vars['range']) ? $args->query_vars['range'] : false );
        if( $range ) {
            $range = split(',',$range);
            $where .= "AND LEFT(wp_posts.post_title,1) BETWEEN '$range[0]' AND '$range[1]'";
        }
    }
    return $where;
}
add_filter( 'query_vars', array('atk','range_add') );
add_filter( 'posts_where' , array('atk','range_where') );

সস: https://gist.github.com/3904986


0

এটি এতটা উত্তর নয়, তবে গ্রহণের দিকনির্দেশের দিকে আরও বেশি পয়েন্টার। এটি সম্ভবত 100% কাস্টম হতে হবে - এবং খুব জড়িত হবে। আপনাকে একটি কাস্টম এসকিএল কোয়েরি তৈরি করতে হবে (ডাব্লুপিডিবি ক্লাসগুলি ব্যবহার করে) এবং তারপরে পৃষ্ঠার জন্য আপনি এই পরামিতিগুলি আপনার কাস্টম ক্যোয়ারিতে পাস করবেন pass আপনার সম্ভবত এটির জন্য নতুন পুনর্লিখনের নিয়মও তৈরি করতে হবে। খতিয়ে দেখার জন্য কিছু ফাংশন:

add_rewrite_tag( '%byletter%', '([^/]+)');
add_permastruct( 'byletter', 'byletter' . '/%byletter%' );
$wp_rewrite->flush_rules();
paginate_links()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.