Apply_filters ('the_content', $ content) vs do_shortcode ($ content)


21

ให้บอกว่าฉันมีตัวเลือกชุดรูปแบบหรือพื้นที่ข้อความ postmeta ที่กำหนดเอง ตอนนี้ฉันต้องการเรียกใช้รหัสย่อหลายข้อความทั่วไปรูปภาพ ฯลฯ

อะไรจะเป็นแนวปฏิบัติที่ดีที่สุดและทำไม

ตัวเลือกที่ 1:

$content = //my text area data;
echo apply_filters('the_content', $content);

ตัวเลือก 2:

$content = //my text area data;
echo do_shortcode($content);

โปรดอธิบายให้ฉันฟังว่าจะใช้วิธีใดดีที่สุดและทำไม

แก้ไข

ให้ฉันอธิบายสถานการณ์โดยละเอียด ฉันพัฒนาธีมสำหรับลูกค้าตามความต้องการของพวกเขา บางครั้งฉันต้องเพิ่มเมตาโพสต์ในโพสต์ / หน้า / ประเภทโพสต์ที่กำหนดเองเพื่อให้พวกเขาสามารถเพิ่มรหัสย่อ (ตัวเลื่อนรูปแบบการติดต่อ ฯลฯ ) หรือเพียงแค่ข้อความธรรมดา มันเป็นข้อความที่ยื่น

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

กระบวนการทั้งหมดนี้สามารถทำได้ในตัวแก้ไขข้อความเริ่มต้นของ wp แต่ฉันต้องสร้างตัวเลือกเหล่านั้นสำหรับการใช้งานเฉพาะเทมเพลตนั่นคือสิ่งที่ลูกค้าของฉันต้องการ

คำตอบ:


16

คำถามและคำตอบที่ได้รับคำตอบ

บางครั้งมีคำถามเหล่านี้ที่ทำให้คุณไม่สนใจและตามล่าคุณในภายหลังอีกครั้งในชีวิตและนี่เป็นคำถามเช่นนั้น

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

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

นี่คือความคิดของฉัน:

สถานการณ์:

หมายเหตุ: สิ่งนี้สามารถแก้ไขได้เพื่อให้เหมาะกับความต้องการใด ๆ

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

ทางออกที่เป็นไปได้:

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

แผนการ:

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

ขั้นตอนต่อไปคือการเพิ่มอาร์กิวเมนต์ข้อความค้นหาที่กำหนดเองของเราในฟิลด์ของเรา ช่วยบอกว่าเราต้องแสดง 3 โพสต์จากหมวด 1 เรียงตามชื่อ ดังนั้นข้อโต้แย้งของเราควรมีลักษณะเช่นนี้: ( ในรูปแบบสตริง )

'posts_per_page=3&cat=1&orderby=title'

นี่คือสิ่งที่คุณควรป้อนในฟิลด์ที่กำหนดเองของคุณ เมื่อป้อนแล้วให้บันทึกค่าของฟิลด์ที่คุณกำหนดเอง

ถัดไปคือการสร้างแบบสอบถามที่กำหนดเองใน single.php ของคุณ สิ่งที่จำเป็นต้องที่นี่เราจะต้องได้รับความคุ้มค่าจากสนามของเราเองที่เป็นจริงข้อโต้แย้งแบบสอบถามของเราและอาหารที่ให้เป็นตัวอย่างใหม่ของWP_Queryการดึงการโพสต์ นอกจากนี้เรายังต้องตรวจสอบว่าเรามีการบันทึกค่าในฟิลด์ที่กำหนดเองจริงหรือไม่ถ้าฟิลด์ที่กำหนดเองนั้นว่างเปล่าไม่แสดงอะไรเลย

รหัส:

คุณสามารถลองสิ่งนี้ได้ใน single.php หลังการโพสต์เดียว

$args = get_post_meta( get_queried_object_id(), 'custom_query_arguments', true );
// check if the custom field has a value
if( ! empty( $args ) ) {

    $q = new WP_Query( $args );

    if( $q->have_posts() ) {
        while( $q->have_posts() ) {
            $q->the_post();

            the_title();

        }
        wp_reset_postdata();
    }

} 

หากผู้ใช้ต้องการที่จะลบแบบสอบถามที่กำหนดเองเขาก็สามารถลบค่าของเขตข้อมูลที่กำหนดเองและปล่อยให้ฟิลด์ที่กำหนดเองว่างเปล่า หากเขาต้องการแสดงข้อความค้นหาเดียวกัน แต่จากหมวดหมู่ 10 และโพสต์ทั้งหมด 5 โพสต์เขาสามารถแทนที่ค่าเดิมด้วยค่าต่อไปนี้

'posts_per_page=5&cat=10&orderby=title'

หมายเหตุไม่กี่:

เป็นสิ่งสำคัญที่จะต้องใช้ซินแท็กซ์และรูปแบบที่ถูกต้องเมื่อป้อนข้อมูลลงในฟิลด์ที่กำหนดเองและกล่องเมตา ข้อผิดพลาดทางไวยากรณ์หรือข้อมูลที่ไม่ถูกต้องจะนำไปสู่ผลลัพธ์ที่ไม่พึงประสงค์หรือข้อผิดพลาดร้ายแรง สิ่งสำคัญคือให้ลูกค้าของคุณทราบข้อมูลดังกล่าว

คำตอบเดิม

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

ตัวเลือกที่ 1

apply_filters('the_content', $content);$post->post_contentจะใช้ในการใช้ตัวกรองเนื้อหาที่จะโพสต์เนื้อหาดิบที่ไม่ได้กรองซึ่งมักจะมาจากการใช้ ตัวกรองเหล่านี้รวมถึงตัวกรองที่มีชื่อเสียงwp_autopซึ่งเพิ่มแท็ก pthe_content()

apply_filters('the_content', $content); มีการใช้งานร่วมกับget_postsที่หนึ่งทำงานโดยตรงกับWP_Postวัตถุโดยไม่ต้องใช้setup_postdata( $post )ซึ่งทำให้แท็กแม่แบบเช่นthe_content() พร้อมใช้งาน

ตัวเลือก 2

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

การใช้งานที่ถูกต้องมีดังนี้

ตัวอย่าง: การเพิ่มรหัสย่อคลังภาพในไฟล์เทมเพลต

echo do_shortcode( '[gallery]' )

แก้ไข 1

จากความคิดเห็นของคุณฉันจะไม่ใช้รหัสย่อเลย

หากคุณจะไม่เพิ่มรหัสย่อผ่านโปรแกรมแก้ไขข้อความและจะเพิ่มโดยตรง (hardcode) ผ่านทางdo_shortcodeในไฟล์เทมเพลตฉันต้องการเพิ่มฟังก์ชันไปยังเทมเพลต

ตัวอย่าง:

หากคุณมีฟังก์ชั่นรหัสต่อไปนี้

function footag_func( $atts ) {
    return "foo = {$atts['foo']}";
}
add_shortcode( 'footag', 'footag_func' );

คุณสามารถเรียกใช้ฟังก์ชันได้โดยตรงในเทมเพลตเช่น

echo footag_func();

มันเร็วกว่ามากด้วยวิธีนี้เนื่องจากไม่จำเป็นต้องมีการแยกวิเคราะห์รหัสย่อ

แก้ไข 2

ความซื่อสัตย์ที่นี่คุณทำผิดอย่างสมบูรณ์จากการแก้ไขของคุณ นั่นคือเหตุผลที่ฉันไม่เข้าใจคำถามเริ่มต้นของคุณ

บางครั้งฉันต้องเพิ่มเมตาโพสต์ในโพสต์ / หน้า / ประเภทโพสต์ที่กำหนดเองเพื่อให้พวกเขาสามารถเพิ่มรหัสย่อ (ตัวเลื่อนรูปแบบการติดต่อ ฯลฯ ) หรือเพียงแค่ข้อความธรรมดา มันเป็นข้อความที่ยื่น

เพื่อให้รหัสย่อทำงานได้ฉันใช้ตัวเลือก 1 .....

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

ตามที่ฉันระบุไว้ก่อนหน้าapply_filters('the_content', $content);นี้มีวัตถุประสงค์เพื่อใช้ในการจัดรูปแบบกับเนื้อหาโพสต์ดิบ

คุณมีสองทางเลือกที่นี่

  • ใช้do_shortcodeโดยตรงในไฟล์เทมเพลตซึ่งฉันไม่แนะนำให้ใช้เนื่องจากฟังก์ชั่นนั้นเร็วกว่าเนื่องจากไม่จำเป็นต้องแยกวิเคราะห์รหัสย่อ

  • ใช้รหัสย่อในโปรแกรมแก้ไขข้อความโดยตรงสำหรับหน้า / โพสต์นั้น ๆ

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

คำแนะนำของฉันอาจจะดูเป็นวิดเจ็ตที่กำหนดเองหรือระบบที่คุณสามารถใช้กับฟิลด์ที่กำหนดเอง


1
ปีเตอร์ขอบคุณสำหรับคำอธิบาย ฉันรู้แล้วว่า แต่ฉันถามว่าตัวเลือกใดจะแม่นยำกว่านี้หากเป้าหมายเป็นเพียงรหัสย่อเอาต์พุตจาก textarea ของตัวเลือก post meta / theme ฉันกำลังใช้ option1 เพื่อรับเนื้อหาที่ถูกกรองและมันก็กลายเป็นนิสัยของฉัน และใช้ตัวเลือกที่ 1 แม้เพียงพิมพ์รหัสย่อจาก textfiled ดังนั้นก็ถาม
тнє Sufi

ฉันเห็นการแก้ไข ฉันเข้าใจคุณแล้ว แต่สถานการณ์ของฉันแตกต่างกัน มันเหมือนมีข้อความยื่น / พื้นที่และรหัสย่อหลาย ขณะนี้ผู้ใช้สามารถใส่รหัสย่อใด ๆ ในพื้นที่นั้นได้ ดังนั้นฉันจึงไม่สามารถใช้ฟังก์ชั่นได้โดยตรง ฉันต้องทำให้ส่วนนั้นเป็นแบบไดนามิก
тнє Sufi

ช่องข้อความนั้นอยู่ตรงไหนเหมือนในหน้าจอแก้ไขหน้าหลัง
Pieter Goosen

มันอาจเป็นโพสต์เมตา หรืออาจเป็นตัวเลือกชุดรูปแบบ ฉันใช้ตัวกรอง _ เนื้อหาสำหรับทั้งคู่
тнє Sufi

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