สร้างทากจากตำแหน่งของกระทู้


14

เป็นไปได้ที่จะสร้างทากอีกครั้งโดยทางโปรแกรมหลังจากเปลี่ยนชื่อของโพสต์หรือไม่ มีการอัปเดตชื่อเรื่องจำนวนมากและกระสุนไม่ได้รับการอัปเดตด้วยชื่อเรื่องดังนั้นฉันต้องสร้างทากเหล่านี้ทั้งหมดใหม่


ฉันต้องทำสิ่งนี้หลายครั้งและพบว่าระหว่างสภาพแวดล้อมเซิร์ฟเวอร์ที่แตกต่างกันซึ่งมันไม่สามารถจัดการกับอาร์เรย์ขนาดใหญ่ (โดยมีการกำหนดหมายเลขโพสต์เป็นไม่ จำกัด ) หรือการเรียก wp_update_post ซ้ำ ๆ $ wpdb ว่าจัดการได้ง่ายและมีประสิทธิภาพ ฉันให้ตัวอย่างรหัสในการโพสต์ที่คล้ายกัน
codearachnid

คำตอบ:


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()ฟังก์ชัน: ซึ่งหมายความว่าการส่งกระสุนใหม่ไปยังการอัปเดตจะส่งผลให้เกิดการเปลี่ยนแปลงอย่างมีประสิทธิภาพสำหรับการโพสต์
Erenor Paz

2

ปลั๊กอินนี้ยังทำงาน: http://www.jerrytravis.com/598/wordpress-plugin-to-generate-post-slugs

อย่างไรก็ตามเนื่องจากมันจะทำเฉพาะโพสต์ที่ยังไม่มีทากถ้าคุณต้องการสร้างทากใหม่แก้ไขบรรทัดต่อไปนี้ในปลั๊กอิน:

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

ตัวอย่างเช่นคุณสามารถเปลี่ยนเป็น:

if (true) {


1

ฉันกำลังลองวิธีที่แนะนำโดย Toscho ซึ่งเป็น "instinctive one" แต่ในหลายกรณีมันไม่ทำงาน (cf รหัสหลักเพื่อรับสิ่งที่ฉันหมายถึงโดย "หลายกรณี")

เมื่อมองดูในรหัสฉันพบwp_insert_post_dataตัวกรองเบ็ดที่เรียกใช้โดยwp_update_postฟังก์ชันก่อนใส่โพสต์ iunto ลงในฐานข้อมูล

ด้วยการเรียกตัวกรองนี้และการเปลี่ยนค่าของ$data['post_name']ฉันก็สามารถทำให้มันทำงานได้อย่างถูกต้อง Wordpress เจ๋ง แต่บันทึกไม่ดี ...

ฉันแก้ไขเอกสารเพื่อให้ผู้คนสามารถหาวิธีแก้ปัญหานี้ได้มากขึ้นหากจำเป็น


คุณช่วยชี้ให้เห็นว่าทำไม wp_update_post เขียนทับ post_name ได้หรือไม่ เหตุผลเดียวที่ฉันเห็นสิ่งนี้เกิดขึ้นคือหากผู้ใช้พยายามแก้ไข post_name เป็นเพียงผู้มีส่วนร่วม (หรือระดับเดียวกัน) ซึ่งในกรณีนี้ไม่ควรอนุญาตให้ผู้ใช้นั้นเปลี่ยนกระสุนคุณพบกรณีอื่น ๆ ที่ post_name ถูกเขียนทับหรือไม่
jnhghy - Alexandru Jantea

ใช่นี่เป็นวิธีที่เหมาะสมที่จะทำ ขอบคุณ @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 คุณควรทราบว่าคุณต้องการให้มีข้อ จำกัด ใดบ้างในแบบสอบถามนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.