เครื่องมือแก้ไข TinyMCE กำลังทำลาย HTML ที่สวยงามของฉัน


9

นี่เป็นสิ่งที่ซ้ำกันแน่นอน: วิธีทำให้ Wordpress และ TinyMCE ยอมรับ <a> แท็กล้อมองค์ประกอบระดับบล็อกตามที่อนุญาตใน HTML5 ได้อย่างไร และHTML5, WordPress และปัญหา MCE จิ๋ว - ตัดแท็กสมอรอบผลลัพธ์ div ในผลลัพธ์ที่ขี้ขลาด

ปัญหาของฉันคือการแก้ปัญหาที่แนะนำ ( tiny_mce_before_initตัวกรอง) ดูเหมือนจะไม่แก้ปัญหาของฉัน ฉันมี HTML ที่มีลักษณะเช่นนี้:

<a href="#">
    <img src="path/to/file.jpg" />
    <p>Some amazing descriptive text</p>
</a>

ถูกกฎหมายอย่างสมบูรณ์ใน HTML5 อย่างไรก็ตามตัวแก้ไข WP ไม่ชอบและแปลงเป็น:

<a href="#">
    <img src="path/to/file.jpg" />
</a>
<p>Some amazing descriptive text</p>

แน่นอนว่านี่เป็นการแบ่งเลย์เอาต์ของฉัน ไม่มีใครรู้วิธีที่ฉันสามารถป้องกันพฤติกรรมนี้หรือไม่? ฉันไม่สามารถละองค์ประกอบVisualของเครื่องมือแก้ไขและใช้ข้อความธรรมดา ข้อเสนอแนะใด ๆ ยินดีต้อนรับ

เพื่อความชัดเจนเมื่อฉันใช้รหัสด้านล่าง ( แนะนำที่นี่ ) <p>แท็กได้รับอนุญาตให้อยู่ในจุดยึดได้ แต่มีการเพิ่มพื้นที่ว่างจำนวนมากพร้อมกับ&nbsp;เอนทิตีที่คูณทุกครั้งที่คุณสลับระหว่างโหมด Visual และ Text

add_filter('tiny_mce_before_init', 'modify_valid_children');

function modify_valid_children($settings){
    $settings['valid_children']="+a[div|p|ul|ol|li|h1|h2|h3|h4|h5|h5|h6]";
    return $settings;
}

ลองใช้ปลั๊กอินนี้ถ้าคุณไม่ได้โดมินิค ... บางครั้งมันมีปัญหาที่นี่หรือที่นั่นในการปรับปรุง แต่ส่วนใหญ่จะช่วยให้คุณใช้ html อย่างที่คุณคาดหวัง wordpress.org/plugins/preserved-html-editor-markup-plus
Bryan Willis

คำตอบ:


17

ไม่ว่าคุณจะกำหนดค่าอะไรในฐานะลูกที่ถูกต้อง WordPress จัดการแท็ก p รวมทั้งการขึ้นบรรทัดใหม่ด้วยวิธีที่ไม่เหมือนใคร คุณอาจสังเกตเห็นในที่สุดถ้าคุณยังไม่ได้เมื่อเปลี่ยนจากตัวแก้ไขข้อความเป็นโปรแกรมแก้ไขภาพและกลับมาที่<p>แท็กของคุณจะถูกปล้นคล้ายกับสิ่งที่เกิดขึ้นในส่วนหน้า วิธีที่จะป้องกันสิ่งนี้ไม่ให้เกิดขึ้นคือการให้<p>แท็กเป็นคลาสที่กำหนดเอง

<p class="text">This p tag won't get removed"</p>.

แม้ว่า this จะป้องกันแท็ก p ของคุณจากการถูกปล้น แต่มันจะไม่แก้ไขปัญหาของคุณเนื่องจากมาร์กอัปของคุณในส่วนหน้ายังคงมีปัญหา คุณสามารถปิดการใช้งาน wpautop ถ้าคุณทำเช่นนั้นและมี P รวมในเด็กที่ถูกต้องนี้จะแก้ไข ISSSUE

ตัวเลือกที่ 1: ปิดใช้งาน Autop และตั้งค่า Children ที่ถูกต้อง

remove_filter( 'the_content', 'wpautop' );
add_filter('tiny_mce_before_init', 'modify_valid_children', 99);
function modify_valid_children($settings){     
    $settings['valid_children']="+a[div|p|ul|ol|li|h1|span|h2|h3|h4|h5|h5|h6]";
    return $settings;
}

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


ตัวเลือก 2: ปิดใช้งาน Auto P, TinyMCE และตั้งค่า Children ที่ถูกต้อง

remove_filter( 'the_content', 'wpautop' );
add_filter('tiny_mce_before_init', 'modify_valid_children', 99);
function modify_valid_children($settings){     
    $settings['valid_children']="+a[div|p|ul|ol|li|h1|span|h2|h3|h4|h5|h5|h6]";
    return $settings;
}
add_filter('user_can_richedit', 'disable_wyswyg_to_preserve_my_markup');
function disable_wyswyg_to_preserve_my_markup( $default ){
  if( get_post_type() === 'post') return false;
  return $default;
}

สำหรับคนส่วนใหญ่แม้ว่า this นี้ จะไม่ใช่ตัวเลือก


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

ตัวเลือก 3: ตัวเลือก 1 + แท็กช่วงสไตล์

HTML

<a href="#"><img src="https://placehold.it/300x200?text=Don%27t+P+On+Me" alt="" /><span class="noautop">Some amazing descriptive text</span></a>

CSS ในสไตล์ชีท

.noautop {
    display: block;
}

ตัวเลือก 4: ใช้รหัสย่อเครื่องมืออัปโหลดสื่อบันทึกในตัว

รหัสสื่ออัพโหลด

ตอนแรกฉันลืมรหัสนี้ แต่รหัสย่อ [คำบรรยายภาพ]จะมีลักษณะเช่นนี้:

[caption id="attachment_167" align="alignnone" width="169"]
    <img class="size-medium wp-image-167" src="http://example.com/example.png" alt="" width="169" height="300" />
    awesome caption
[/caption]

ผลลัพธ์จะมีลักษณะดังนี้:

<figure id="attachment_167" style="width: 169px" class="wp-caption alignnone">
    <img class="size-medium wp-image-167" src="http://example.com/example.png" alt="" width="169" height="300" />
    <figcaption class="wp-caption-text">Some amazing descriptive text</figcaption>
</figure>

หากคุณไม่ต้องการแท็กรูปคุณสามารถใช้ปลั๊กอินเช่นรหัสย่อเนื้อหาที่กำหนดเองที่ให้คุณทำสิ่งนี้:

[raw] <p>this content will not get filtered by wordpress</p> [/raw]

เหตุใดเครื่องมือแก้ไขจึงไม่ทำงานตามที่ฉันต้องการ

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

ตัวเลือกที่ 5: มาร์กอัปตัวแก้ไข HTML ที่สงวนไว้

ดังนั้นช่วยให้คุณปวดหัวและไปกับสิ่งนี้ ตามค่าเริ่มต้นมาร์กอัปตัวแก้ไข HTML ที่สงวนไว้จะมีผลกับหน้าใหม่เท่านั้น หากคุณต้องการเปลี่ยนหน้าเว็บที่สร้างไว้แล้วคุณต้องไปที่www.example.com/wp-admin/options-writing.phpและแก้ไขการตั้งค่าปลั๊กอิน นอกจากนี้คุณยังสามารถเปลี่ยนพฤติกรรมการขึ้นบรรทัดใหม่ที่เป็นค่าเริ่มต้น

หมายเหตุ: หากคุณตัดสินใจที่จะใช้สิ่งนี้ตรวจสอบให้แน่ใจว่าคุณได้ตรวจสอบเธรดการสนับสนุนเมื่อมีการเปิดตัวอัปเดต WordPress ใหม่ ในบางครั้งการเปลี่ยนแปลงจะทำให้เกิดความยุ่งเหยิงดังนั้นจึงเป็นการดีที่สุดที่จะตรวจสอบให้แน่ใจว่าปลั๊กอินใช้งานได้กับเวอร์ชันที่ใหม่กว่า


เครดิตพิเศษ: การดีบักปัญหาของคุณ / แก้ไขตัวเลือก TinyMCE อื่น ๆ

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

ตัวอย่างเช่นฉันมีทั้งที่และ HTML Editor Markup Plus ที่เก็บรักษาไว้ ภาพหน้าจอด้านล่างเป็นของหน้าผู้ดูแลระบบขั้นสูง TinyMCE ในขณะที่ภาพหน้าจอตัดส่วนที่เป็น 90% ออกไปจริงๆคุณสามารถดูได้ว่าเด็ก ๆ ที่ถูกต้องสามารถแก้ไขได้และเพิ่มมาร์กอัป HTML Editor Markup Plusใด

เครื่องมือแก้ไข TinyMCE

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

function fix_tiny_mce_before_init( $in ) {

    // You can actually debug this without actually needing Advanced Tinymce Config enabled:
    // print_r( $in );
    // exit();

  $in['valid_children']="+a[div|p|ul|ol|li|h1|span|h2|h3|h4|h5|h5|h6]";
    $in[ 'force_p_newlines' ] = FALSE;
    $in[ 'remove_linebreaks' ] = FALSE;
    $in[ 'force_br_newlines' ] = FALSE;
    $in[ 'remove_trailing_nbsp' ] = FALSE;
    $in[ 'apply_source_formatting' ] = FALSE;
    $in[ 'convert_newlines_to_brs' ] = FALSE;
    $in[ 'verify_html' ] = FALSE;
    $in[ 'remove_redundant_brs' ] = FALSE;
    $in[ 'validate_children' ] = FALSE;
    $in[ 'forced_root_block' ]= FALSE;

    return $in;
}
add_filter( 'tiny_mce_before_init', 'fix_tiny_mce_before_init' );

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

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


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

หวังว่านี่จะช่วยโดมินิก! สิ่งสุดท้ายที่ฉันอยากพูดถึงคือคุณสามารถเพิ่มคำอธิบายภาพใน wordpress ผ่านตัวอัปโหลดสื่อ นอกจากนี้ฉันเชื่อว่าวิธีที่ถูกต้องในการทำสิ่งนี้คือความหมายแบบนี้ w3schools.com/tags/tag_figcaption.asp
Bryan Willis

นั่นเป็นความคิดที่น่าสนใจ ฉันไม่ได้พิจารณาว่าทำเครื่องหมายเป็นรูปและคำบรรยายภาพ ฉันจะลองดูสิ
Dominic P

เพียงแค่ปิดนี้ ฉันบาดแผลโดยใช้<span>แท็ก ฉันเกลียดที่มาร์กอัปของฉันตอนนี้ขึ้นอยู่กับพื้นที่สีขาว แต่มันเป็นเส้นทางของการต่อต้านน้อยที่สุดสำหรับตอนนี้ ฉันพยายาม<figcaption>แต่มันเป็นองค์ประกอบระดับบล็อกและ TinyMCE จะไม่อนุญาตให้<a>แท็กล้อมรอบดังนั้นฉันจึงกลับมาที่สี่เหลี่ยมจัตุรัส ขอบคุณอีกครั้งสำหรับความคิดทั้งหมด
Dominic P

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