पदों के शीर्षक से पुन: उत्पन्न


14

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


मुझे कई बार ऐसा करना पड़ा है और पाया गया है कि विभिन्न सर्वर वातावरणों के बीच जहां यह बड़ी सरणियों को संभाल नहीं सकता है (नम्बरपॉस्ट को असीमित में सेट किया जा रहा है) और न ही wp_update_post को बार-बार बड़े मेमोरी खपत के साथ कॉल करना जो इसे pagination और उपयोग के साथ WP -Query कॉल में तोड़ना है $ wpdb कि यह अधिक प्रबंधनीय और प्रदर्शन करने वाला है। मैंने एक समान पोस्ट पर कोड नमूना प्रदान किया ।
कोडरैक्निड

जवाबों:


17

हाँ यह संभव है।

नमूना कोड, परीक्षण और परिष्कृत किया जाना है:

// get all posts
$posts = get_posts( array (  'numberposts' => -1 ) );

foreach ( $posts as $post )
{
    // check the slug and run an update if necessary 
    $new_slug = sanitize_title( $post->post_title );
    if ( $post->post_name != $new_slug )
    {
        wp_update_post(
            array (
                'ID'        => $post->ID,
                'post_name' => $new_slug
            )
        );
    }
}

मैंने अभी इसे बनाया है, संभवतः कुछ त्रुटियां हैं और उदाहरण के मामले हैं, लेकिन यह आपको एक विचार देना चाहिए। इसके अलावा, इसमें कुछ समय लग सकता है, इसलिए यह अपडेट को छोटे हिस्से में विभाजित करने के लिए उपयोगी हो सकता है।


1
हम्म् ... मेरे अनुभव से, यह काम नहीं करता है। post_nameतर्क द्वारा नजरअंदाज कर दिया है wp_update_postकोर के 3.9 संस्करण में कम से कम,
एलेक्जेंडर Bourlier

वर्तमान में, फ़ंक्शन के post_nameभीतर इसे नजरअंदाज कर दिया जाता wp_update_post()है, लेकिन जब wp_insert_post()फ़ंक्शन के लिए अपडेट पोस्ट कॉल करता है, तो इसे ध्यान में रखा जाता है : इसका मतलब है कि अपडेट के लिए नया स्लग पास करना, अपडेट किए जाने वाले पोस्ट के लिए इसे प्रभावी रूप से बदल देगा।
एरेनोर पाज़

2

यह प्लगइन काम भी करता है: http://www.jerrytravis.com/598/wordpress-plugin-to-generate-post-slugs

हालाँकि, जैसा कि यह केवल उन पोस्टों के लिए करता है जिनमें अभी तक कोई स्लग नहीं है, यदि आपको स्लग को फिर से बनाने की आवश्यकता है, तो प्लगइन में निम्नलिखित लाइन को संपादित करें:

if ($post->post_name == "") {

उदाहरण के लिए, आप इसे इसमें बदल सकते हैं:

if (true) {


1

मैं टोस्चो द्वारा सुझाई गई विधि की कोशिश कर रहा था, जो "सहज" है, लेकिन कई मामलों में यह काम नहीं करता है (कोर कोड मुझे "कई मामलों" से मतलब है)।

कोड में देखते हुए, मुझे डेटाबेस के पोस्ट iunto को डालने से पहले फ़ंक्शन wp_insert_post_dataद्वारा बुलाए गए फ़िल्टर हुक मिला wp_update_post

इस फ़िल्टर को कॉल करके, और इसके मूल्य को बदलकर $data['post_name'], मैं इसे ठीक से काम करने में सक्षम था। Wordpress शांत है लेकिन इतनी बुरी तरह से प्रलेखित ...

मैंने प्रलेखन संपादित किया , ताकि जरूरत पड़ने पर और लोग इस समाधान को पा सकें।


क्या आप बता सकते हैं कि wp_update_post post_name को क्यों अधिलेखित करता है? ऐसा होने का एकमात्र कारण यह है कि यदि उपयोगकर्ता post_name को संशोधित करने का प्रयास कर रहा है, तो केवल एक योगदानकर्ता (या समान स्तर) है जिस स्थिति में यह उस उपयोगकर्ता को स्लग को बदलने की अनुमति नहीं देना चाहिए, क्या आपको कोई अन्य मामले मिले हैं जिसमें पोस्ट_नाम अधिलेखित है?
जेंघी - अलेक्जेंड्रू जेंता १६'१४ को --:

हां यह इसे करने का उचित तरीका है। धन्यवाद @Alexandre
user88731

-1

जरूरत पड़ने पर आप सीधे mysql में भी ऐसा कर सकते हैं। (हमारे woocommerce साइट में हजारों उत्पादों की संख्या है):

update wp_posts set post_name = concat(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(lower(post_title), '"', ''), "'", ''), ",", '-'), " ", '-'), "&", ''), ";", ''), "@", ''), ".", ''), ":", ''), "/", ''), "+", ''), "(", ''), ")", ''), "--", '-'), "---", '-'), "--", '-'), "--", '-'), '-', id) where post_type = 'product';

जहाँ post_type = 'product' - जो आपके अपडेट को सिर्फ woocommerce उत्पादों तक रखेगा; आपको यह पता लगाना चाहिए कि आप इस क्वेरी को किस सीमा तक रखना चाहते हैं।

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