क्या पोस्ट के शीर्षकों को बदलने के बाद प्रोग्राम को धीरे-धीरे पुनर्जीवित करना संभव है? कई पोस्ट शीर्षक अपडेट किए गए थे और स्लग को शीर्षक के साथ अपडेट नहीं किया गया था, इसलिए मुझे इन सभी स्लग को फिर से बनाने की आवश्यकता है।
क्या पोस्ट के शीर्षकों को बदलने के बाद प्रोग्राम को धीरे-धीरे पुनर्जीवित करना संभव है? कई पोस्ट शीर्षक अपडेट किए गए थे और स्लग को शीर्षक के साथ अपडेट नहीं किया गया था, इसलिए मुझे इन सभी स्लग को फिर से बनाने की आवश्यकता है।
जवाबों:
हाँ यह संभव है।
नमूना कोड, परीक्षण और परिष्कृत किया जाना है:
// 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
)
);
}
}
मैंने अभी इसे बनाया है, संभवतः कुछ त्रुटियां हैं और उदाहरण के मामले हैं, लेकिन यह आपको एक विचार देना चाहिए। इसके अलावा, इसमें कुछ समय लग सकता है, इसलिए यह अपडेट को छोटे हिस्से में विभाजित करने के लिए उपयोगी हो सकता है।
post_name
तर्क द्वारा नजरअंदाज कर दिया है wp_update_post
कोर के 3.9 संस्करण में कम से कम,
post_name
भीतर इसे नजरअंदाज कर दिया जाता wp_update_post()
है, लेकिन जब wp_insert_post()
फ़ंक्शन के लिए अपडेट पोस्ट कॉल करता है, तो इसे ध्यान में रखा जाता है : इसका मतलब है कि अपडेट के लिए नया स्लग पास करना, अपडेट किए जाने वाले पोस्ट के लिए इसे प्रभावी रूप से बदल देगा।
यह प्लगइन काम भी करता है: http://www.jerrytravis.com/598/wordpress-plugin-to-generate-post-slugs
हालाँकि, जैसा कि यह केवल उन पोस्टों के लिए करता है जिनमें अभी तक कोई स्लग नहीं है, यदि आपको स्लग को फिर से बनाने की आवश्यकता है, तो प्लगइन में निम्नलिखित लाइन को संपादित करें:
if ($post->post_name == "") {
उदाहरण के लिए, आप इसे इसमें बदल सकते हैं:
if (true) {
मैं टोस्चो द्वारा सुझाई गई विधि की कोशिश कर रहा था, जो "सहज" है, लेकिन कई मामलों में यह काम नहीं करता है (कोर कोड मुझे "कई मामलों" से मतलब है)।
कोड में देखते हुए, मुझे डेटाबेस के पोस्ट iunto को डालने से पहले फ़ंक्शन wp_insert_post_data
द्वारा बुलाए गए फ़िल्टर हुक मिला wp_update_post
।
इस फ़िल्टर को कॉल करके, और इसके मूल्य को बदलकर $data['post_name']
, मैं इसे ठीक से काम करने में सक्षम था। Wordpress शांत है लेकिन इतनी बुरी तरह से प्रलेखित ...
मैंने प्रलेखन संपादित किया , ताकि जरूरत पड़ने पर और लोग इस समाधान को पा सकें।
जरूरत पड़ने पर आप सीधे 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 उत्पादों तक रखेगा; आपको यह पता लगाना चाहिए कि आप इस क्वेरी को किस सीमा तक रखना चाहते हैं।