क्या रैम उपयोग पर सहेजने के लिए पोस्ट चर से सामग्री को बाहर करने का एक तरीका है?


9

तो, मैं एक WP RAM उपयोग समस्या की तरह लग रहा है और एक समाधान के लिए देख रहा हूँ में चला गया हूँ।

मेरी साइट पर वास्तव में यह समस्या होने वाली एकमात्र जगह एक साइट मैप पेज के साथ है जिसे मैं आबाद करने की कोशिश कर रहा हूं, लेकिन इस समस्या का एक समाधान सार्वभौमिक रूप से लागू किया जा सकता है और एक संपूर्ण साइट पर रैम उपयोग को बचा सकता है।

अनिवार्य रूप से, यह साइट मैप पेज मेरे पास सभी postsऔर pagesमेरी साइट की एक सूची है । $ पोस्ट चर के एकमात्र तत्व जिन्हें मुझे इस पृष्ठ पर पहुंचने की आवश्यकता है वे शीर्षक और पर्मलिंक हैं। दुर्भाग्यवश, मैं जिस क्वेरी का उपयोग कर रहा हूं, वह अपने सभी पोस्ट के प्रत्येक $ चर में सभी जानकारी के साथ रिटर्न का उपयोग कर रहा है।

निम्नलिखित उस क्वेरी का एक उदाहरण है जिसका उपयोग मैं इस साइट मानचित्र पृष्ठ custom-post-typeपर "सप्लीमेंट्स" के कस्टम टैक्सोनॉमी और "ऑल-सप्लीमेंट्स" नामक एकल उत्पादों के लिए कर रहा हूं । मेरे साइट मानचित्र पृष्ठ में ऐसे कई प्रश्न हैं, लेकिन व्याख्यात्मक उद्देश्यों के लिए मैं केवल इस एक प्रश्न के लिए कोड सहित हूँ।

 $varArray= array(
      'post_type' => 'products',
      'post_status' => 'publish',
      'supplements' => 'all-supplements',
      'posts_per_page' => -1,
      'orderby' => 'title',
      'order' => 'ASC'
 );
 $myProducts= new WP_Query($varArray);

$ पोस्ट चर के भीतर सहेजी गई अधिकांश जानकारी (मेरी साइट के लिए, और मैं अनुमान लगा रहा हूं कि यह प्रवृत्ति सामान्य उपयोग के लिए देखी गई है) "सामग्री" के भीतर पाई गई है। मेरे साइट मानचित्र पृष्ठ के लिए विशिष्ट RAM उपयोग ~ 140MB है (डिबग बार द्वारा सूचना दी गई), जबकि मेरी साइट पर किसी अन्य विशिष्ट पृष्ठ के लिए उपयोग 50-60 एमबी है। बड़ा अंतर। कल साइट मैप पेज ने काम करना बंद कर दिया (WSOD), और इसे ठीक करने के लिए मुझे RAM की अधिकतम मात्रा बढ़ानी पड़ी जिसका WP उपयोग कर सकता है। इसलिए मैं एक पेज के कारण समग्र आवश्यक सिस्टम संसाधनों को बढ़ा रहा हूं।

इस प्रकार, मैं अपने प्रश्न पर आता हूं।

क्या वर्डप्रेस के भीतर कहीं एक मार्ग / विकल्प है जो मुझे याद आ रहा है जो एक सामान्य क्वेरी की तरह होगा posts/ प्राप्त होगा pages, लेकिन पोस्ट को पुनः प्राप्त करने के लिए सामग्री नहीं मिलेगी?

या, वैकल्पिक रूप से, क्या मेरे लिए कुछ आसान तरीके हैं जो किसी विशेष प्रश्न (शीर्षक / पर्मकलिंक / स्लग / आदि ...) के बजाय विशेष तत्वों को केवल $ $ पोस्ट चर चर पाने के लिए ले सकते हैं?

यह मुझे लगता है कि कई WP अनुप्रयोगों के लिए, आमतौर पर पोस्ट / पृष्ठ की "सामग्री" को केवल उसी स्थान pageया postपृष्ठ पर होना चाहिए (जाहिर है कि यहां अपवाद हैं), और पदों के लिए पूर्ण सामग्री तक पहुंच है। / अन्य पृष्ठों पर क्वेरी द्वारा प्राप्त पृष्ठ सरल ओवरकिल है। यदि पोस्ट सूची पृष्ठों के लिए पूरी सामग्री लोड करने से बचने का एक तरीका है, तो रैम उपयोग की एक महत्वपूर्ण राशि को बचाया जा सकता है।

किसी भी सहायता की सराहना की जाएगी।

जवाबों:


8

आप मेमोरी के उपयोग को कम करने के लिए इसे पोस्ट डेटा को सीधे क्वेरी करने और filterपोस्ट ऑब्जेक्ट्स को सेट करने sampleसे पहले एक ट्रिक आज़मा सकते हैं get_permalink()

इसके पीछे विस्तृत तर्क के लिए get_permalink मेमोरी उपयोग मुद्दा देखें ।


इस समाधान ने बहुत काम किया। खैर, थोड़ी तकरार के बाद जो है। :) मुझे यह पता लगाना था कि अपने कस्टम टैक्सोनॉमी / शब्द को क्वेरी में कैसे शामिल किया जाए, लेकिन यह एक बड़ी मदद थी। साइट मानचित्र पृष्ठ अब 70MB RAM (डिबग बार के अनुसार) का उपयोग कर रहा है। महान सूचक के लिए धन्यवाद।
प्रोग्रामर डैन

4

आप इसे अपने सरणी में जोड़ने का प्रयास कर सकते हैं:

'nopaging' => true,
'no_found_rows' => true,
'update_post_meta_cache' => false,
'update_post_term_cache' => false

यह बहुत ही आत्म-व्याख्यात्मक लगता है, लेकिन अनिवार्य रूप से आप सभी पोस्ट चर और केवल आपकी ज़रूरत के सामान की क्वेरी नहीं कर रहे हैं।


2

प्रोग्रामर दान, मह आदमी!

आइए आपको वैश्विक SELECTका उपयोग करके कस्टम प्रश्नों पर आरंभ करें $wpdb। कोडेक्स में कस्टम चयन क्वेरी का उपयोग करके पोस्ट प्रदर्शित करने की एक शानदार प्रविष्टि है । यदि आप उपयोग करते हैं setup_postdata()तो आप परिणामों के माध्यम से लूप कर सकते हैं जैसे कि आप मानक वर्डप्रेस लूप में बैठे हैं:

global $wpdb;

$sitemap_query = "
    SELECT $wpdb->posts.ID, $wpdb->posts.post_title, $wpdb->posts.guid
    FROM $wpdb->posts
    WHERE $wpdb->posts.post_status = 'publish' 
    AND $wpdb->posts.post_type IN ('post','supplement','another_post_type')
    ORDER BY $wpdb->posts.post_type, $wpdb->posts.post_title DESC
    ";

$sitemap_nodes = $wpdb->get_results($sitemap_query, OBJECT);

if( $sitemap_nodes ):
    global $post;
    foreach ( $sitemap_nodes as $post ):
        setup_postdata( $post );
        ?>

<!-- //Use standard Wordpress template tags for SELECT'd data within The Loop here -->
    <?php the_title() ?>
    <?php the_permalink() ?>

        <?php
    endforeach;
endif;

यह क्वेरी केवल पोस्ट आईडी, टाइटल और GUIDs (पोस्ट की पर्मलिंक निर्धारित करने के लिए उपयोग की गई) को खींचती है, जबकि हर चीज को बिल्कुल अनदेखा करती है। यह post_typeतब तक परिणामों को पहले आदेश देता है post_title, हालांकि आप अपने पोस्ट प्रकारों को अलग करने के लिए कई प्रश्नों का उपयोग करना चाह सकते हैं (सैद्धांतिक रूप से एक छोटे प्रदर्शन हिट पर)।

जाहिर है आप उपयोग करना छोड़ सकते हैं setup_postdata()और बस लूप के माध्यम से छोड़ सकते हैं $sitemap_nodes, या परिणाम प्राप्त करने के लिए क्वेरी के साथ बेला कर सकते हैं।

यदि आप कॉल करते हैं setup_postdata()और डिबग मोड सक्रिय है, तो कॉल संभवतः सूचनाओं को छोड़ दिया गया होगा और दाएं से संबंधित (जानबूझकर) गायब जानकारी के बारे में। आप यह @पुष्टि करने के बाद कि आपके कस्टम क्वेरी ठीक से काम कर रही है, उन्हें दबाने के लिए फ़ंक्शन कॉल से पहले फेंकना चाह सकते हैं ।

लेकिन यह आपको शुरू करना चाहिए! आप उन फ़ील्ड्स का पता लगाने के लिए निम्न डेटाबेस आरेख ( डेटाबेस विवरण पृष्ठ से कोडेक्स पर) का उल्लेख कर सकते हैं जिन्हें आपको क्वेरी करने की आवश्यकता है:

Wordpress डेटाबेस आरेख

संपादित करें:

सबसे स्मृति कुशल समाधान एक संभावना है जो SELECT@ Rarst के protip के साथ एक कस्टम क्वेरी को जोड़ती है :)


1

WP_Query में "रिटर्न फ़ील्ड्स" पैरामैटर है जो इस तरह दिखता है:

$args = array(
 'fields' => 'ids'
);
$query = new WP_Query( $args );

जब इस तरह से उपयोग किया जाता है, तो WP_Query केवल पोस्ट आईडी लौटाता है, संपूर्ण पोस्ट ऑब्जेक्ट नहीं। तो फिर तुम सिर्फ उपयोग कर सकते हैं get_permalink(), get_the_title()और अन्य मिश्रित वर्डप्रेस कार्यों पद आईडी के आधार पर अपनी सामग्री प्राप्त करने में।


1
ध्यान दें कि पोस्ट की आईडी को स्वीकार करने वाले फ़ंक्शंस आमतौर पर तुरंत get_post()पूरा डेटा प्राप्त करने के लिए उस पर चलते हैं और इसलिए पूरी तरह से अकेले आईडी प्राप्त करने के उद्देश्य को पराजित करते हैं।
रार्स्ट

1
जानकार अच्छा लगा! मैं इस धारणा के तहत था कि मैं स्मार्ट हो रहा हूं।
डाल्टन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.