Idioma

Entrar em contacto

Plugin para WooCommerce · desde 2020

WOOT

Plugin WooCommerce que mostra o catálogo da loja como tabelas ordenáveis e filtráveis, com adicionar ao carrinho em cada linha.

Primeira versão
Instalações ativas
1000+
Classificação
4.8 / 5 (18)Ler avaliações
  • PHP
  • WordPress
  • WooCommerce
  • WP_Query
  • MySQL (tabelas próprias via dbDelta)
  • admin-ajax
  • WC AJAX (wc-ajax=add_to_cart)
  • JavaScript (classes ES6, fetch, AbortController)
  • AlaSQL
  • WPML
Ver em wordpress.org wordpress.org

Sobre

O WOOT apresenta um catálogo WooCommerce como uma tabela: uma linha por produto, uma coluna para qualquer campo de produto, atributo, taxonomia ou chave meta, e um controlo de adicionar ao carrinho em cada linha. As tabelas são configuradas no painel de administração ou descritas inline num shortcode [woot]. O mesmo motor desenha também o carrinho, listas de variações, upsells, cross-sells, produtos relacionados e tabelas de produto único.

O difícil é que uma coluna tem de fazer três coisas: desenhar uma célula, ordenar a consulta no servidor e funcionar como filtro. Os produtos existem em vários tipos (simples, variável, agrupado, externo, variação) que se comportam de forma diferente numa célula e no carrinho. Todos os dados da tabela passam por um único endpoint AJAX público, que tem de se manter utilizável em catálogos grandes e não pode expor rascunhos, tipos de post não públicos nem ficheiros do servidor.

O motor de tabelas no navegador (data-table-23.js) é JavaScript puro com classes ES6 e fetch. Guarda páginas em cache pelo hash do pedido, cancela pedidos obsoletos, pode passar uma tabela para o modo no navegador e consultá-la com SQL sobre um array JSON, e muda a disposição para ecrãs pequenos. O jQuery é usado apenas para disparar os eventos de carrinho do próprio WooCommerce.

WOOT · tabelas de produtos

o que foi resolvido

ATIVOdesde 2020

Consultas de tabelas no servidor

shipped · 2020

O que ofereceOs clientes paginam, ordenam e filtram as tabelas de produtos por preço, SKU ou stock no seu idioma, e as listas predefinidas, como os mais vendidos, mostram o número exato de artigos.

Problema
Cada mudança de página, clique de ordenação e alteração de filtro chega como um pedido AJAX. Tem de se tornar uma única WP_Query que respeite a visibilidade no catálogo, as predefinições da tabela, os filtros, o idioma do visitante e chaves de ordenação que a WP_Query não suporta.
Solução

get_table_data() lê um conjunto de chaves de pedido numa lista branca, aplica predefinições e filtros como transformações dos argumentos da consulta, corrige o SQL apenas onde a WP_Query fica aquém, e devolve as linhas com uma contagem total para a paginação.

Stack
  • PHP
  • WP_Query
  • WooCommerce
  • WPML
Tarefas · 6
Um endpoint público serve todas as tabelas e todos os visitantesLista branca de chaves do pedido, sanitizar cada uma por tipo, construir os args da WP_Query, devolver linhas e contagem

get_table_data() está registada para utilizadores com sessão iniciada e anónimos. Percorre $_REQUEST com um switch e mantém apenas as chaves conhecidas: post_type, per_page, orderby, order, current_page, table_id, wp_columns_actions, filter_data, filter_provider, fields, lang, predefinition e shortcode_args_set. Os números passam por intval, as chaves por sanitize_key, os payloads JSON por json_decode e um sanitizador recursivo.

Duas destas chaves são nomes de hooks. wp_columns_actions é passada a apply_filters() para carregar o perfil de colunas, e filter_provider seleciona o filtro woot_filter_provider_{name} que acrescenta as condições de filtro. Ambas são sanitizadas como texto mas não verificadas contra uma lista de nomes registados.

A mesma função é chamada a partir de PHP com um array para tabelas desenhadas no carregamento da página, pelo que o caminho do servidor e o caminho AJAX partilham uma só implementação. Cada linha é produzida chamando o closure de renderização de cada coluna pedida, com o ID do produto guardado como pid para ações de célula.

Ordenar por preço, SKU ou stock significa ordenar por postmetaAs colunas declaram meta_key e orderby; a consulta mapeia as chaves de ordenação para meta_value(_num)

Uma entrada de coluna como price leva 'orderby' => 'meta_value_num' e 'meta_key' => '_price'. get_table_data() procura a chave de ordenação pedida no perfil de colunas e reescreve a partir dela os argumentos da consulta.

A lista pendente de ordenação usa as suas próprias chaves (price-desc, sku, stock-desc, sales e assim por diante), traduzidas num filtro woot_wp_query_args. As ordenações por stock e vendas totais excluem os produtos agrupados e externos com uma cláusula product_type NOT IN, dado que esses tipos não têm valor próprio de stock nem de vendas. Nas ordenações da lista pendente o plugin chama também WC()->query->get_catalog_ordering_args(), que anexa as próprias cláusulas de ordenação do WooCommerce para popularidade, avaliação e preço, de modo que estas ordenações coincidem com a página da loja.

A WP_Query não consegue ordenar por post_statusAnexar um filtro posts_orderby para essa única consulta e removê-lo logo após a consulta correr

Para orderby=post_status, um closure é adicionado a posts_orderby antes da WP_Query e removido depois dela, de modo que as outras consultas do mesmo pedido mantêm a sua própria ordenação.

As predefinições top-N (mais vendidos, mais recentes) têm de mostrar exatamente N produtosLimitar posts_per_page a N e definir found_posts como N para que o paginador conte apenas N artigos

A predefinição de mais vendidos ordena por total_sales e a de mais recentes por post_date, ambas com posts_per_page definido como N. A WP_Query comunica found_posts para todos os produtos correspondentes, pelo que após a consulta found_posts é definido como o limite da predefinição e o paginador mostra apenas os N melhores.

As predefinições precisam de incluir e excluir por várias taxonomiasAnalisar uma string de regras compacta num tax_query aninhado; inverter a relação na exclusão

Uma regra de predefinição é guardada como string, por exemplo product_cat:25,26|pa_color:19|rel:AND. get_by_taxonomy() transforma-a num grupo tax_query aninhado e ignora as taxonomias que já não existem.

Na variante de exclusão, cada cláusula usa NOT IN e a relação é trocada (AND passa a OR e vice-versa), o que é a lei de De Morgan: excluir os produtos que correspondem a A e B significa manter os que estão fora de A ou fora de B. As predefinições de SKU mapeiam o SKU de uma variação para o ID do produto-pai, porque a tabela lista produtos-pai.

Os pedidos admin-ajax perdem o idioma do visitanteEnviar o locale com cada pedido e mudar o WPML para ele antes de consultar e desenhar

admin-ajax.php corre fora do contexto de idioma do front-end. draw_table_data() escreve get_locale() no JSON da tabela, o navegador devolve-o como lang, e get_table_data() passa-o pelo filtro woot_current_lang.

A classe de vocabulário liga-se a esse filtro e chama $sitepress->switch_lang(), para que a WP_Query devolva produtos no idioma certo. Os títulos e rótulos das colunas são traduzidos por WOOT_Vocabulary::get() a partir da tabela própria do plugin, carregada uma vez por pedido e indexada por locale.

Modelo de colunas

shipped · 2020

O que ofereceO proprietário escolhe que detalhes do produto aparecem como colunas da tabela, incluindo os campos personalizados da própria loja, e pode copiar ou mover configurações de tabelas.

Problema
Uma coluna é mais do que uma célula. O mesmo campo tem de ser desenhado para cada tipo de produto, comandar a ordenação e aparecer como widget de filtro, e os proprietários das lojas acrescentam as suas próprias taxonomias e chaves meta.
Solução

Cada tabela corre sobre um perfil: um array de descritores de campos cujos closures desenham a célula, alteram os argumentos da WP_Query para filtrar e descrevem o widget de filtro. As taxonomias e as chaves meta são acrescentadas ao perfil em tempo de execução.

Stack
  • Closures PHP
  • Filtros do WordPress
  • MySQL
  • dbDelta
Tarefas · 5
Uma definição de campo tem de comandar a célula, a ordenação e o filtroPerfil de descritores com closures de renderização, de args de filtro e de UI de filtro para cada campo

WOOT_WooCommerce::action() devolve o perfil. Cada chave é um campo com um título, um closure action que desenha a célula para um ID de produto, dados de ordenação (order, orderby, meta_key) e, nos campos filtráveis, closures get_filter_query_args e get_filter_draw_data. O índice 0 guarda as definições ao nível da tabela: tipo de post, estados permitidos, fornecedor de filtros.

Os perfis são registados por nome e resolvidos com apply_filters sobre a ação da tabela. O carrinho, as variações, a vista de produto único e até os ecrãs de administração do plugin (lista de tabelas, chaves meta, vocabulário) correm sobre o mesmo motor com os seus próprios perfis.

Cada taxonomia e atributo de produto deve ser uma colunaColunas a partir de get_object_taxonomies('product') menos as internas, mostradas como árvores de termos

product_type, product_visibility, product_shipping_class e translation_priority do WPML são retirados da lista. A célula mostra os termos do próprio produto através de build_taxonomy_tree() limitada aos IDs de termos atribuídos, como ligações ou texto simples consoante a opção da coluna.

O lado do filtro acrescenta uma cláusula tax_query cujo operador (IN, NOT IN, AND) vem das definições da tabela e é verificado contra essa lista branca.

Os proprietários das lojas precisam de colunas para chaves meta arbitráriasRegisto meta tipado (texto, número, calendário) fornece o modo de ordenação e o filtro de cada chave

As chaves meta são guardadas por tabela em woot_tables_meta com um tipo. assemble_meta_for_system() transforma cada uma num campo do perfil: o texto ordena por meta_value e filtra com LIKE; o número ordena por meta_value_num e filtra com um BETWEEN numérico num slider de intervalo; o calendário filtra como DATETIME ou como timestamp unix numérico, escolhido por campo, porque plugins como o ACF guardam as datas em formatos diferentes.

Os campos são fundidos no perfil através do filtro ext_{action}, e cada chave aparece também na lista pendente de ordenação com entradas ascendente e descendente.

Linhas vezes colunas repetem as mesmas consultas de produto e de opçõesCaches estáticas ao nível do pedido para produtos, opções de tabela, linhas de colunas e linhas de meta

Cada closure de coluna precisa do objeto WC_Product, pelo que get_product() mantém um mapa estático dos resultados de wc_get_product(). As opções da tabela são descodificadas do JSON uma vez por tabela, as linhas de meta ficam em cache pelo md5 da string SQL, e o construtor de filtros resolve o perfil uma vez em vez de por campo.

As configurações de tabelas precisam do seu próprio armazenamento, clonagem e transferênciaQuatro tabelas próprias via dbDelta; clone copia colunas e meta; import volta a preencher a partir de JSON

install.php cria woot_tables, woot_tables_columns (indexada por table_id e is_active, ordenada por pos_num), woot_tables_meta e woot_vocabulary. A ordem das colunas por arrastar e largar chega como uma lista de IDs e é escrita de volta como pos_num.

clone() copia a linha da tabela, depois as suas colunas e chaves meta sob o novo ID de tabela. A exportação despeja as quatro tabelas e as opções como JSON; a importação trunca cada tabela e insere as linhas, após uma verificação de capability e nonce.

Filtragem

shipped · 2020

O que ofereceOs clientes restringem a tabela por intervalos, datas, categorias e texto, e as tabelas acompanham o plugin de filtros já existente na loja, na mesma página.

Problema
Os filtros chegam do navegador como um mapa plano chave/valor e têm de se tornar argumentos da WP_Query: intervalos meta, cláusulas de taxonomia, pesquisa de texto e intervalos de datas. As lojas que já usam um plugin de filtros esperam que a tabela o acompanhe.
Solução

Um fornecedor de filtros entrega cada chave ao closure de consulta da própria coluna. Os plugins de filtros externos ligam-se como fornecedores alternativos que devolvem uma lista de IDs de produtos.

Stack
  • WP_Query
  • meta_query
  • tax_query
  • posts_where
  • $wpdb->prepare
Tarefas · 5
Um filtro de intervalo de datas precisa de duas entradas para uma colunaDividir um campo de calendário em key e key---to; o fornecedor retira o sufixo e inverte o compare

Quando o formulário de filtros é construído, um campo de calendário é duplicado sob uma chave ---to com rótulos De e Até. No regresso, provider() vê uma chave desconhecida terminada em ---to, retira o sufixo e chama o mesmo closure da coluna com uma flag, de modo que o closure compara com <= em vez de >=.

Os sliders de intervalo precisam de limites antes de qualquer filtro estar definidoCalcular MIN e MAX da chave meta em SQL quando a administração deixou os limites por definir

Se um campo de intervalo não tem min ou max configurado (-1), get_field_drawing_data() executa SELECT MIN ou MAX(cast(meta_value as UNSIGNED)) no postmeta para a chave meta do campo através de $wpdb->prepare. O nome da função vem de uma lista branca interna, não do pedido. O slider da contagem de comentários lê os seus limites da tabela de posts.

A pesquisa de texto tem de cobrir campos escolhidos sem injeção de SQLCláusula posts_where com esc_like e prepare; lista de campos limitada a três colunas de post

Os campos pesquisáveis vêm do shortcode mas são filtrados para post_title, post_content e post_excerpt. Cada um torna-se LOWER(field) LIKE %s com o valor escapado por esc_like e associado por prepare.

No navegador, uma pesquisa dispara em Enter apenas quando a entrada atinge o seu minlength, e um Enter vazio ou Escape remove o termo, o que impede que palavras parciais curtas cheguem ao servidor.

As tabelas têm de acompanhar o filtro HUSKY (WOOF) na mesma páginaRepetir o pedido do WOOF, executar a sua previsão de IDs e alimentar post__in com os IDs

Com filter_provider=woof, o shortcode captura os dados do pedido do WOOF para o JSON da tabela. Em cada chamada AJAX, o fornecedor restaura $_GET a partir dele, pede todos os resultados, chama woof_products_ids_prediction() e lê woof_wp_query_ids, aceitando um array ou uma string separada por vírgulas e mantendo apenas inteiros positivos. Sem IDs, post__in = [0].

O estado do filtro MDTF tem de chegar ao pedido AJAXDescodificar o estado do MDTF, pedir apenas os argumentos da consulta, retirar as suas próprias flags, obter previamente os IDs de produtos

O parâmetro page_mdf é descodificado e o MDTF é executado com mdf_get_query_args_only para que devolva argumentos da WP_Query em vez de HTML. A cláusula meta mdf_hide_post e a cláusula product_visibility são removidas (o WOOT acrescenta as suas), a ordenação é descartada, e a consulta corre com fields=ids. A lista de IDs viaja como dados de filtro e torna-se post__in.

Adicionar ao carrinho a partir da tabela

shipped · 2020

O que ofereceOs clientes compram qualquer tipo de produto diretamente da tabela, adicionam várias linhas de uma vez, e o carrinho mantém-se em sintonia com o resto da loja.

Problema
Cada tipo de produto precisa de um controlo de compra diferente, as quantidades são limitadas pelo stock, e o carrinho da tabela tem de se manter sincronizado com o mini-carrinho do tema e com a página do carrinho do WooCommerce.
Solução

O servidor emite um descritor compacto por tipo de produto, o navegador constrói os controlos a partir dele e faz post para o endpoint AJAX do próprio WooCommerce. O conteúdo do carrinho é desenhado pelo mesmo motor de tabelas.

Stack
  • API de carrinho do WooCommerce
  • WC AJAX
  • JavaScript
  • fetch
Tarefas · 5
Simples, variável, agrupado e externo precisam de controlos diferentesO servidor emite um descritor data-about tipado; o JS constrói input, checkbox ou ligação de popup

add_to_cart.php verifica is_purchasable() e is_in_stock() e, quando o stock é gerido, exige uma quantidade diferente de zero. Para produtos simples o descritor leva ID, stock e SKU; o cliente constrói um input numérico com max definido como o stock, só de leitura para produtos vendidos individualmente, mais uma checkbox para adição em massa.

Os produtos variáveis e agrupados recebem um botão que abre uma tabela em popup dos seus filhos. Os produtos externos ligam ao URL externo. Os tipos desconhecidos passam pelo filtro woot_woocommerce_add_to_cart para que outros plugins possam fornecer o markup.

Adicionar ao carrinho deve comportar-se como o botão do próprio WooCommercePOST para wc-ajax=add_to_cart, depois disparar wc_fragment_refresh para os mini-carrinhos do tema

O URL do endpoint é tirado de wc_add_to_cart_params quando o WooCommerce o imprime, pelo que os endpoints AJAX personalizados continuam a funcionar. A quantidade é verificada contra max antes de enviar. Após o sucesso, o plugin dispara wc_fragment_refresh, atualiza a sua própria informação do carrinho e, consoante uma opção da tabela, redireciona para o carrinho ou para o checkout.

Os clientes querem adicionar muitas linhas numa só açãoLinhas marcadas e quantidades num só pedido; as variações recebem o ID do pai e os atributos

Uma checkbox no cabeçalho da coluna do carrinho seleciona todas as linhas. add_to_cart_some() percorre os artigos enviados. Para uma variação, reconstrói o mapa attribute_* a partir de get_attributes('edit') e chama WC()->cart->add_to_cart() com o ID do pai, a quantidade, o ID da variação e esse mapa, que é a forma que o carrinho do WooCommerce espera.

Os produtos variáveis precisam de uma tabela das suas variaçõesO fornecedor de filtros muda post_type para product_variation e limita post__in aos filhos

WOOT_WooCommerceVariations::filter_provider() define post_type como product_variation e post__in como os filhos do pai, depois de verificar que o pai é visível para o visitante. As tabelas de upsells, cross-sells, agrupados e relacionados partilham a classe base WOOT_WooCommerceUniversal e diferem apenas na origem dos IDs.

Nas linhas de variações, o título recebe no fim os nomes dos termos de atributo, e as colunas de taxonomia leem o slug de atributo da própria variação em vez dos termos atribuídos ao post.

O próprio carrinho deve ser uma tabela ordenávelOs closures do perfil do carrinho recebem ID de produto e quantidade; o motor desenha-o em modo JSON

O perfil woot_cart combina as colunas de produto configuradas com quantidade, subtotal (WC_Cart::get_product_subtotal) e remover. Cada alteração do carrinho responde com uma tabela de carrinho nova, a contagem de artigos e o subtotal. Remover e atualizar encontram a linha do carrinho por product_id ou variation_id.

O popup do carrinho adota a skin da tabela que o abriu: o bloco de estilo do pai é copiado e o seu ID de tabela substituído pelo ID da tabela do popup. Uma opção da tabela pode também ocultar os produtos já no carrinho através de post__not_in.

Motor de tabelas no navegador

shipped · 2020

O que ofereceAs tabelas respondem depressa ao paginar e ordenar, várias tabelas podem partilhar uma página, e as tabelas largas continuam utilizáveis em telemóveis.

Problema
A paginação, a ordenação e a pesquisa têm de parecer imediatas, várias tabelas com skins diferentes podem partilhar uma página, e as tabelas largas têm de funcionar em telemóveis.
Solução

data-table-23.js é uma classe sem dependências por tabela, com cache por hash do pedido, cancelamento de pedidos, um modo SQL opcional no navegador e uma mudança de disposição compacta.

Stack
  • JavaScript (classes ES6)
  • fetch
  • AbortController
  • AlaSQL
  • CustomEvent
Tarefas · 6
Uma página ou ordenação já vista não deve voltar a chegar ao servidorGuardar respostas sob um hash de todo o objeto do pedido; limpar a cache com eventos

__hash_object() serializa request_data para JSON e dobra-o num hash de 32 bits usado como chave da cache. A cache está desligada nos modos JSON e load-more, onde os dados já são locais. Extensões como comparar e favoritos disparam table23-reset-cache quando os seus dados mudam.

Os catálogos pequenos devem ordenar e pesquisar sem idas ao servidorO modo to_json carrega todas as linhas uma vez e depois ordena, pagina e pesquisa-as com AlaSQL

Com o modo to_json, o servidor devolve todas as linhas (posts_per_page -1). Após a primeira resposta, a tabela passa-se sozinha para o modo json, e draw_data() constrói SELECT ... WHERE ... ORDER BY ... LIMIT ... OFFSET e executa-o com AlaSQL sobre o array. Uma tabela de uma página encontrada na cache é pesquisada e ordenada da mesma forma.

Uma resposta anterior lenta não deve sobrescrever uma página mais recenteAbortar o fetch anterior com AbortController antes de enviar o seguinte

Cada tabela guarda o seu AbortController atual. Um novo pedido de página, ordenação ou filtro aborta o pendente, de modo que uma resposta anterior lenta já não pode sobrescrever a página mais recente.

As tabelas largas devem passar a uma disposição compacta em telemóveisVoltar a desenhar apenas quando a largura cruza o breakpoint; handler de resize bloqueado durante 999 ms

Cada tabela tem o seu compact_view_width. O listener de resize compara o novo estado com o anterior e redesenha apenas numa mudança; uma flag de bloqueio impede-o de disparar de novo durante 999 ms. As colunas marcadas hide-on-mobile são ignoradas quando os cabeçalhos são construídos, o cabeçalho flutuante é desligado no modo compacto, e as regras media-hide por coluna são geradas como CSS para o ID HTML da tabela.

Várias tabelas com skins diferentes numa páginaO CSS da skin usa um marcador tid substituído pelo ID HTML de cada tabela no momento do desenho

get_theme_css() lê a skin primeiro da pasta woot-skins do tema e depois da pasta skins do plugin, substitui o marcador tid pelo ID HTML da tabela e retira comentários e espaços a mais. Cada regra tem o âmbito de uma só tabela, pelo que as skins não vazam entre tabelas da mesma página.

As células podem conter tabelas própriasA configuração da tabela aninhada segue como JSON num div oculto e é instanciada após cada desenho

draw_table_data() codifica a configuração com JSON_HEX_QUOT e JSON_HEX_TAG para que possa ficar dentro de HTML sem sair do elemento. Depois de as linhas serem desenhadas, do_after_draw() encontra as tabelas dentro das células e cria uma instância de WOOT_GeneratedTables para cada uma, sem a barra de deslocação horizontal.

Segurança dos endpoints públicos

no produto

O que ofereceAs tabelas públicas mostram apenas os produtos que devem ser visíveis, e os visitantes não podem usar pedidos de tabela para chegar a conteúdo oculto nem executar código.

Problema
Os dados das tabelas, os popups e as ações do carrinho são servidos a visitantes anónimos através de admin-ajax, e os pedidos trazem definições de tabela, argumentos de shortcode, nomes de skins e nomes de hooks.
Solução

A visibilidade é imposta no momento da consulta e por post, os nomes que chegam a caminhos, CSS ou SQL são reduzidos a conjuntos de carateres seguros num só ponto, e cada escrita de administração verifica capability e nonce.

Stack
  • Capabilities do WordPress
  • nonces
  • $wpdb->prepare
  • Sanitização de entradas
Tarefas · 5
Os pedidos públicos de tabelas trazem um tipo de post e um estado escolhidos pelo clienteForçar o estado publish para visitantes; tipos não públicos apenas para tabelas construídas sobre eles

Mesmo antes de a WP_Query correr, post_status é reposto em publish para quem não tem read_private_posts, seja o que for que o pedido, o shortcode ou as definições da tabela pediram. Um estado vindo dos argumentos do shortcode só é respeitado para esses utilizadores.

Os tipos de post não visualizáveis (cupões, encomendas, modelos) são recusados a utilizadores sem edit_posts, a menos que a tabela guardada tenha sido construída para esse tipo de post por um administrador.

Os popups e shortcodes recebem do cliente um ID de produtowoot_can_read_post() verifica o estado, a visualizabilidade e, nas variações, o pai

Uma função decide se um visitante pode ver os dados de um post: os posts publicados de tipos públicos estão abertos, os tipos não públicos precisam de direitos de edição, os outros estados precisam de read_post, e uma variação só é visível quando o seu pai o é. As tabelas de produto único, variações, upsells e outros popups, o shortcode de galeria e as extensões chamam-na antes de desenhar.

Os nomes das skins chegam de várias fontes e acabam num caminho de ficheirobasename() mais um filtro [A-Za-z0-9_-] num único ponto de estrangulamento; ID da tabela filtrado antes do CSS

A skin pode vir de ?woot_skin=, de shortcodes, de extensões ou das definições da tabela, e todas passam por get_theme_css(). Aí o nome é reduzido com basename() e um filtro de carateres que remove pontos e barras, de modo que não possa apontar para fora das pastas de skins. O ID HTML da tabela, que é escrito no CSS impresso, é filtrado da mesma forma, para que chavetas ou parênteses angulares não possam sair do bloco de estilo.

O endpoint dos popups despacha hooks e shortcodes por nomeSó os hooks woot_ são chamáveis, call_id é limpo, só os shortcodes do plugin são desenhados

get_smth() é público. O seu ramo genérico chama apply_filters sobre um nome vindo do pedido apenas quando o nome começa por woot_, e o call_id que o acompanha é reduzido a letras, dígitos, sublinhado e hífen antes de qualquer consulta a jusante o ver. O ramo shortcodes_set remove todos os shortcodes que não estão na lista branca do plugin antes de do_shortcode(). Os ramos de exportação e importação exigem manage_woocommerce.

Escritas de administração e SQL construído a partir de nomes de colunasCapability e nonce em cada escrita; identificadores SQL reduzidos a [A-Za-z0-9_]

Os handlers de tabelas, colunas, meta e vocabulário verificam manage_woocommerce e o woot_settings_nonce antes de escrever. A extensão de anexos acrescenta uma verificação de sessão iniciada e verificações edit_post ao nível do objeto.

Os nomes de colunas, os campos de ORDER BY e as chaves de WHERE não podem ser associados por prepare(), pelo que get_rows() os reduz a um conjunto de carateres seguro, limita a ordem a ASC ou DESC e a lógica a AND ou OR, e associa apenas valores.

Números

wordpress.org
  • Instalações ativas 1000+ contador do wordpress.org.
  • Avaliações 18 Média de 4.8 em 5.
  • Anos de suporte 6 Desde 4 de setembro de 2020, última atualização em 12 de outubro de 2026.