Onde colocar a biblioteca PHP de terceiros?

8

Estou desenvolvendo alguns plugins de código aberto e um tema (todos parte de um "conjunto") que todos usam a mesma biblioteca PHP de terceiros. Gostaria de saber qual é a melhor maneira de incluí-lo no Wordpress. Aqui estão alguns pensamentos:

  • coloque-o em um dos plugins e exija que ele seja instalado e ativado
  • crie um plugin "core" especial que não faz nada além de incluí-lo
  • coloque diretamente wp-content

Alguma idéia sobre esse assunto?

gou1
fonte
Esse desenvolvimento é para uso privado em site único ou em vários sites / publicação pública?
Rarst
É para um conjunto de plugins de código aberto. Estou atualizando a pergunta para apontar isso.
gou1

Respostas:

5

Se cada plugin / tema funcionar por conta própria, provavelmente você deverá soltar a biblioteca em cada tema / plugin.

Em seguida, basta verificar se existe uma classe ou função da biblioteca de terceiros antes de solicitá-la.

<?php
if( class_exists( 'SomeClass' ) )
{
    // require/include here
}

ou

<?php
if( function_exists( 'some_function' ) )
{
   // Require/include stuff here
}

Como alternativa, você pode agrupar todas as funções / classes / variáveis ​​/ constantes da biblioteca de terceiros em uma verificação para ver se ela existe, como funções conectáveis .

Se todos os plugins e o tema dependem um do outro, não faz muito sentido dividi-los e você provavelmente deve repensar isso.

chrisguitarguy
fonte
Os plugins têm características diferentes, daí a separação: você só ativa o que deseja. Mas tudo depende de uma estrutura, é por isso que preciso incluir essa biblioteca. Ele tem um carregador automático e várias classes, portanto, verificar / exigir para cada classe seria realmente uma dor. E eu realmente não posso descartá-lo em todas as classes porque ele registraria o carregador automático várias vezes. No momento, a melhor solução parece ser o plug-in "principal". Você o ativa primeiro, para que ele exija todo o material de terceiros e, em seguida, você seleciona os plugins que deseja.
fácil
Você está pensando sobre isso errado: basta criar um arquivo de inicialização, incluindo algo que você possa verificar, que inclua / exija todas as classes. Em seguida, exija esse arquivo. Um cheque. Não conte com seus usuários para descobrir que eles precisam instalar o segundo plug-in.
chrisguitarguy
Essa é precisamente a minha pergunta: seja qual for o método (plugin, bootstrapper, etc.) onde colocar os arquivos?
fácil
Ah, eu os colocaria em uma librarypasta em cada plugin / tema. Em seguida, no seu arquivo principal de plug-in, execute a verificação e inclua-os, se necessário.
Chrisguitarguy
3

Vincule todo o código dependente a uma ação no plug-in da biblioteca.

Código de amostra para o plugin da biblioteca:

add_action( 'plugins_loaded', 'load_library', 0 );

function load_library()
{
    # load all the classes and files you need
    # Set up $plugin_url and $plugin_directory

    do_action( 'library_loaded', $plugin_url, $plugin_directory );
}

No seu código dependente, não faça nada antes da ação ser chamada:

add_action( 'library_loaded', 'start_my_code', 10, 2 );

function start_my_code( $lib_url, $lib_directory )
{
    # do stuff
}

A biblioteca lida com todas as partes básicas: verifique a versão adequada do PHP, constantes do WordPress, configurações de vários sites etc.

O outro código não fará nada se a ação 'library_loaded'não for chamada.

fuxia
fonte
1

Adicionando a resposta por chrisguitarguy, se suas bibliotecas estão na forma de classes PHP, você pode utilizar spl_autoload_register () para carregar essas classes se elas ainda não foram carregadas por outro plugin. Você pode agrupar as bibliotecas no seu plug-in e apenas usá-las, contando com o carregador de classes para incluí-las quando apropriado. Você também pode usar o carregador de classes para carregar as classes do seu próprio plugin.

por exemplo

define('WPSE_31726_PLUGIN_ROOT', dirname(__FILE__) . '/');

/**
* autoload classes as/when needed
* @param string $class_name name of class to attempt to load
*/
function wpse_31726_autoload($class_name) {
    static $classMap = array (
        'Wpse31726_Admin'       => 'class.Wpse31726_Admin.php',
        'Wpse31726_CsvLoader'   => 'class.Wpse31726_CsvLoader.php',
        'Wpse31726_Plugin'      => 'class.Wpse31726_Plugin.php',
        'parseCSV'              => 'lib/parsecsv/parsecsv.lib.php',
    );

    if (isset($classMap[$class_name])) {
        require WPSE_31726_PLUGIN_ROOT . $classMap[$class_name];
    }
}

// register function for autoloading required classes
spl_autoload_register('wpse_31726_autoload');
webaware
fonte
O problema aqui não é o carregamento automático, mas "todos usam a mesma biblioteca PHP de terceiros".
Gou1
11
Por chrisguitarguy, cada um poderia ter sua própria cópia da biblioteca e, assim, operar essencialmente de forma independente. Como cada um deles é chamado a operar e, portanto, exige a biblioteca, eles o carregam se ainda não tiver sido carregado. O carregamento automático de classes apenas fornece uma maneira conveniente de abordar o bit "carregue se ainda não tiver sido carregado".
Webaware
0

Como não existe um diretório oficial do fornecedor , eu usaria o plug-in "core" que não faz nada além de incluir a biblioteca. Em seguida, você faz com que seus plugins exijam esse plug-in principal.

Colocar a biblioteca em um de seus plug-ins reais exigiria que o usuário tivesse esse plug-in ativado, mesmo que ele nunca queira usar sua funcionalidade. Um plug-in principal separado parece mais limpo.

Colocá-lo diretamente no conteúdo wp parece a pior solução.

Geert
fonte
Também era o que eu pensava no começo, mas descobri que não basta colocar a inclusão de suas bibliotecas em um plug-in ativado: às vezes (por exemplo, ao ativá-lo) o arquivo do plug-in "core" não será necessário .
gou1