woocommerce criar novo produto e adicionar ao carrinho no formulário de envio
<p>estou personalizando o plug-in woo-commerce para adicionar produtos do front end ao carrinho. eu escrevi a função em functions.php, mas estou recebendo um erro fatal.</p><p>obtendo este erro -&gt;</p><blockquote> <p>erro fatal: chame para uma função de membro add\_to\_cart () em um não-objeto em<br> c:\wamp\www\servidor\_de\_segurança\wordpress\_theme\wp-content\themes\cutting\_age</p> </blockquote><p>qualquer corpo tem alguma ideia de como resolvê-lo?</p><p>meu arquivo function.php</p><pre><code>if (isset($\_post["addcustomcarts"])) { echo $\_server[query\_string]; // echo $\_server[request\_uri]; echo "i am in if"; //exit(); add\_filter('woocommerce\_before\_cart', 'customcart'); function customcart() { echo "i am in function"; //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 ); add\_post\_meta($product\_id, '\_regular\_price', 100, $unique); add\_post\_meta($product\_id, '\_price', 100, $unique); add\_post\_meta($product\_id, '\_stock\_status', 'instock', $unique); //getting error on this line. $woocommerce-&gt;cart-&gt;add\_to\_cart( $product\_id, $quantity=1 ); exit( wp\_redirect( home\_url( "cart" ) ) ); } customcart(); } </code></pre><p>meu arquivo html</p><pre><code>&lt;form name="addpro" method="post" action=""&gt; &lt;input type="submit" name="addcustomcarts" value="add too cart" /&gt; &lt;/form&gt; </code></pre>
<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>
<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><strong> @ bowe </strong></p><p>você precisaria criar uma matriz na sua função de opções para a caixa de seleção e atribuir a ela um id como um estado padrão e atribuir o tipo de "caixa de seleção" a ela. aqui está uma amostra supondo que você já tenha o código em vigor para o painel de administração</p><pre><code>&lt;?php // set variables for the options panel $themename = "your\_theme\_name"; $themeshortname = "yt"; $mythemeoptions = array(); //the option function function cool\_theme\_options() { global $themename, $themeshortname, $mythemeoptions; $themeoptions = array ( array( "name" =&gt; \_\_('show featured content slider','your\_theme\_name'), "desc" =&gt; \_\_('when checked, the slider will be added to the home page.','your\_theme\_name'), "id" =&gt; "show\_featured\_slider", "std" =&gt; "false", "type" =&gt; "checkbox" ), ); } //the option form function my\_cool\_theme\_admin() { global $themename, $themeshortname, $themeoptions; // saved or updated message if ( $\_request['saved'] ) echo '&lt;div id="message" class="updated fade"&gt;&lt;p&gt;&lt;strong&gt;'.$themename.' settings saved.&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;'; if ( $\_request['reset'] ) echo '&lt;div id="message" class="updated fade"&gt;&lt;p&gt;&lt;strong&gt;'.$themename.' settings reset.&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;'; // the form ?&gt; &lt;div class="wrap"&gt; &lt;h2&gt;&lt;?php echo $themename; ?&gt; options&lt;/h2&gt; &lt;form method="post"&gt; &lt;?php wp\_nonce\_field('theme-save'); ?&gt; &lt;table class="form-table"&gt; &lt;?php foreach ($themeoptions as $value) { // output the appropriate form element switch ( $value['type'] ) { case 'text': ?&gt; &lt;tr valign="top"&gt; &lt;th scope="row"&gt;&lt;?php echo $value['name']; ?&gt;:&lt;/th&gt; &lt;td&gt; &lt;?php foreach ($value['options'] as $key=&gt;$option) { if ($key == get\_option($value['id'], $value['std']) ) { $checked = "checked=\"checked\""; } else { $checked = ""; } ?&gt; &lt;input type="radio" name="&lt;?php echo $value['id']; ?&gt;" value="&lt;?php echo $key; ?&gt;" &lt;?php echo $checked; ?&gt; /&gt;&lt;?php echo $option; ?&gt;&lt;br /&gt; &lt;?php } ?&gt; &lt;?php echo $value['desc']; ?&gt; &lt;/td&gt; &lt;/tr&gt; &lt;?php break; case "checkbox": ?&gt; &lt;tr valign="top"&gt; &lt;th scope="row"&gt;&lt;?php echo $value['name']; ?&gt;&lt;/th&gt; &lt;td&gt; &lt;?php if(get\_option($value['id'])){ $checked = "checked=\"checked\""; } else { $checked = ""; } ?&gt; &lt;input type="checkbox" name="&lt;?php echo $value['id']; ?&gt;" id="&lt;?php echo $value['id']; ?&gt;" value="true" &lt;?php echo $checked; ?&gt; /&gt; &lt;?php echo $value['desc']; ?&gt; &lt;/td&gt; &lt;/tr&gt; &lt;?php break; default: break; } } ?&gt; &lt;/table&gt; &lt;p class="submit"&gt; &lt;input name="save" type="submit" value="save changes" class="button-primary" /&gt; &lt;input type="hidden" name="action" value="save" /&gt; &lt;/p&gt; &lt;/form&gt; &lt;form method="post"&gt; &lt;?php wp\_nonce\_field('theme-reset'); ?&gt; &lt;p class="submit"&gt; &lt;input name="reset" type="submit" value="reset" /&gt; &lt;input type="hidden" name="action" value="reset" /&gt; &lt;/p&gt; &lt;/form&gt; </code></pre><p>em seguida, adicione a função em functions.php que chama o controle deslizante se a caixa estiver marcada.</p><pre><code>&lt;?php function cool\_theme\_slider\_option() { // load the custom options global $themeoptions; foreach ($themeoptions as $value) { $$value['id'] = get\_option($value['id'], $value['std']); } if ($show\_featured\_slider == 'true') { locate\_template( array( 'includes/slider.php'), true ) } } // end function add\_action('wp\_head', 'cool\_theme\_slider\_option'); ?&gt; </code></pre><p>este código não foi verificado para ter certeza de que funciona exatamente como está, mas destinado a mostrar um exemplo para usar uma opção de caixa de seleção no seu tema.</p> boa tarde @@@sofia2 , como indicado pelo @@@beme , experimente remover os produtos meo associados à sua área de cliente e voltar a associar os mesmos. se continuar a não conseguir associar o meo go, envie-nos o nif do titular do serviço meo, o seu nº de contacto e o e-mail de acesso à área de cliente. envie estes dados por mensagem privada, colocando no assunto da mensagem a referência nº 3-33838279356. <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> olá@joÃo pedro loureiro santos,pedimos desculpa pela demora.para que nos seja possível ajudar, envie-nos uma mensagem privada com o seu número de cliente nos para o@fórum, por favor.obrigadaok.mas não faço ideia como mandar mensagem privada para o@fórum. com relação ao algoritmo, temos que:\#include\#include\#include\#define qtreg 30//estrutura para cadastro das mercadoriastypedef struct {int codigo;char nome[30];int quantidade;float preco;} regproduto;//cria variavel do tipo regprodutoregproduto produto[qtreg];//variaveis globaisfloat caixaatual = 800.00;//cabeçalho das funções que serão usadas//cabeçalho da função inserir um produto no estoqueint cadastrar();//cabeçalho da função aumentar o estoque de um produtovoid alterarestoque(int pcodgio, int pquantidade);//cabeçalho da função modificar o preço de um produtovoid modificarpreco(int pcodigo, float ppreco);//cabeçalho da função realizar vendafloat venda();//cabeçalho da função consultar o estoque dos produtosvoid listaproduto(int pqtproduto);//cabeçalho da função consultar o saldo do caixavoid consultarsaldo();int main(void) {int op = 0;setlocale(lc\_all, "portuguese");while (op != 7) {printf("\n\n\t mercadinho - sistema de gerenciamento de mercadoria 2015 \n\n\n");printf("menu\n\n1 - cadastrar produto\n2 - atualizar estoque\n3 - alterar preco produto");printf("\n4 - realizar venda\n5 - consultar estoque\n6 - consultar saldo do caixa\n7 - sair\n");fflush(stdout);scanf("%d", &op);fflush(stdin);system("cls");switch (op) {int qtproduto;float lucro;case 1://opção cadastrar produtoqtproduto = cadastrar();break;case 2:{//opção atualizar estoqueint pcodigo, pquantidade;printf("digite o código do produto que deseja atualizar o estoque:");fflush(stdout);scanf("%d", &pcodigo);fflush(stdin);printf("deseja alterar quantidade do produto: %s - quantidade: %d \n", produto[pcodigo].nome, produto[pcodigo].quantidade);printf("nova quantidade:");fflush(stdout);scanf("%d", &pquantidade);fflush(stdin);system("pause");alterarestoque(pcodigo, pquantidade);break;case 3:{//opção alterar preço do produtoint pcodigo;float ppreco;printf("digite o código do produto que deseja modificar o preco:");fflush(stdout);scanf("%d", &pcodigo);fflush(stdin);printf("deseja modificar o preco do produto: %s - preco: %0.2f \n", produto[pcodigo].nome, produto[pcodigo].preco);printf("novo preco:");fflush(stdout);scanf("%f", &ppreco);fflush(stdin);system("pause");modificarpreco(pcodigo, ppreco);break;case 4://opção de realizar vendalucro = venda();caixaatual = caixaatual + lucro;break;case 5://opção de listar produtoslistaproduto(qtproduto);break;case 6://consultar saldo no caixaconsultarsaldo();break;case 7://opção sair do programabreak;default:// exibi mensagem de opção invalida caso digite um numero que não tenha no menuprintf("opcão inválida");fflush(stdout);break;system("pause");return 0;//corpo da funções//função inserir um produto no estoqueint cadastrar() {char opsub;int cont = 0, qtprodutocad = 0;//float compra;do {produto[cont].codigo = cont;fflush(stdin);printf("digite o nome do produto:");fflush(stdout);gets(produto[cont].nome);fflush(stdin);printf("digite a quantidade:");fflush(stdout);scanf("%d", &produto[cont].quantidade);fflush(stdin);printf("digite o preco:");fflush(stdout);scanf("%f", &produto[cont].preco);fflush(stdin);caixaatual = caixaatual - produto[cont].preco;qtprodutocad = qtprodutocad + cont;cont++;printf("deseja cadastrar um novo produto sim(s) ou não(n)?");fflush(stdout);scanf("%c", &opsub);fflush(stdin);} while (opsub == 's' || opsub == 's');return qtprodutocad;//função aumentar o estoque de um produtovoid alterarestoque(int pcodigo, int pquantidade) {produto[pcodigo].quantidade = pquantidade;//função modificar o preço de um produtovoid modificarpreco(int pcodigo, float ppreco) {produto[pcodigo].preco = ppreco;//função realiza vendafloat venda() {int pcodigo, qtd;float lucro = 0;char a;do{printf("informe o código do produto: ");fflush(stdout);scanf("%d", &pcodigo);fflush(stdin);if (produto[pcodigo].quantidade printf("produto indisponivel\n");fflush(stdout);} else {printf("informe a quantidade: ");fflush(stdout);scanf("%d", &qtd);fflush(stdin);printf("\tproduto: %s - \tqtdade: %d - \tpreço: %1.2f - \tsubtotal: %1.2f\n",produto[pcodigo].nome, qtd, produto[pcodigo].preco, produto[pcodigo].preco * qtd);fflush(stdout);lucro += produto[pcodigo].preco * qtd;produto[pcodigo].quantidade -= qtd;printf("informar novo item para a venda? (s/n) ");fflush(stdout);scanf("%c", &a);} while (a != 'n');printf("\t\t\t total: %1.2f", lucro);fflush(stdout);return lucro;//função consultar saldovoid consultarsaldo() {printf("saldo atual em caixa: %1.2f", caixaatual);fflush(stdout);//função consultar o estoque dos produtosvoid listaproduto(int pqtproduto) {int i, qtproduto;qtproduto = pqtproduto;for (i = 0; i printf("\tcódigo - %d \tnome - %s \tquantidade - %d \n", produto[i].codigo, produto[i].nome, produto[i].quantidade);fflush(stdout); olá, manuel fernando. bem-vindo ao fórum nos. :)para resolver essa questão, só tem que preencher e enviar-nos este formulário.no "assunto" escolha a opção "compras/reservas" e despois clique em "enviar". infelizmente não. terá que excluir o produto e cadastrar novamente. <p>em resposta direta à pergunta, o wordpress não inclui uma função para isso, em parte porque não se aplica especificamente à funcionalidade do wordpress. ou seja é um problema php (potencial), não wordpress.</p><p>além disso, eu não diria que é responsabilidade do wordpress fornecer soluções alternativas para plugins, etc, que não fornecem uma função para retornar dados (que é contra o estilo geral do wordpress).</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>