Làm cách nào tôi có thể cho phép dấu phẩy trong tên thẻ?


15

Tôi muốn cho phép dấu phẩy trong tên thẻ? Ví dụ, "hello, world"hoặc "portland, or"Wordpress tiếp tục phân tách chúng. Tôi có thể làm điều đó từ trang chuyên mục:

hình ảnh http://img839.imageshack.us/img839/6869/picturepp.png

Và nó xuất hiện tốt. Nhưng bất cứ điều gì được thêm từ thanh bên bài viết không hiển thị ok ở đây:

hình ảnh http://img52.imageshack.us/img52/4950/picture1oax.png

Có một số cuộc thảo luận về nó ở đây: http://core.trac.wordpress.org/ticket/14691 nhưng có vẻ như nó có thể không được giải quyết, ít nhất là trong một thời gian.

Trong khi đó, tôi đang tìm kiếm một giải pháp dễ dàng hơn là thêm các danh mục từ trang danh mục.

Tôi đã thử tìm kiếm các plugin và không thấy cái nào hữu ích. Có một số vấn đề liên quan đến việc thay thế dấu phẩy bằng các ký tự khác khi hiển thị danh sách danh mục hoặc thẻ, nhưng tôi không thấy bất kỳ plugin nào cho phép người dùng thay thế dấu phân cách mặc định.

Tôi không quan tâm nếu tôi phải tự vá lõi. Lý tưởng nhất là tôi có thể viết một plugin, nhưng sau khi xem qua một số mã tôi không thể tìm ra nơi này được xử lý.

Có ai có một giải pháp, hoặc lời khuyên về các chức năng và javascript để bắt đầu hack không? Tôi không chắc bắt đầu tìm mã ở đâu.


1
Bất kỳ may mắn về việc đạt được điều này? Tôi cũng đang tìm kiếm một giải pháp.
tối

Tôi vừa thêm chúng từ trang chuyên mục (như đã đề cập ở trên). Nó bất tiện nhưng hoạt động. Không may mắn sửa đổi lõi hoặc thêm bộ lọc (chưa).
cwd

1
Không bao giờ sửa đổi lõi;)
Jared

2
@Jared - Bạn có thể sửa đổi lõi - miễn là bạn gửi vấn đề / bản vá của mình đến core.trac.wordpress.org và vẫn ổn với việc duy trì bản vá trên bản cài đặt của bạn cho đến khi nó (hy vọng) được kéo vào lõi;)
cwd

Trong trường hợp đó, bạn đã đúng. :)
Jared

Câu trả lời:


9

Không cần hack cốt lõi - nhờ: HOOKS.

Móc cho phép khắc phục sự cố với sự kết hợp tốt đẹp của

  • bộ lọc thay thế "-" bởi "," trước khi xuất
  • và một khối "nếu" để đảm bảo đầu ra cũng không được lọc cho giao diện quản trị :)
  • và cuối cùng, lưu tất cả các thẻ của bạn bằng dấu phẩy ở định dạng "Fox - Peter" thay vì "Fox, Peter"

Đây là mã:

// 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');
}

Có thể một số chi tiết bổ sung trong bài đăng trên blog của tôi cho chủ đề đó cũng giúp .. http://blog.foobored.com/all/wordpress-tags-with-commas/

Greets, Andi


Điều này sẽ phá vỡ. Dấu phẩy không phải là một chuỗi cố định, nó có thể được dịch. Sử dụng _x( ',', 'tag delimiter' )để bắt các dấu phân cách thực sự.
fuxia

Tôi chưa thử nó nhưng có vẻ tốt - cảm ơn bạn
cwd

Trên trang web của bạn, bạn cũng có thuế tùy chỉnh, tôi khuyên bạn nên thay đổi tên hàm cho bất kỳ ai không thể tìm ra. Trên mã tùy chỉnh bạn đã viết: comma_tags_filter thay vì 'comma_tags_filter', điều này làm tổn thương khá nhiều mã. Tất cả trong tất cả các công việc tuyệt vời.
David H

1

Có thể và rất dễ dàng để lưu các thẻ bằng dấu phẩy theo chương trình.

Khi gọi wp_set_post_terms( $post_id, $terms, $taxonomy ), nếu bạn cung cấp một chuỗi, nó sẽ bị nổ thành một mảng. Nếu bạn cung cấp $termsdưới dạng một mảng, mỗi mục trong mảng sẽ được cung cấp dưới dạng một thuật ngữ riêng mà không bị chia thành nhiều điều khoản.

// 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 );

Cả hai wp_insert_postvà sau đó wp_update_postsử dụng wp_set_post_termskhi $arg tax_inputđược đặt.

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

Cách tốt nhất để tạo các thuật ngữ một cách nhanh chóng bằng Giao diện người dùng Bảng điều khiển WordPress, có thể yêu cầu bạn tạo hộp meta của riêng mình để gửi bất kỳ chuỗi nào, kể cả dấu phẩy dưới dạng một thuật ngữ. Một số plugin, chẳng hạn như ACF Pro, làm điều này theo mặc định khi bạn tạo trường tùy chỉnh để lưu phân loại và chọn để tải và gán các điều khoản khi được lưu.

/* 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
}

Ngay cả khi được lưu bằng dấu phẩy, mỗi phần của các thuật ngữ có dấu phẩy vẫn có thể xuất hiện dưới dạng các mục riêng biệt khi chỉnh sửa bài đăng. Trong trường hợp này, tốt nhất là vô hiệu hóa UI mặc định và dựa vào các hộp meta tùy chỉnh. Điều này có thể được thực hiện bằng Tùy chọn màn hình khi chỉnh sửa loại bài đăng. Phân loại tùy chỉnh cũng có thể được ẩn khỏi phần chỉnh sửa nhanh khi được đăng ký.

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

Chỉ cần nghĩ về một bản sửa lỗi bẩn (bản thân tôi chưa thử nó), nhưng bạn có thể thêm một bộ lọc sẽ luôn vệ sinh các điều khoản, bằng cách chuyển đổi tất cả chúng thành một mảng. add_filter( 'pre_tax_input', function( $tax_input ) { return (array) $tax_input; } );tuy nhiên, nó sẽ chỉ cho phép bạn gửi một thuật ngữ tại một thời điểm.
Gà trống Shaun

0

bạn mau sử dụng bộ lọc.

Ví dụ: nếu bạn muốn Thêm dấu phẩy sau mỗi thẻ trong đám mây thẻ, bạn có thể đặt phần sau vào hàm.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
Vấn đề là không hiển thị chúng bằng dấu phẩy, vấn đề là giữ dấu phẩy như một phần của tên thẻ / danh mục khi nhập chúng (trong khi chỉnh sửa bài đăng). Tôi muốn tìm ra cách chỉnh sửa wordpress (hoặc viết plugin) để cho phép tôi làm điều đó.
cwd

0

Đây là giải pháp của bạn đặt. Hãy chú ý đến dòng 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  

Bên trong wp-gồm / taxonomy.php . Chúc may mắn hack được mã. không có bất kỳ móc. nó khó mã hóa ... Xin lỗi. Tôi nghĩ rằng hack mã là lựa chọn duy nhất của bạn bây giờ.


2
Hack lõi WP có lẽ không phải là một ý tưởng tốt.
chrisguitarguy

2
Tôi biết điều đó! nhưng anh hỏi câu hỏi Tôi chỉ đưa ra câu trả lời.
Asaf Chertkoff

Có, nhưng hack cốt lõi là câu trả lời sai . -1
EAMann

3
+1 - Trong bài viết gốc của tôi, tôi đã đề cập rằng việc hack lõi là chấp nhận được trong trường hợp này. Tôi thậm chí không thể tìm thấy nơi tôi cần hack cốt lõi để làm cho công việc này. Ít nhất nếu tôi biết điều này là có thể, tôi có thể làm việc để phát triển một plugin hoặc gửi một yêu cầu vé thích hợp yêu cầu một cái móc hoặc bộ lọc từ cộng đồng WP. Vì vậy, cảm ơn bạn @AsafChertkoff, mặc dù tôi chưa tự mình kiểm tra điều này.
cwd

@cwd, chào mừng bạn :). Hy vọng rằng sẽ giúp.
Asaf Chertkoff

0

Dấu phẩy trong tên thẻ sẽ không hoạt động chính xác bởi vì, khi thêm thẻ vào bài đăng, WordPress sẽ phân tích cú pháp dưới dạng nhiều từ khóa, phá vỡ tại dấu phẩy.

Một sửa chữa đơn giản:

Sử dụng ,( mã HTML cho dấu phẩy ) thay vì dấu phẩy thông thường.

Sau đó:

  • , sẽ hiển thị dưới dạng dấu phẩy đẹp bên trong các bài đăng, tiêu đề trang thẻ và một loạt các địa điểm khác.
  • Nó sẽ hiển thị thô, như ,, bên trong giao diện quản trị khi nhập tên của thẻ.

FYI, sử dụng thực thể HTML, ,không hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.