WP_User_Query बिना पोस्ट वाले उपयोगकर्ताओं को बाहर करने के लिए


9

मैं देखता हूं कि प्रत्येक उपयोगकर्ता के पदों की संख्या से एक उपयोगकर्ता क्वेरी को सॉर्ट करना संभव है, लेकिन क्या परिणाम से शून्य पोस्ट वाले उपयोगकर्ताओं को बाहर करना संभव है? Wp_User_Query वर्ग में एक pre_user_queryएक्शन है, लेकिन क्वेरी स्ट्रिंग्स एक बहुत ही कमजोर बिंदु है, इसलिए मुझे यकीन नहीं है कि मैं यहां किस प्रकार की फ़िल्टर कार्रवाई का उपयोग करना चाहता हूं।


क्या यह केवल उन परिणामों से त्यागने के लिए कम कर देने वाला होगा, जो उपयोगकर्ता post_count== 0 हैं?
घोस्टटॉस्ट

3
मैं इसे पूरी तरह से नैतिक प्रश्न के रूप में बंद करने के लिए तैयार हो रहा था। वर्डप्रेस get_posts_by_author_sqlफ़ंक्शन के साथ स्वचालित रूप से ऐसा करता है जो get_authors()क्वेरी के लिए SQL उत्पन्न करता है । परिणामों में शामिल होने के लिए उपयोगकर्ताओं के पास एक प्रकाशित या निजी पोस्ट होना चाहिए। #facepalm
हेलगैथवाइकिंग

आपको खुशी हुई कि आपको इसका उत्तर मिला
GhostToast

मैं भी! यद्यपि मूर्खता के कारण के लिए प्रश्न को बंद करने का कोई विकल्प नहीं है। यद्यपि में chiming के लिए धन्यवाद। मैं आपके वकील को आवेदन करूंगा क्योंकि मैं get_authors()परिणाम को क्षणिक के रूप में सहेजना चाहता हूं ... फिर मैं हर बार क्वेरी करने की आवश्यकता के बिना वर्तमान लेखक को छोड़ सकता हूं।
हेलगेटेवाइकिंग

1
यह प्रश्न मूर्खतापूर्ण नहीं है, यह उठ गया है, कृपया अपना समाधान उत्तर के रूप में प्रदान करें क्योंकि यह दूसरों की मदद कर सकता है।
व्याक

जवाबों:


10

वैसे मैं 2 समाधान लेकर आया हूं।

समाधान 1 - फॉरेस्ट लूप और प्रत्येक उपयोगकर्ता को सत्यापित करें

यह @ घोस्टटॉस्ट के समाधान पर आधारित है, लेकिन अपडेट किए गए वर्डप्रेस फ़ंक्शन के साथ

//new query with default args
$author_query = new WP_User_Query();

// Get the results
$authors = $author_query->get_results();

if( $authors ) {

    foreach( $authors as $author ) {

     if ( count_user_posts( $author->id ) >= 1 ) {

        echo $author->display_name . '</br>';
    }
}
} else { 
    echo "no users found"; 
}

समाधान 2 - फैंसी पैंट pre_user_queryएक्शन

यह तब हुआ जब मैंने कक्षा pre_user_queryमें एक्शन पाते ही अपना प्रश्न पोस्ट कर दिया WP_User_Query। यदि आप post_countअपने orderbyपैरामीटर के रूप में गुजरते हैं, तो कुछ फैंसी एसक्यूएल क्वेरी जो मैंने कभी नहीं सोचा था कि अपने आप ही एक साथ उचित तालिकाओं में शामिल होने के लिए होता है। तो मैंने जो किया वह था कि बयान में शामिल हों और इसे अपने दम पर जोड़ें। यह बेहतर होगा यदि मैं इसे जोड़ने से पहले पहले इसकी उपस्थिति की जांच कर सकता हूं ... शायद मैं भविष्य में एक स्ट्रिंग मैच का उपयोग करूंगा। लेकिन अब के बाद से मैं जानता हूं कि मैं जिस प्रश्न को स्थापित कर रहा हूं वह यह नहीं है और मैं अभी इसके बारे में चिंता नहीं करूंगा। तो कोड ऐसा निकला:

function authors_with_posts( $query ) {

    if ( isset( $query->query_vars['query_id'] ) && 'authors_with_posts' == $query->query_vars['query_id'] ) {  
        $query->query_from = $query->query_from . ' LEFT OUTER JOIN (
                SELECT post_author, COUNT(*) as post_count
                FROM wp_posts
                WHERE post_type = "post" AND (post_status = "publish" OR post_status = "private")
                GROUP BY post_author
            ) p ON (wp_users.ID = p.post_author)';
        $query->query_where = $query->query_where . ' AND post_count  > 0 ';  
    } 
}
add_action('pre_user_query','authors_with_posts');

और फिर इसका उपयोग करने के लिए

$args = ( array( 'query_id' => 'authors_with_posts' ) );  
$author_query = new WP_User_Query( $args );

query_idपैरामीटर के लिए विचार एक परिचय से WP_User_Class का है

जिस पर सिर्फ एक बहुत अच्छा संदर्भ है WP_User_Query


1
ये बहुत प्यारी है। अब हम सभी की जरूरत है नई घनन सूची में पृष्ठांकन पृष्ठ संख्या को समायोजित करने के लिए एक रास्ता है ...
क्रिस्टीन कूपर

अच्छा निर्णय। पता नहीं कैसे करना है।
हेलगेटहाइकिंग

author-> है आईडी अब author-> आईडी (छोटा सा परिवर्तन लेकिन आईडी मूल्यह्रास हुआ है)
अस्तित्व के प्रति

3

4.4 के बाद से, आप बस 'has_published_posts' पैरामीटर का उपयोग कर सकते हैं।

उदाहरण:

$authors = get_transient('mytheme_all_authors');
if (empty($authors)){

    $user_args = array(
    'role__in'    => array('Author', 'Administrator', 'Contributor'),
    'orderby' => 'post_count',
    'order'   => 'DESC',
    'count_total'  => true,
    'has_published_posts' => array('post'),
    );

    $authors = new WP_User_Query( $user_args );
    set_transient('mytheme_all_authors', $authors, 1 * HOUR_IN_SECONDS );
}

$total= $authors->get_total();
$authors = $authors->results;
foreach ( $authors as $user) {
    // loop through your users....

has_published_postsया तो सच / गलत हो सकता है (या अशक्त), या पोस्ट प्रकार की एक सरणी (इस उदाहरण में)।

ध्यान दें: मैं यहाँ ग्राहकों का उपयोग कर रहा हूँ क्योंकि यह विशिष्ट क्वेरी सिस्टम के आधार पर बहुत भारी हो सकती है इसलिए यह भविष्य में उपयोग के लिए इसे स्टोर करने के लिए समझ में आता है।


0

बंद करने के जवाब के रूप में प्रस्तुत करना:

   $all_members = get_users();
      foreach($all_members as $member){
        $post_count = count_user_posts($member->ID);
        if(empty($post_count)) {
            $bad_writers[] = $member->ID;
            continue;
        } else {
            // do something;
        }
    }

क्या सभी भूमिकाओं के उपयोगकर्ताओं को प्राप्त करने के लिए वर्कअराउंड आवश्यक है? मुझे लग रहा है कि उस तर्क को खाली छोड़ देने से सभी उपयोगकर्ता मल्टीसाइट में वापस नहीं आ रहे हैं।
हेलगेटहाइकिंग

get_users_with_role()एक वर्डप्रेस फ़ंक्शन नहीं है या मैं अपने कंप्यूटर को बहुत लंबे समय से देख रहा हूं?
हेलगेटहाइकिंग

1
यह मौजूद नहीं है। के लिए 966 फाइलें खोजना "get_users_with_role": 0 matches across 0 files। इसके अलावा get_usernumpostsमूल्यह्रास हुआ है, का उपयोग करेंcount_user_posts()
Wyck

अरे! मैं क्षमाप्रार्थी हूं। यह एक ऐसा कार्य था जो मैंने एक सदस्य आधारित साइट के लिए लिखा था। आप बस get_users () का उपयोग कर सकते हैं और इसके लिए जो भी पैरामीटर चाहें, पास कर सकते हैं: codex.wordpress.org/Function_Reference/get_users
GhostToast

@GhostToast कृपया अपना उत्तर अपडेट करें।
कैसर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.