태그 이름에 쉼표를 허용하려면 어떻게합니까?


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에 문제 / 패치를 제출하고 (희망)의 핵심에 들어갔습니다 때까지 설치에 패치를 유지와 OK이기 때문에;)을
Cwd

이 경우에 옳습니다. :)
Jared

답변:


9

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/

인사, 앤디


고장날 것입니다. 쉼표는 고정 문자열이 아니므로 번역 할 수 있습니다. _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 대시 보드 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를 비활성화하고 사용자 정의 메타 상자를 사용하는 것이 가장 좋습니다. 게시물 유형을 편집 할 때 화면 옵션을 사용하여 수행 할 수 있습니다. 맞춤 분류 체계는 등록시 빠른 편집 섹션에서 숨길 수도 있습니다.

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

당신은 필터를 사용합니다.

예를 들어, 태그 클라우드에서 각 태그 뒤에 쉼표를 추가하려는 경우 functions.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 코어를 해킹하는 것은 좋은 생각이 아닙니다.
chrisguitarguy

2
알아요! 그러나 그는 질문했다. 나는 방금 대답했다.
Asaf Chertkoff 2019

네,하지만 핵심을 해킹하는 것은입니다 잘못된 대답은. -1
EAMann 2019

3
+1-원래 게시물에서이 경우 코어 해킹이 허용된다고 언급했습니다. 이 작업을 수행하기 위해 코어를 해킹해야 할 곳을 찾을 수도 없었습니다. 적어도 이것이 가능하다는 것을 알고 있다면 플러그인을 개발하거나 WP 커뮤니티의 후크 또는 필터를 요청하는 적절한 티켓 요청을 제출할 수 있습니다. 아직 테스트하지는 않았지만 @AsafChertkoff에게 감사드립니다.
cwd

@cwd, 환영합니다 :). 그것이 도움이되기를 바랍니다.
Asaf Chertkoff

0

태그를 게시물에 추가 할 때 WordPress에서 태그를 여러 키워드로 구문 분석하여 쉼표로 구분하므로 태그 이름의 쉼표가 제대로 작동하지 않습니다.

간단한 수정 :

사용 ,( 쉼표에 대한 HTML 코드 대신 일반 쉼표).

그때:

  • , 게시물, 태그 페이지 제목 및 기타 여러 곳에 멋진 쉼표로 표시됩니다.
  • ,태그 이름을 입력하면 관리 인터페이스 내부에 로 표시 됩니다.

HTML 엔터티를 사용하는 FYI ,가 작동하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.