Livo Story

Descrição

O Livo Story permite vincular vídeos verticais curtos (“stories”) aos seus produtos do WooCommerce e exibi-los em um carrossel com navegação por deslize em qualquer lugar do site, usando um shortcode. As pessoas podem assistir ao story de um produto e adicioná-lo ao carrinho diretamente pelo cartão do story, inclusive no caso de produtos variáveis, sem sair do story.

Recursos

  • Stories em vídeo verticais e navegáveis por deslize para produtos do WooCommerce, em computadores e dispositivos móveis.
  • Cartão de adição ao carrinho dentro do story, com suporte nativo a variações do WooCommerce.
  • Pode ser estendido pelo filtro livostory_extra_cart_fields, permitindo que um tema ou outro plugin adicione campos específicos da loja (por exemplo, uma data obrigatória) ao cartão de adição ao carrinho, sem modificar o próprio Livo Story.
  • Painel de administração para gerenciar stories por produto, reordená-los e acompanhar estatísticas básicas de visualização.

Capturas de tela

Instalação

  1. Envie os arquivos do plugin para /wp-content/plugins/livo-story ou instale-o diretamente pela tela de plugins do WordPress.
  2. Ative o plugin na tela Plugins do WordPress.
  3. O WooCommerce precisa estar instalado e ativo.
  4. Acesse o menu administrativo do Livo Story para adicionar um story a um produto.
  5. Adicione o shortcode [livostory-stories] a qualquer página ou post para exibir o carrossel de stories.

Perguntas frequentes

Isso funciona com produtos variáveis?

Sim. Quando o produto de um story tem variações, o cartão de adição ao carrinho se expande para permitir que a pessoa escolha os atributos antes de adicionar o produto ao carrinho.

Posso coletar informações adicionais antes de adicionar ao carrinho (por exemplo, uma data obrigatória)?

Sim, por meio do filtro livostory_extra_cart_fields. Ele recebe a lista atual de campos, o WC_Product e o story, e espera um array de definições de campos (name, type, label, required e options para um campo select). Por padrão, o Livo Story não registra nenhum campo.

Avaliações

Não há avaliações para este plugin.

Colaboradores e desenvolvedores

“Livo Story” é um programa de código aberto. As seguintes pessoas contribuíram para este plugin.

Colaboradores

Livo Story” foi traduzido para 1 localidade. Agradecemos aos tradutores por suas contribuições.

Traduzir o “Livo Story” para seu idioma.

Interessado no desenvolvimento?

Navegue pelo código, consulte o repositório SVN ou assine o registro de desenvolvimento por RSS.

Registro de alterações

1.9.0

  • Adicionada uma configuração de cor e texto do botão de compra (Configurações > Botão de compra), aplicada a todos os botões de compra/adição ao carrinho dentro do modal de stories.
  • Adicionadas setas de navegação anterior/próximo à fileira de stories na loja, exibidas quando há mais de 4 stories.

1.8.4

  • Adicionados o ícone, o banner e as capturas de tela do plugin à página de listagem no WordPress.org.

1.8.3

  • Stories ocultos (inativos) ainda podiam acumular registros de visualização e atribuições de eventos do carrinho pelos dois endpoints públicos de acompanhamento, embora não aparecessem na loja. Agora, ambos verificam se o story está ativo, assim como a própria loja já faz.
  • O limite por visitante nos dois endpoints de acompanhamento usava um endereço IP lido de cabeçalhos controlados pelo cliente (X-Forwarded-For, Client-IP), que um script podia alterar a cada requisição para contorná-lo. Agora, o limite usa REMOTE_ADDR, o endereço visto pelo próprio servidor e que o cliente não pode falsificar. A consulta mais permissiva, que prioriza os cabeçalhos, continua sendo usada apenas para o IP armazenado nas análises, que serve para exibição e não para controle de segurança.
  • Corrigida a causa do modal de stories não abrir em algumas páginas. O console mostrava “no data for container … livostoryStoriesData itself is missing”: os dados de cada instância eram anexados por wp_add_inline_script() dentro do próprio shortcode, o que só funciona se o script de destino ainda não tiver sido impresso — algo que não é garantido quando o shortcode é renderizado por um widget, uma área do rodapé ou um construtor de páginas executado após o conteúdo principal. Agora, esses dados são coletados durante a renderização do shortcode e impressos em wp_footer, antes da impressão dos scripts do próprio WordPress, independentemente de onde o shortcode aparece na página.
  • Corrigido um aviso do PHP (“Undefined property: stdClass::$thumbnail_url”) registrado a cada exibição de story: a tabela de stories nunca teve uma coluna thumbnail_url, e o plugin nunca grava esse valor. Os cinco pontos que o consultavam agora o tratam como sempre ausente, sem gerar um aviso.
  • Removido o endpoint AJAX público “get stories”. Nenhum recurso do plugin o chamava — os stories da loja são renderizados no servidor pelo shortcode —, então ele apenas expunha uma consulta ao banco de dados sem autenticação.
  • Removido o endpoint AJAX administrativo “get story”, que não era utilizado, pelo mesmo motivo.
  • Agora, todos os manipuladores AJAX restantes verificam o nonce com check_ajax_referer() e, quando a ação exige privilégios, também usam current_user_can(). Essas verificações são feitas diretamente e antes da leitura de qualquer dado de entrada, em vez de usar um auxiliar compartilhado.
  • Agora, a atribuição de adição ao carrinho de um story verifica o nonce antes de ler qualquer outro campo da requisição.
  • Corrigido um erro de banco de dados registrado a cada ativação e atualização de versão: as tabelas de stories eram criadas com uma cláusula FOREIGN KEY que dbDelta() não consegue interpretar, fazendo com que gerasse SQL inválido ao tentar “corrigir” a tabela. A restrição foi removida (ela nunca chegou a ser criada por dbDelta()), e agora o comportamento de exclusão em cascata é implementado diretamente no código quando um story é excluído.
  • Corrigido o botão administrativo “copiar shortcode”, que gerava o erro “Cannot read properties of undefined (reading ‘writeText’)” em instalações sem HTTPS. Duas outras cópias dessa função, sem a alternativa para conexões sem HTTPS que a versão funcional já tinha, eram carregadas depois e a sobrescreviam sem aviso. Ambas foram removidas, e agora os dois pacotes administrativos têm uma dependência explícita de ordem de carregamento, em vez de depender da ordem de registro.
  • Corrigido o manipulador de clique dos stories na interface pública, que era executado duas vezes em um único clique. Na segunda execução, usava o ID errado, gerava o erro “Cannot read properties of undefined” e reiniciava o vídeo e contabilizava a visualização em duplicidade. O manipulador duplicado foi removido, pois somente um dos dois recebia os dados corretos.
  • Agora, se os dados do story ainda não estiverem disponíveis no momento do clique (por causa de um cache desatualizado ou de um script lento no rodapé, por exemplo), o modal registra um aviso de diagnóstico e não faz nada, em vez de gerar uma exceção e interromper os demais manipuladores de clique da página.

1.8.2

  • O nonce adicionado na versão 1.8.1 para controlar eventos do carrinho atribuídos a stories era necessário, mas não suficiente: o WordPress fornece o mesmo valor de nonce a todas as pessoas sem login, e ele fica visível em todas as páginas. Portanto, um script ainda podia obtê-lo e reutilizá-lo. Agora, um limite por visitante e por story permite no máximo um evento atribuído durante um intervalo curto, com a mesma proteção já usada no acompanhamento de visualizações.

1.8.1

  • O endpoint AJAX público “get stories” agora limita o valor de limit: valores zero, negativos, ausentes ou excessivamente altos são ajustados a um intervalo fixo, em vez de carregar todos os stories ativos ou examinar todos os produtos de uma categoria.
  • Agora, os eventos de adição ao carrinho atribuídos a um story exigem um nonce gerado para aquela visita à página. O formulário clássico de adição ao carrinho do WooCommerce não tem nonce próprio; sem essa verificação, um script poderia repetir um par válido (story_id, product_id) e aumentar a contagem de produtos adicionados ao carrinho por um story sem nunca visitá-lo.

1.8.0

  • Novo atributo ids para o shortcode: [livostory-stories ids="7,3,12"] incorpora somente os stories indicados, exatamente nessa ordem. Agora, cada página pode exibir uma seleção própria de stories e definir a ordem sem alterar a ordem global.
  • Novo painel “Criar um shortcode” na tela Todos os stories. Pesquise um story pelo título ou produto, clique para adicioná-lo e o shortcode será criado para você, com um botão de cópia. A pesquisa abrange todos os stories, não apenas as vinte linhas da página atual.
  • Agora, os botões de cópia também funcionam em instalações servidas por HTTP sem criptografia. Eles dependiam de navigator.clipboard, disponível nos navegadores somente em um contexto seguro, e falhavam nos demais casos.
  • As duas variáveis globais de JavaScript usadas pela interface pública (productStoriesConfig, productStoriesData) agora têm o prefixo livostory (livostoryConfig, livostoryStoriesData), para evitar conflitos com o escopo global de outro plugin ou tema.
  • Removida uma chamada restante de wp_localize_script() que gravava dados em uma variável global logo sobrescrita por uma chamada de wp_add_inline_script(); ela não tinha nenhuma utilidade.
  • Agora, o endpoint público de acompanhamento de visualizações, acessível sem login, limita todos os valores informados pelo visitante (a duração fica dentro de um intervalo razoável e o tipo de dispositivo é conferido em uma lista fixa) e restringe envios repetidos da mesma pessoa para o mesmo story. Assim, um script que reutilize o nonce público do próprio endpoint não pode mais encher a tabela de visualizações com registros arbitrários.

1.7.1

  • Agora, o formulário do story é salvo em admin_init, antes de qualquer saída. Antes, ele era processado pelo callback da página, executado depois da impressão do cabeçalho administrativo. Por isso, o redirecionamento não podia usar wp_safe_redirect() e recorria a um script em linha.
  • Todos os blocos restantes de script e estilo em linha foram movidos para arquivos carregados pelo WordPress: os dados de cada instância do story agora são anexados ao script da interface pública, e as regras de pré-visualização de Adicionar story ficam na folha de estilos administrativa.
  • Agora, o shortcode escapa a mensagem “Nenhum story encontrado” que retorna.
  • Os preços dos produtos e a marcação das variações enviados ao script da interface pública passam por wp_kses_post() antes de serem exibidos na página; os URLs das imagens das variações passam por esc_url(). Como são inseridos no DOM por JavaScript, o escape no servidor é o único ponto em que isso pode ser feito.
  • O botão de compra dos stories não contém mais um rótulo em português codificado diretamente; agora usa a string traduzida que o plugin já envia à interface pública.
  • Removido o caminho /wp-admin/ codificado diretamente no manipulador de envio de arquivos; agora ele usa somente ABSPATH.
  • Removido load_plugin_textdomain(), desnecessário para plugins hospedados no diretório desde o WordPress 4.6, e removidos os arquivos de tradução do pacote. Agora, as traduções vêm de translate.wordpress.org.
  • O aviso “WooCommerce obrigatório” agora aparece somente nas telas do próprio plugin e na lista de plugins, em vez de aparecer em todo o wp-admin.
  • Agora, o pacote inclui os arquivos-fonte não minificados de dist/, além da configuração de compilação; o readme explica como recompilá-los.

1.7.0

  • Corrigido um erro fatal que afetava todas as páginas de produtos do WooCommerce: o código da meta tag de compartilhamento social chamava uma classe que não existe no plugin.
  • O WooCommerce agora é uma dependência declarada (“Requires Plugins”), e cada ponto de entrada que acessa uma API do WooCommerce verifica primeiro se ele está disponível. Assim, o plugin não causa mais um erro fatal quando o WooCommerce está ausente ou desativado.
  • Removido o subsistema de compressão de vídeo não utilizado. Ele nunca funcionou: o namespace ficava fora do mapa de carregamento automático do plugin, então a classe nunca era carregada. Esse subsistema era o único motivo para incluir php-ffmpeg e suas dependências. O pacote do plugin deixa de incluir cerca de 2,5 MB de código de fornecedores.
  • O campo “Requires PHP” agora informa 8.2, que já era a versão exigida pelo plugin. Antes, informava 7.4, permitindo que sites com versões antigas do PHP instalassem o plugin e tivessem um erro fatal em todas as requisições, inclusive no wp-admin.
  • Revisão de segurança e dos padrões de código em todo o plugin: todas as saídas são escapadas, as strings traduzidas usam funções de tradução com escape, todas as consultas ao banco passam por $wpdb->prepare(), e o CSS/JS da reformulação administrativa é carregado com wp_enqueue_* em vez de tags / brutas.
  • Agora, os vídeos enviados são salvos diretamente em uploads/product-stories pelo filtro upload_dir, em vez de serem gravados na pasta do mês e depois movidos com rename(). Essa movimentação podia falhar sem aviso e deixar o arquivo enviado sem referência.
  • Removidos os registros de depuração que gravavam dados do formulário no log de erros do PHP a cada salvamento de story.
  • A folha de estilos administrativa não carrega mais a fonte Outfit do Google Fonts em tempo de execução. Plugins do WordPress.org não podem carregar recursos de terceiros, e a folha de estilos já usa as fontes de interface do sistema como alternativa.
  • Removidas três ações AJAX sem prefixo (delete_story, toggle_story_status, update_story_order). Elas colidiam com o namespace genérico que o WordPress.org pede que os plugins evitem e, de qualquer forma, não podiam ser chamadas: as telas administrativas usam os manipuladores com o prefixo livostory_.
  • Adicionado o arquivo de licença GPLv3, indicado desde sempre no cabeçalho do plugin.
  • O shortcode e o endpoint AJAX da interface pública não repetem mais a mesma consulta; ambos agora chamam um único método do provedor de stories.

1.6.0

  • Novo cartão no Painel: “Mais adicionados ao carrinho” — acompanha quantas vezes o botão de compra de cada story realmente adicionou o produto ao carrinho (e não apenas quantos cliques recebeu), com classificação e filtro pelo mesmo intervalo de datas usado no restante do painel.
  • Os eventos de adição ao carrinho só são atribuídos a um story quando é possível confirmar que o clique corresponde ao produto realmente adicionado. Assim, uma ação de adição ao carrinho não relacionada em outra parte do site não distorce a contagem.

1.5.0

  • Reformuladas por completo as telas administrativas do plugin (Painel, Todos os stories, Adicionar story e Configurações), com o novo visual em tons escuros, rosa e laranja.
  • Painel: métricas reais de desempenho (visualizações, visitantes únicos, tempo de exibição e conclusão), com seletor de período e classificação dos “stories mais vistos”, substituindo a visualização anterior, que mostrava apenas um gráfico.
  • Tela Todos os stories: pesquisa, filtros de status, reordenação por arrastar e soltar e contagem de visualizações por story, tudo em um só lugar.
  • Corrigido um erro antigo que impedia a exibição da paginação na tela Todos os stories (havia uma divergência no nome da variável entre o controlador da página e o modelo).
  • Corrigido o filtro de status (Ativos/Ocultos) na tela Todos os stories, que era exibido, mas não filtrava a lista.
  • Adicionadas traduções pt_BR para todos os itens acima.

1.4.4

  • Corrigida a possibilidade de selecionar “Carrossel de stories” e “Slides arredondados” ao mesmo tempo. Como são o mesmo layout (quadrado ou com cantos arredondados), agora compartilham um grupo de opções, assim como as demais opções de exibição.

1.4.3

  • O ícone de “Slides arredondados” agora mostra três círculos com um contorno em gradiente (igual ao anel dos stories na interface pública), como os avatares de stories do Instagram, em vez de um quadrado arredondado simples.

1.4.2

  • “Slides arredondados” agora aparece em um cartão na mesma grade visual das opções de layout, em vez de uma simples caixa de seleção. Como é uma opção disponível, ela recebe o mesmo estilo.

1.4.1

  • O seletor de layout de exibição foi movido para o cartão Configurações de aparência existente, ao lado de Slides arredondados, em vez de ficar em uma caixa separada.
  • “Carrossel de stories” (o layout usado atualmente) agora é a opção disponível e padrão; Grade, Carrossel e Stories são as opções marcadas como “Em breve”.

1.4.0

  • Adicionado às configurações um seletor de layout de exibição (Grade, Carrossel, Stories e cartões de Carrossel de stories). No momento, somente Grade funciona; os demais estão marcados como “Em breve”, sem bloqueio artificial para versões pagas.

1.3.5

  • Corrigida a exibição do campo de data de ativação no Safari para iOS, que aparecia como uma caixa grande e aparentemente vazia (o controle de data nativo desse navegador define o próprio tamanho com base na altura da linha herdada, ao contrário da versão para computador).

1.3.4

  • Traduzidas as strings restantes em português no código-fonte das telas administrativas “Adicionar story” e “Todos os stories”, que não foram incluídas na versão 1.2.0 (a busca anterior não encontrou palavras sem acento).

1.3.3

  • Corrigida a aplicação dos utilitários do Tailwind em elementos que têm a classe .wrap neles próprios (por exemplo, para centralizar o conteúdo na tela “Adicionar story”). O escopo anterior, baseado em elementos ancestrais, não abrangia os casos em que a classe e o elemento eram o mesmo.

1.3.2

  • Corrigidos os scripts de lançamento e empacotamento, que ainda usavam o slug provisório coffee-wc-checkout em vez de livo-story. Isso afetava o caminho público dos recursos compilados e os nomes da pasta e do arquivo ZIP de lançamento.
  • Agora, a compilação de lançamento inclui readme.txt e o composer.json real (antes havia um arquivo genérico sem as dependências verdadeiras).
  • Agora, yarn release executa composer install --no-dev, gerando sozinho um pacote pronto para envio.

1.3.1

  • Evitado um erro fatal em servidores sem a biblioteca opcional php-ffmpeg: nesses casos, a compressão de vídeo agora é ignorada sem interromper o funcionamento, assim como quando o binário ffmpeg não está disponível.

1.3.0

  • O Tailwind CSS agora é compilado e incluído localmente, em vez de ser carregado de cdn.tailwindcss.com, conforme as diretrizes do WordPress.org contra o carregamento remoto de código.
  • Corrigida uma regressão no carregamento de recursos administrativos (uma verificação interna do slug da página foi alterada por engano durante a atualização de internacionalização da versão 1.2.0).

1.2.0

  • Todas as strings originais (PHP e JS) agora são em inglês por padrão, conforme as diretrizes do WordPress.org.
  • Adicionada uma tradução para português do Brasil (languages/livo-story-pt_BR.mo) para que instalações existentes mantenham o mesmo idioma na interface.

1.1.6

  • Removidas referências codificadas diretamente a recursos de uma loja específica dos estilos de finalização de compra incluídos no plugin.
  • Unificado o domínio de texto do plugin para livo-story em todo o código.
  • Adicionado um arquivo readme.txt.

1.1.5

  • Adicionado o filtro livostory_extra_cart_fields para que os campos de adição ao carrinho específicos da loja não precisem ser codificados diretamente no plugin.
  • Corrigida a correspondência de atributos personalizados (que não são taxonomias) ao adicionar produtos variáveis ao carrinho.
  • O cartão de adição ao carrinho agora se expande no próprio lugar, substituindo o pop-up anterior.
  • Removida a solicitação externa do CSS do Swiper via CDN; agora é usada a cópia local que já acompanha o plugin.