como adicionar vários botões ao tinymce?
<p>eu segui um tutorial sobre o nettuts sobre como adicionar um botão personalizado ao tinymce ( <a href="http://net.tutsplus.com/tutorials/wordpress/wordpress-shortcodes-the-right-way/">http://net.tutsplus.com/tutorials/wordpress/wordpress-shortcodes-the-right-way/</a> )</p><p>ele funciona muito bem e tudo, mas eu quero adicionar muitos botões e eu me pergunto se há uma maneira inteligente de fazer isso sem ter que duplicar todo o código mais e mais.</p><p>aqui está o código que eu uso para adicionar um botão:</p><pre><code>add\_shortcode("quote", "quote"); function quote( $atts, $content = null ) { return '&lt;div class="right text"&gt;"'.$content.'"&lt;/div&gt;'; } add\_action('init', 'add\_button'); function add\_button() { if ( current\_user\_can('edit\_posts') &amp;&amp; current\_user\_can('edit\_pages') ) { add\_filter('mce\_external\_plugins', 'add\_plugin'); add\_filter('mce\_buttons\_3', 'register\_button'); } } function register\_button($buttons) { array\_push($buttons, "quote"); return $buttons; } function add\_plugin($plugin\_array) { $plugin\_array['quote'] = get\_bloginfo('template\_url').'/js/customcodes.js'; return $plugin\_array; } </code></pre><p>e então eu crio um arquivo customcodes.js com este código em:</p><pre><code>(function() { tinymce.create('tinymce.plugins.quote', { init : function(ed, url) { ed.addbutton('quote', { title : 'add a quote', image : url+'/image.png', onclick : function() { ed.selection.setcontent('[quote]' + ed.selection.getcontent() + '[/quote]'); } }); }, createcontrol : function(n, cm) { return null; }, }); tinymce.pluginmanager.add('quote', tinymce.plugins.quote); })(); </code></pre><p>então, novamente, como posso adicionar vários botões sem ter que fazer todo esse código para cada novo botão?</p><p>obrigado :) sebastian</p>
<p>primeiro adicione seus botões adicionais dentro do callback dos botões.</p><pre><code>function register\_button($buttons) { array\_push($buttons, "quote","wpse-rules"); return $buttons; } </code></pre><p>em seguida, adicione botões adicionais dentro do plugin javascript.</p><pre><code> init : function(ed, url) { ed.addbutton('quote', { title : 'add a quote', image : url+'/image.png', onclick : function() { ed.selection.setcontent('[quote]' + ed.selection.getcontent() + '[/quote]'); } }); ed.addbutton('wpse-rules', { title : 'wpse rules', image : url+'/image.png', onclick : function() { alert( 'wpse rules!' ); } }); }, </code></pre><p>e assim por diante, para qualquer botão adicional que você quiser ..</p>
<p>parece sempre haver um pouco de confusão sobre esse assunto. talvez o wordpress possa fazer um trabalho melhor orientando seus usuários nesse processo. embora, eu suponha que o multi-site não se destinava a ser usado para tlds.</p><p>então, primeiro de tudo, eu iria <a href="https://codex.wordpress.org/installing\_wordpress">instalar o wordpress</a> , <a href="https://codex.wordpress.org/create\_a\_network">setup multisite</a> , e configurá-lo como uma configuração de rede de subdomínio.</p><p>aqui está uma configuração de exemplo para o seu arquivo <code>wp-config.php</code> no diretório base da sua instalação do wordpress:</p><pre><code>/* multisite */ define( 'wp\_allow\_multisite', true ); define( 'multisite', true ); define( 'subdomain\_install', true ); define( 'domain\_current\_site', 'www.primary-domain.com' ); define( 'path\_current\_site', '/' ); define( 'site\_id\_current\_site', 1 ); define( 'blog\_id\_current\_site', 1 ); </code></pre><p>então, aqui está a configuração básica para o seu arquivo <code>.htaccess</code> como uma configuração de subdomínio, no diretório base da sua instalação do wordpress:</p><pre><code># bof wordpress rewriteengine on rewritebase / rewriterule ^index\.php$ - [l] # add a trailing slash to /wp-admin rewriterule ^wp-admin$ wp-admin/ [r=301,l] rewritecond %{request\_filename} -f [or] rewritecond %{request\_filename} -d rewriterule ^ - [l] rewriterule ^(wp-(content|admin|includes).*) $1 [l] rewriterule ^(.*\.php)$ wp/$1 [l] rewriterule . index.php [l] # eof wordpress </code></pre><p>agora, para que os tlds funcionem corretamente, eu tive que fazer algumas configurações adicionais no arquivo <code>wp-config.php</code> assim:</p><pre><code>define( 'cookie\_domain', '' ); define( 'admin\_cookie\_path', '/' ); define( 'cookiepath', '/' ); define( 'sitecookiepath', '/' ); </code></pre><p>é isso com as configurações específicas do wordpress.</p><p>pessoalmente, gosto de ter um host virtual apache para o domínio primário na rede e, em seguida, configurar esse host virtual com domínios de alias. cada domínio de alias é um dos sites adicionais em sua rede.</p><p>no entanto, você acaba aprimorando sua configuração, precisa do dns de cada domínio para resolver o mesmo servidor da web e cada domínio deve ser apontado para o mesmo diretório em que o domínio principal é instalado com o wordpress. cada domínio em sua rede precisa apontar para o mesmo servidor da web com registros dns e compartilhar o mesmo caminho de diretório para os arquivos usados ​​pelo wordpress.</p><p>depois de configurar e configurar tudo corretamente, conforme discutido acima. faça o login em sua área de administração do wordpress e navegue até a área de administração de rede para adicionar um novo site à sua rede.</p><p>quando você vai adicionar um site, ele vai obrigá-lo a adicionar o site como se fosse um sub-domínio em seu domínio principal. apenas role com isso. digite algo temporário.</p><p>uma vez que o site foi adicionado, então vá encontrá-lo na lista de sites em sua rede. clique em editar nesse site específico. agora, você pode totalmente 100% alterar o nome de domínio desse site. é quando você colocaria o nome de domínio real para esse site de tld.</p><p>eu sei que é um pouco complicado fazer isso, mas funciona e você não precisa usar nenhum plug-in.</p> <h2>configurando a ordem de caixas meta em páginas de edição de postagem</h2><p>você precisará remover as caixas meta e adicioná-las novamente na ordem desejada.</p><p>para desabilitar caixas meta: (personalize para suas necessidades, olhe o id do metabox no código html para saber qual nome você deve usar como primeiro parâmetro das funções)</p><pre><code>function my\_remove\_meta\_boxes() { remove\_meta\_box('postcustom', 'post', 'core'); remove\_meta\_box('commentsdiv', 'post', 'core'); ... } add\_action( 'admin\_menu', 'my\_remove\_meta\_boxes' ); </code></pre><p>depois de removê-los, você pode usar a função add\_meta\_box para adicioná-los em novas posições: <a href="http://codex.wordpress.org/function\_reference/add\_meta\_box">http://codex.wordpress.org/function\_reference/add\_meta\_box</a> . a ordem das caixas meta depende da ordem em que você chama a função add\_meta\_box. por exemplo: com o seguinte trecho de código, a caixa meta de comentários será antes da caixa meta de campos personalizados.</p><pre><code>function my\_add\_meta\_boxes( $post\_type, $post ) { if ( ('publish' == $post-&gt;post\_status || 'private' == $post-&gt;post\_status) &amp;&amp; post\_type\_supports($post\_type, 'comments') ) add\_meta\_box('commentsdiv', \_\_('comments'), 'post\_comment\_meta\_box', $post\_type, 'normal', 'core'); if ( post\_type\_supports($post\_type, 'custom-fields') ) add\_meta\_box('postcustom', \_\_('custom fields'), 'post\_custom\_meta\_box', $post\_type, 'normal', 'core'); ... } add\_action( 'add\_meta\_boxes', 'my\_add\_meta\_boxes' ); </code></pre><p>você pode querer olhar para o arquivo wp-admin/edit-form-advanced.php</p><h2>definir qual título de coluna aparece na página da lista de postagens</h2><p>você precisa usar o filtro manage \_ {$ post\_type} \_posts\_columns. por exemplo: o fragmento a seguir removerá a coluna de comentários.</p><pre><code>function my\_remove\_columns( $posts\_columns ) { unset( $posts\_columns['comments'] ); return $posts\_columns; } add\_filter( 'manage\_post\_posts\_columns', 'my\_remove\_columns' ); </code></pre><h2>definir os resultados padrão a serem mostrados na página da lista de postagens</h2><p>use os filtros 'edit \_ {$ post\_type} \_per\_page' e 'edit\_posts\_per\_page'.</p><pre><code>function my\_edit\_post\_per\_page( $per\_page, $post\_type ) { $edit\_per\_page = 'edit\_' . $post\_type . '\_per\_page'; $per\_page = (int) get\_user\_option( $edit\_per\_page ); if ( empty( $per\_page ) || $per\_page &lt; 1 ) $per\_page = 1; return $per\_page; } add\_filter( 'edit\_posts\_per\_page', 'my\_edit\_post\_per\_page' ); </code></pre><p>para segmentar um tipo de postagem específico:</p><ul> <li> <p>use <code>add\_filter( 'edit\_{post type}\_per\_page', 'my\_edit\_post\_per\_page' );</code>, por exemplo <code>add\_filter( 'edit\_post\_per\_page', 'my\_edit\_post\_per\_page' );</code> para posts, <code>add\_filter( 'edit\_page\_per\_page', 'my\_edit\_post\_per\_page' );</code> para páginas.</p> </li> <li> <p>ou use uma condição dentro de sua função. por exemplo.:</p> <p>function my\_edit\_post\_per\_page ($ per\_page, $ post\_type) {</p> <pre><code>if( $post\_type == 'post' ) { $edit\_per\_page = 'edit\_' . $post\_type . '\_per\_page'; $per\_page = (int) get\_user\_option( $edit\_per\_page ); if ( empty( $per\_page ) || $per\_page &lt; 1 ) $per\_page = 1; } return $per\_page; </code></pre></li> </ul> <p>use o gancho de ação save\_post e, na função de retorno de chamada, use a função wp\_set\_object\_terms ($ object\_id, $ terms, $ taxonomy, $ append).</p><p>para o seu post personalizado digite o código pode ser assim</p><pre><code>function save\_book\_meta( $post\_id, $post, $update ) { $slug = 'book'; //slug of cpt // if this isn't a 'book' post, don't update it. if ( $slug != $post-&gt;post\_type ) { return; } wp\_set\_object\_terms( get\_the\_id(), $term\_id, $taxonomy ); } add\_action( 'save\_post', 'save\_book\_meta', 10, 3 ); </code></pre><p>$ taxonomy - o contexto no qual relacionar o termo ao objeto. isso pode ser categoria, post\_tag ou o nome de outra taxonomia.</p><p>$ term\_id - id do termo da taxonomia</p><p>eu não conheço seu projeto completamente, então você pode considerar este trecho como uma maneira de fazer o que você queria fazer.</p><p>para mais referências, visite estes dois links abaixo:</p><p> <a href="https://codex.wordpress.org/function\_reference/wp\_set\_object\_terms">https://codex.wordpress.org/function\_reference/wp\_set\_object\_terms</a> </p><p> <a href="https://codex.wordpress.org/plugin\_api/action\_reference/save\_post">https://codex.wordpress.org/plugin\_api/action\_reference/save\_post</a> </p><p>eu espero que você encontre uma saída.</p> <p>o blackbird pie (agora extinto) costumava fazer exatamente o que você estava procurando: basta colar o url de qualquer tweet no formulário dessa página e ele gerará html estático que você pode incorporar ao seu blog.</p><p>agora você pode incorporar diretamente pela interface do usuário do twitter clicando em "incorporar este tweet"</p><p><img src="https://i.stack.imgur.com/lwztz.png" alt="embed the tweet"></p><p>além disso, existe um <a href="http://themergency.com/twitter-blackbird-pie-wordpress-plugin/">plugin específico do wordpress</a> , bem como um <a href="http://www.shoutmeloud.com/embed-tweets-in-2-seconds-blackbird-pie-chrome-extension.html">google chrome extension</a> para usar o blackbird pie.</p> <p>se você estiver usando o modo "exato", precisará especificar os ids dos elementos que deseja converter em editores.</p><pre><code>function initmceexact(e){ tinymce.init({ mode : "exact", elements : e, ... }); } // add textarea element with id="content" to document initmceexact("content"); // add textarea element with id="content2" to document initmceexact("content2"); // add textarea element with id="content3" to document initmceexact("content3"); </code></pre><p>ou você pode usar o modo "área de texto", que aplica indiscriminadamente o editor em todas as áreas de texto.</p><pre><code>function initmceall(){ tinymce.init({ mode : "textareas", ... }); } // add all textarea elements to document initmceall(); </code></pre><p>lembre-se de que, se você estiver criando áreas de texto dinamicamente, precisará chamar tinymce.init () <em> após </em> criar os elementos, porque eles precisam existir para tinymce poder convertê-los.</p><p> <a href="http://www.tinymce.com/wiki.php/configuration3x%3amode">aqui está a documentação dos modos</a> .</p> <p>o que acontece é que o tinymce converte cada quebra de linha dupla na fonte html para <code>&lt;p&gt;&lt;/p&gt;</code> e vice-versa. ele realmente removerá qualquer <code>&lt;p/&gt;</code> que você inserir manualmente na origem html depois de salvar, porque quando o conteúdo da postagem for renderizado, <code>&lt;p&gt;</code> e <code>&lt;/p&gt;</code> serão adicionados.</p><p>a substituição auto -<code>&lt;p&gt;</code> só funciona quando você está renderizando o conteúdo de uma postagem com <code>&lt;?php the\_content() ?&gt;</code>, se você exportar <code>$post-&gt;post\_content</code> diretamente, ela não passará pelos mesmos ganchos de formatação e parecerá simples e sem quebras de linha ou parágrafos.</p><p>se o que você deseja é muitas tags <code>&lt;br/&gt;</code> na marcação renderizada, provavelmente você deve encontrar uma solução melhor baseada em css e o uso das propriedades css <code>margin</code> ou <code>padding</code>.</p> <p>não sei exatamente o que você está fazendo, mas o código a seguir funcionou para mim na medida em que criou um novo produto e o adicionou ao carrinho. note que tive que usar <code>$\_get</code> para testar na minha configuração, pois não tenho o restante do seu código e não sinto vontade de criar um formulário.</p><p><strong>edit</strong>: adicionei um elemento <code>&lt;form&gt;</code> simples e mudei para <code>$\_post</code>.<strong> edit 2 </strong>: eu removi o formulário. aparentemente, o op tem o formulário na primeira página.</p><pre><code>add\_action('init', 'customcart'); function customcart() { if (isset($\_post["addcustomcarts"])) { global $woocommerce; $my\_post = array( 'post\_title' =&gt; 'my post', 'post\_content' =&gt; 'this is my post.', 'post\_status' =&gt; 'publish', 'post\_author' =&gt; 1, 'post\_type' =&gt;'product' ); // insert the post into the database $product\_id = wp\_insert\_post( $my\_post ); if ( $product\_id ){ add\_post\_meta($product\_id, '\_regular\_price', 100 ); add\_post\_meta($product\_id, '\_price', 100 ); add\_post\_meta($product\_id, '\_stock\_status', 'instock' ); //getting error on this line. $woocommerce-&gt;cart-&gt;add\_to\_cart( $product\_id, $quantity=1 ); exit( wp\_redirect( get\_permalink( woocommerce\_get\_page\_id( 'cart' ) ) ) ); } } } </code></pre> Olá Gabis
  

  
Veja se este [tutorial](/faq/3973-vba-adicionar-o-commandbutton-e-o-seu-codigo) ajuda você.
  

  
Boa sorte ei [@rodrigo\_valentim](/u/rodrigo_valentim)! tudo certo?

o bruno tá te ajudando com essa questão nesse outro tópico, certo?

[imagem]

[botões em conversas no whatsapp](https://forum.blip.ai/t/botoes-em-conversas-no-whatsapp/5225) [dúvidas/questions](/c/questions/13)

esses botões já estão disponíveis no builder?

vou deixar esse link aqui para que, caso algum blipper ven… <p>você não precisa necessariamente de um plugin para fazer isso. aqui estão 2 métodos alternativos:</p><h2>friendfeed</h2><p>você pode usar o friendfeed ( <a href="http://www.crossbrowser.net/290/using-friendfeed-to-automatically-twitter-your-new-blog-posts/">detalhes aqui</a> , isenção de responsabilidade, é o meu blog).</p><h2>feedburner</h2><p>se você usa o feedburner para gerenciar o rss do seu blog, pode ir para a guia <code>publicize</code>, clicar no link da barra lateral <code>socialize</code> e configurar o feedburner para publicar no twitter quando surgir uma nova postagem (tem mais opções que o friendfeed).</p>