Como posso permitir vírgulas nos nomes de tags?


15

Quero permitir vírgulas nos nomes de tags? Por exemplo, "hello, world"ou "portland, or"mas o Wordpress continua separando-os. Eu posso fazer isso na página de categorias:

imagem http://img839.imageshack.us/img839/6869/picturepp.png

E isso mostra-se bem. Mas qualquer coisa adicionada na barra lateral das postagens não aparece bem aqui:

imagem http://img52.imageshack.us/img52/4950/picture1oax.png

Há alguma discussão sobre isso aqui: http://core.trac.wordpress.org/ticket/14691, mas parece que isso pode não ser resolvido, pelo menos por um tempo.

Enquanto isso, estou procurando uma solução mais fácil do que adicionar categorias na página de categorias.

Tentei pesquisar plug-ins e não vi nenhum que fosse útil. Há alguns que lidam com a substituição de vírgulas por outros caracteres ao exibir uma lista de categorias ou tags, mas não vejo plugins que permitam ao usuário substituir o separador padrão.

Não me importo se tenho que consertar o núcleo. Idealmente, eu poderia escrever um plug-in, mas depois de analisar alguns dos códigos, não consigo descobrir onde isso é tratado.

Alguém tem uma solução, ou dicas sobre quais funções e javascript para começar a invadir? Não sei por onde começar a procurar no código.


1
Alguma sorte em conseguir isso? Eu também estou procurando uma solução.
supertrue

Acabei de adicioná-los a partir da página de categorias (como mencionado acima). É inconveniente, mas funciona. Sem sorte em modificar o núcleo ou adicionar um filtro (ainda).
cwd

1
Nunca modifique o núcleo;)
Jared

2
@Jared - não há problema em modificar o núcleo - desde que você envie seu problema / patch para core.trac.wordpress.org e não deixe de manter o patch em sua instalação até que (espero) seja puxado para dentro do núcleo;)
cwd 31/01

Nesse caso, você está certo. :)
Jared

Respostas:


9

Não é necessário hackear o núcleo - graças a: HOOKS.

Os ganchos permitem corrigir o problema com uma boa combinação de

  • um filtro substituindo "-" por "," antes da saída
  • e um bloco "if" para garantir que a saída também não seja filtrada para a interface de administração :)
  • e, finalmente, salvando todas as suas tags com vírgula no formato "Fox - Peter" em vez de "Fox, Peter"

Aqui está o código:

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

Talvez alguns detalhes adicionais na minha postagem do blog sobre esse tópico também ajudem. Http://blog.foobored.com/all/wordpress-tags-with-commas/

Cumprimenta, Andi


Isso vai quebrar. A vírgula não é uma sequência fixa, pode ser traduzida. Use _x( ',', 'tag delimiter' )para capturar o delimitador real.
Fuxia

Eu não testei ainda, mas parece bom - obrigado
cwd

No seu site você também possui os impostos personalizados, sugiro que você altere os nomes das funções para qualquer pessoa que não consiga descobrir. No código personalizado que você escreveu: comma_tags_filter em vez de 'comma_tags_filter', o que prejudica bastante o código. Tudo em tudo ótimo trabalho.
21713 David David H

1

É possível e muito fácil salvar tags com vírgulas programaticamente.

Ao chamar wp_set_post_terms( $post_id, $terms, $taxonomy ), se você fornecer uma sequência, ela será explodida em uma matriz. Se você fornecer seu $termscomo uma matriz, cada item da matriz será fornecido como um termo próprio, sem ser dividido em vários termos.

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

Ambos wp_insert_poste subsequentemente wp_update_postusam wp_set_post_termsquando o $arg tax_inputestá definido.

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

A melhor maneira de criar termos dinamicamente usando a interface do usuário do WordPress Dashboard, pode exigir que você crie sua própria meta box que envie qualquer string, incluindo vírgulas como um único termo. Alguns plug-ins, como o ACF Pro, fazem isso por padrão quando você cria um campo personalizado para salvar a taxonomia e seleciona também para carregar e atribuir os termos quando salvos.

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

Mesmo quando salvos com uma vírgula, cada parte desses termos com vírgulas ainda pode aparecer como itens separados ao editar a postagem. Nesse caso, talvez seja melhor desativar a interface do usuário padrão e confiar nas meta boxes personalizadas. Isso pode ser feito usando as Opções da tela ao editar um tipo de postagem. As taxonomias personalizadas também podem ser ocultadas na seção de edição rápida ao serem registradas.

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

Pensei em uma correção suja (ainda não a testei), mas você pode adicionar um filtro que sempre limpe os termos, convertendo-os todos em uma matriz. add_filter( 'pre_tax_input', function( $tax_input ) { return (array) $tax_input; } );no entanto, isso permitirá que você envie apenas um termo por vez.
precisa saber é o seguinte

0

você mal usa um filtro.

Por exemplo, se você deseja adicionar uma vírgula após cada tag em uma nuvem de tags, você pode colocar o seguinte em suas funções.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
O problema não é exibi-las com vírgulas; o problema é mantê-las como parte do nome da marca / categoria ao inseri-las (durante a edição da postagem). Eu gostaria de descobrir como editar o wordpress (ou escrever um plugin) para me permitir fazer isso.
Cwd

0

Aqui está a sua solução. Preste atenção na linha 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  

Dentro de wp-includes / taxonomy.php . Boa sorte em invadir o código. não há gancho. é codificado ... Desculpe. Eu acho que invadir o código é sua única opção por enquanto.


2
Hackear o núcleo do WP provavelmente não é uma boa ideia.
Chrisguitarguy

2
Eu sei disso! mas ele fez a pergunta. Eu apenas dei a resposta.
Asaf Chertkoff

Sim, mas o núcleo do hacking é a resposta errada . -1
EAMann

3
+1 - Na minha postagem original, mencionei que a invasão do núcleo era aceitável neste caso. Eu não conseguia nem encontrar onde precisava cortar o núcleo para fazer isso funcionar. Pelo menos, se eu sei que isso é possível, posso trabalhar para desenvolver um plug-in ou enviar uma solicitação de ticket adequada solicitando um gancho ou filtro à comunidade WP. Então, obrigado @AsafChertkoff, mesmo que eu ainda não testei isso.
Cwd

@ CWD, de nada :). espero que ajude.
Asaf Chertkoff

0

Vírgulas nos nomes das tags não funcionarão corretamente porque, ao adicionar a tag a uma postagem, o WordPress a analisará como várias palavras-chave, quebrando a vírgula.

Uma correção simples:

Use ,( o código HTML da vírgula ) em vez de uma vírgula comum.

Então:

  • , será exibido como uma boa vírgula dentro de postagens, títulos de páginas de tags e vários outros lugares.
  • Ele será exibido como bruto ,dentro da interface do administrador ao digitar o nome da tag.

FYI, usando a entidade HTML, , não funciona.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.