कस्टम पद प्रकारों के लिए कस्टम अंकन (नामों से)


10

मेरे पास दो कस्टम पोस्ट प्रकार हैं जो लोगों के नामों से संबंधित हैं। अभी, ब्राउज़िंग दृश्य में, यह सिर्फ उन सभी को वर्णानुक्रम में सूचीबद्ध करता है और पृष्ठांकन उन्हें संख्याओं से तोड़ देता है, जो किसी विशिष्ट व्यक्ति को खोजने का प्रयास करते समय बहुत उपयोगी नहीं होते हैं।

विशेष रूप से, मुझे इस तरह दिखने वाले लोगों के लिए पृष्ठ पर अंक बनाने के लिए कहा गया है:

  • एजी
  • एचएम
  • NQ
  • RQ

मेरी समस्या - मैं यह पता नहीं लगा सकता कि मैं किसी एक फ़ील्ड के पहले अक्षर द्वारा कस्टम पोस्ट प्रकारों को कैसे क्वेरी कर सकता हूं। फिर, मुझे यकीन नहीं है कि मैं इस तरह से पेजिंग बनाने के बारे में कैसे जा सकता हूं। क्या किसी के पास कोई सुझाव है? धन्यवाद!


दिलचस्प है .. मैं इसे एक शॉट दूंगा लेकिन बहुत जल्द नहीं। मेरे पास कुछ दिनों के बाद एक मुफ्त स्लॉट है। इससे पहले कि आपको कुछ मिले तो अपना समाधान साझा करें। बस लुकअप को संशोधित करने के लिए posts_where फ़िल्टर को देखने के लिए और पुन: लिखने के नियमों के साथ खेलने के लिए आपके द्वारा किए जाने वाले पेजेशन को करने के लिए, query_vars, query_posts और WP_Rewrite वर्ग पर एक नज़र डालें। मुझे यकीन है कि आप इसे इन चीजों के साथ करेंगे।
हमीदुल्लाह खान

@ mckeodm3 तो क्या ??
केसर

जवाबों:


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देख सकें ।

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():)
kaiser

3

यह आपको आरंभ करने में मदद करेगा। मुझे नहीं पता कि आप विशिष्ट पत्र पर क्वेरी को कैसे तोड़ेंगे और फिर WP बताएं कि अधिक अक्षरों के साथ एक और पृष्ठ है, लेकिन निम्नलिखित बाकी के 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

एक उत्तर के रूप में @ kaiser के उदाहरण का उपयोग करते हुए, एक कस्टम पोस्ट प्रकार के साथ एक फ़ंक्शन जो अल्फा स्टार्ट और एंड परमेस को स्वीकार करता है। यह उदाहरण स्पष्ट रूप से वस्तुओं की एक छोटी सूची के लिए है, क्योंकि इसमें द्वितीयक पेजिंग शामिल नहीं है। मैं इसे पोस्ट कर रहा हूं ताकि आप अपनी 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% कस्टम होगा - और बहुत शामिल होगा। आपको एक कस्टम sql क्वेरी (wpdb वर्ग का उपयोग करके) बनाने की आवश्यकता होगी और फिर पृष्ठांकन के लिए आप इन मापदंडों को अपने कस्टम क्वेरी में पास करेंगे। आपको संभवतः इसके लिए नए रीराइट नियम भी बनाने होंगे। देखने के लिए कुछ कार्य:

add_rewrite_tag( '%byletter%', '([^/]+)');
add_permastruct( 'byletter', 'byletter' . '/%byletter%' );
$wp_rewrite->flush_rules();
paginate_links()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.