ฉันจะอนุญาตให้ใช้เครื่องหมายจุลภาคในชื่อแท็กได้อย่างไร


15

ฉันต้องการอนุญาตให้ใช้เครื่องหมายจุลภาคในชื่อแท็กหรือไม่ ตัวอย่างเช่น"hello, world"หรือ"portland, or"แต่ Wordpress ยังคงแยกพวกเขา ฉันสามารถทำได้จากหน้าหมวดหมู่:

ภาพ http://img839.imageshack.us/img839/6869/picturepp.png

และมันก็แสดงให้เห็นว่าดี แต่สิ่งที่เพิ่มจากแถบด้านข้างโพสต์จะไม่ปรากฏขึ้นที่นี่:

ภาพ http://img52.imageshack.us/img52/4950/picture1oax.png

มีการอภิปรายเกี่ยวกับที่นี่: http://core.trac.wordpress.org/ticket/14691แต่ดูเหมือนว่ามันอาจจะไม่ได้รับการแก้ไขอย่างน้อยในขณะที่

ในระหว่างนี้ฉันกำลังมองหาทางออกที่ง่ายกว่าการเพิ่มหมวดหมู่จากหน้าหมวดหมู่

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

ฉันไม่สนใจว่าฉันจะต้องแก่นหลักของตัวเองหรือไม่ เป็นการดีที่ฉันสามารถเขียนปลั๊กอิน แต่หลังจากดูรหัสบางอย่างฉันไม่สามารถทราบได้ว่าสิ่งนี้ได้รับการจัดการอย่างไร

ใครบ้างมีวิธีแก้ปัญหาหรือเคล็ดลับเกี่ยวกับฟังก์ชั่นและจาวาสคริปต์ที่จะเริ่มต้นการแฮ็ค? ฉันไม่แน่ใจว่าจะเริ่มค้นหารหัสได้ที่ไหน


1
มีโชคในการบรรลุเป้าหมายนี้หรือไม่? ฉันกำลังมองหาทางออกด้วย
supertrue

ฉันเพิ่งเพิ่มพวกเขาจากหน้าหมวดหมู่ (ดังกล่าวข้างต้น) มันไม่สะดวก แต่ใช้งานได้ ไม่มีโชคในการแก้ไขแกนหรือเพิ่มตัวกรอง (ยัง)
cwd

1
อย่าดัดแปลงแกน;)
Jared

2
@Jared - มันตกลงในการปรับเปลี่ยนแกน - ตราบใดที่คุณส่งปัญหาของคุณได้ / แพทช์เพื่อ core.trac.wordpress.org และมีความตกลงกับการรักษาแพทช์ในการติดตั้งของคุณจนกว่าจะ (หวังว่า) ได้รับการดึงเข้าไปในแกน;)
cwd

ในกรณีนี้คุณพูดถูก :)
Jared

คำตอบ:


9

ไม่ต้องแฮ็กหลัก - ขอบคุณ: HOOKS

Hooks อนุญาตให้แก้ไขปัญหาด้วยการผสมผสานที่ดีของ

  • ตัวกรองแทนที่ "-" โดย "," ก่อนหน้าผลลัพธ์
  • และบล็อก "if" เพื่อให้แน่ใจว่าผลลัพธ์จะไม่ถูกกรองสำหรับอินเทอร์เฟซผู้ดูแลระบบ :)
  • และสุดท้ายบันทึกแท็กทั้งหมดของคุณด้วยเครื่องหมายจุลภาคในรูปแบบ "Fox - Peter" แทน "Fox, Peter"

นี่คือรหัส:

// filter for tags with comma
//  replace '--' with ', ' in the output - allow tags with comma this way
//  e.g. save tag as "Fox--Peter" but display thx 2 filters like "Fox, Peter"

if(!is_admin()){ // make sure the filters are only called in the frontend
    function comma_tag_filter($tag_arr){
        $tag_arr_new = $tag_arr;
        if($tag_arr->taxonomy == 'post_tag' && strpos($tag_arr->name, '--')){
            $tag_arr_new->name = str_replace('--',', ',$tag_arr->name);
        }
        return $tag_arr_new;    
    }
    add_filter('get_post_tag', 'comma_tag_filter');

    function comma_tags_filter($tags_arr){
        $tags_arr_new = array();
        foreach($tags_arr as $tag_arr){
            $tags_arr_new[] = comma_tag_filter($tag_arr);
        }
        return $tags_arr_new;
    }
    add_filter('get_terms', 'comma_tags_filter');
    add_filter('get_the_terms', 'comma_tags_filter');
}

อาจมีรายละเอียดเพิ่มเติมในโพสต์บล็อกของฉันในหัวข้อนั้นเช่นกัน .. http://blog.foobored.com/all/wordpress-tags-with-commas/

ทักทาย Andi


สิ่งนี้จะทำลาย เครื่องหมายจุลภาคไม่ใช่สตริงคงที่สามารถแปลได้ ใช้_x( ',', 'tag delimiter' )เพื่อจับตัวคั่นที่แท้จริง
fuxia

ฉันยังไม่ได้ทดสอบ แต่มันก็ดูดี - ขอบคุณ
cwd

ในเว็บไซต์ของคุณคุณมีภาษีที่กำหนดเองด้วยฉันขอแนะนำให้คุณเปลี่ยนชื่อฟังก์ชั่นสำหรับทุกคนที่ไม่สามารถเข้าใจได้ ในรหัสที่กำหนดเองที่คุณเขียน: comma_tags_filter แทนที่จะเป็น 'comma_tags_filter' ซึ่งค่อนข้างเจ็บรหัส ทั้งหมดในงานที่ดีทั้งหมด
David H

1

เป็นไปได้และง่ายมากในการบันทึกแท็กด้วยเครื่องหมายจุลภาคโดยทางโปรแกรม

เมื่อคุณโทรหาwp_set_post_terms( $post_id, $terms, $taxonomy )คุณใส่สตริงมันจะถูกกระจายเข้าไปในอาร์เรย์ หากคุณระบุให้คุณ$termsเป็นอาร์เรย์แต่ละรายการในอาเรย์จะได้รับเป็นคำของตัวเองโดยไม่แยกเป็นหลายเทอม

// Example term with comma.
$terms = 'Surname, Given Names';
// Creates and/or assigns multiple terms separated by a comma.
wp_set_post_terms( $post_id, $terms, $taxonomy );
// Creates and/or assigns a single term with a comma.
wp_set_post_terms( $post_id, (array) $terms, $taxonomy );

ทั้งสองwp_insert_postและwp_update_postใช้ในภายหลังwp_set_post_termsเมื่อ$arg tax_inputมีการตั้งค่า

// Ensure $terms is an array.
$args['tax_input'][$taxonomy] = (array) $terms;
$post_id = wp_insert_post( $args );

วิธีที่ดีที่สุดในการสร้างคำศัพท์โดยใช้ WordPress Dashboard UI อาจทำให้คุณต้องสร้างกล่องเมตาของคุณเองซึ่งส่งสตริงใด ๆ รวมถึงเครื่องหมายจุลภาคเป็นคำเดียว ปลั๊กอินบางตัวเช่น ACF Pro ทำสิ่งนี้ตามค่าเริ่มต้นเมื่อคุณสร้างฟิลด์ที่กำหนดเองเพื่อบันทึกอนุกรมวิธานและเลือกที่จะโหลดและกำหนดเงื่อนไขเมื่อบันทึก

/* Example JSON config snippet for an ACF Pro Export/Import. */
/* Most likely config for most of these situations: "allow_null" */
/* and "field_type" may need to be adjusted depending on the situation. */
{
    "type": "taxonomy",
    "field_type": "multi_select",
    "allow_null": 1,
    "add_term": 1,
    "save_terms": 1,
    "load_terms": 1
}

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

// Register Custom Taxonomy args - disable default UI in quick edit.
$args['show_in_quick_edit'] = false;
register_taxonomy( $taxonomy, (array) $post_types, $args );

ลองนึกถึงการแก้ไขที่สกปรก (ยังไม่ได้ทดสอบด้วยตัวเอง) แต่คุณสามารถเพิ่มตัวกรองที่จะทำให้ข้อตกลงมีความสะอาดอยู่เสมอโดยแปลงพวกมันทั้งหมดเป็นอาร์เรย์ add_filter( 'pre_tax_input', function( $tax_input ) { return (array) $tax_input; } );อย่างไรก็ตามจะอนุญาตให้คุณส่งคำได้ครั้งละหนึ่งคำเท่านั้น
Shaun Cockerill

0

คุณใช้ตัวกรอง

ตัวอย่างเช่นหากคุณต้องการเพิ่มเครื่องหมายจุลภาคหลังแต่ละแท็กใน tag cloud คุณสามารถใส่สิ่งต่อไปนี้ใน function.php ของคุณ

function myfunc_filter_tag_cloud($args) {
    $args['smallest'] = 18;
    $args['largest'] = 32;
    $args['unit'] = 'px';
    $args['separator']= ', ';
    return $args;
}
add_filter ( 'widget_tag_cloud_args', 'myfunc_filter_tag_cloud');

1
ปัญหาไม่แสดงด้วยเครื่องหมายจุลภาคปัญหาคือการรักษาเครื่องหมายจุลภาคเป็นส่วนหนึ่งของชื่อแท็ก / หมวดหมู่เมื่อป้อนพวกเขา (ในขณะที่แก้ไขโพสต์) ฉันต้องการทราบวิธีแก้ไข wordpress (หรือเขียนปลั๊กอิน) เพื่อให้ฉันทำเช่นนั้น
cwd

0

นี่คือทางออกของคุณ ให้ความสนใจกับสาย 2614:

    /**
2588   * Updates the cache for Term ID(s).
2589   *
2590   * Will only update the cache for terms not already cached.
2591   *
2592   * The $object_ids expects that the ids be separated by commas, if it is a
2593   * string.
2594   *
2595   * It should be noted that update_object_term_cache() is very time extensive. It
2596   * is advised that the function is not called very often or at least not for a
2597   * lot of terms that exist in a lot of taxonomies. The amount of time increases
2598   * for each term and it also increases for each taxonomy the term belongs to.
2599   *
2600   * @package WordPress
2601   * @subpackage Taxonomy
2602   * @since 2.3.0
2603   * @uses wp_get_object_terms() Used to get terms from the database to update
2604   *
2605   * @param string|array $object_ids Single or list of term object ID(s)
2606   * @param array|string $object_type The taxonomy object type
2607   * @return null|bool Null value is given with empty $object_ids. False if
2608   */
2609  function update_object_term_cache($object_ids, $object_type) {
2610      if ( empty($object_ids) )
2611          return;
2612  
2613      if ( !is_array($object_ids) )
2614          $object_ids = explode(',', $object_ids);
2615  
2616      $object_ids = array_map('intval', $object_ids);
2617  
2618      $taxonomies = get_object_taxonomies($object_type);
2619  
2620      $ids = array();
2621      foreach ( (array) $object_ids as $id ) {
2622          foreach ( $taxonomies as $taxonomy ) {
2623              if ( false === wp_cache_get($id, "{$taxonomy}_relationships") ) {
2624                  $ids[] = $id;
2625                  break;
2626              }
2627          }
2628      }
2629  
2630      if ( empty( $ids ) )
2631          return false;
2632  
2633      $terms = wp_get_object_terms($ids, $taxonomies, array('fields' => 'all_with_object_id'));
2634  
2635      $object_terms = array();
2636      foreach ( (array) $terms as $term )
2637          $object_terms[$term->object_id][$term->taxonomy][$term->term_id] = $term;
2638  
2639      foreach ( $ids as $id ) {
2640          foreach ( $taxonomies  as $taxonomy ) {
2641              if ( ! isset($object_terms[$id][$taxonomy]) ) {
2642                  if ( !isset($object_terms[$id]) )
2643                      $object_terms[$id] = array();
2644                  $object_terms[$id][$taxonomy] = array();
2645              }
2646          }
2647      }
2648  
2649      foreach ( $object_terms as $id => $value ) {
2650          foreach ( $value as $taxonomy => $terms ) {
2651              wp_cache_set($id, $terms, "{$taxonomy}_relationships");
2652          }
2653      }
2654  }
2655  

ภายในงาน wp-includes / taxonomy.php ขอให้โชคดีในการแฮ็ครหัส ไม่มีเบ็ดใด ๆ มันเขียนรหัสยาก ... ขออภัย ฉันคิดว่าการแฮ็กรหัสเป็นทางเลือกเดียวของคุณในตอนนี้


2
การแฮ็ก WP core อาจไม่ใช่ความคิดที่ดี
chrisguitarguy

2
ฉันรู้แล้ว! แต่เขาถามคำถาม ฉันแค่ให้คำตอบ
Asaf Chertkoff

ใช่ แต่การแฮ็คหลักคือคำตอบที่ผิด -1
EAMann

3
+1 - ในโพสต์ดั้งเดิมของฉันฉันได้พูดถึงว่าแฮ็คหลักเป็นที่ยอมรับในกรณีนี้ ฉันไม่สามารถหาที่ที่ฉันต้องการแฮ็คหลักเพื่อทำให้งานนี้ อย่างน้อยถ้าฉันรู้ว่าสิ่งนี้เป็นไปได้ฉันสามารถทำงานเพื่อพัฒนาปลั๊กอินหรือส่งคำขอตั๋วที่เหมาะสมเพื่อขอตะขอหรือตัวกรองจากชุมชน WP ดังนั้นขอบคุณ @AsafChertkoff แม้ว่าฉันจะยังไม่ได้ทดสอบตัวเอง
cwd

@cwd ยินดีต้อนรับคุณ :) หวังว่าจะช่วย
Asaf Chertkoff

0

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

แก้ไขง่าย ๆ :

ใช้,( รหัส HTML สำหรับเครื่องหมายจุลภาค ) แทนเครื่องหมายจุลภาคปกติ

แล้ว:

  • , จะแสดงเป็นเครื่องหมายจุลภาคที่ดีภายในโพสต์ชื่อหน้าแท็กและสถานที่อื่น ๆ
  • มันจะแสดงผลดิบเป็น,ภายในของอินเทอร์เฟซผู้ดูแลระบบเมื่อพิมพ์ชื่อของแท็ก

FYI ซึ่งใช้เอนทิตี HTML ,ไม่ทำงาน

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