Script de inicialização para aspectos "padrão" de um site WordPress?


23

Estou prestes a escrever um script para fazer uma nova instalação do WordPress 3.0.1 e adicionar todos os recursos iniciais de um site . É para uma empresa que instala muitos sites semelhantes e precisa de um ponto de partida padrão em configuração e dados.

  • Gostaria de saber se alguém já fez isso e se sim, se eles podem compartilhar seu código?

Eu imagino que ajustaremos esse script toda vez que eles criarem um novo site, para que a codificação seja boa, embora eventualmente (após experiência suficiente) eu queira converter em um plugin.

Aqui está a lista básica de tarefas que acho que precisaremos (elas assumem que eu já comecei com o WordPress 3.0.1 já instalado e meus plugins personalizados e tema personalizado copiado nos diretórios apropriados) :

// Create users for the current site
// Delete Hello Dolly Plugin
// Download, Install and Activate repository plugins
// Activate Custom Plugins (assume the plugins are already there)
// Activate Custom Theme
// Delete Hello Post
// Delete Comment on Hello Post
// Create Pages with Starter Content
// Create Initial Custom Post Types with Starter Content
// Create Multiple Menus 
// Create Menu Items for those Menus linking to Pages and wp-login.php
// Create Initial Taxonomy Terms
// Set Desired Permalinks Setting
// Set Static Front Page Setting

É isso (embora eu possa identificar mais quando entrar nele).

Mais uma vez, estou procurando um código que possa copiar e modificar, para que eu não precise descobrir todos esses detalhes (o que não é difícil, é apenas tedioso e consome muito tempo) .

Ah, mais uma coisa, eu tenho que começar agora, então quanto mais cedo melhor! :-)


Você poderia esclarecer este Create Menus for Custom Pages? Você quer dizer áreas de menu individuais em algumas páginas ou o quê?
Rarst

Oi @Rarst : Preciso criar três menus, cada um com itens de menu que apontam para as Páginas personalizadas que adicionarei (meu uso de "Personalizado" provavelmente é confuso, vou largar essa palavra e dizer "Páginas" ). Preciso adicionar três menus e itens de menu para cada um deles em que um dos itens de menu precise ser vinculado à página de login.
MikeSchinkel

Por que excluir o plugin "Hello Dolly"? Quero dizer, entendo por que você não o quer lá, mas sua presença não afeta a operação do site e, se você usar a função de atualização automática, ela será restaurada toda vez que uma nova versão for lançada.
Doug

2
Olá @Doug : Por que excluir o Hello Dolly? Resposta simples: o cliente não o quer lá. :)
MikeSchinkel

Respostas:


20

Como mencionei, começaria a trabalhar nessa necessidade imediatamente, por isso estou avançando. Dado que estou derrubando estes, achei melhor começar a publicá-los. Ainda assim, se alguém puder / irá postar (algumas das) partes que eu não fiz, ficarei feliz em permitir que você copie o que eu fizesse e selecione sua resposta como a melhor resposta. Até lá, vou começar a postar o código.

Primeira coisa: Incluir wp-load.php:

Como estamos criando um arquivo autônomo na raiz do site para executar a inicialização que será usada apenas para "inicializar" um site (eu chamei de meu /my-init.php) , começamos incluindo o /wp-load.phpcarregamento das funções da API do WordPress:

<?php
include "wp-load.php";

Criando usuários para o site

Usaremos a wp_insert_user()função localizada /wp-includes/registration.phppara criar nossos usuários. Como esse arquivo não é carregado por padrão, teremos que carregá-lo sozinhos com uma chamada para require_once().

Também usaremos a get_user_by()função para ver primeiro se o usuário já foi criado; não é necessário executar o código duas vezes, se não o tiverem. NOTA: Este é um padrão a seguir; por exemplo, nosso script não deve duplicar ou substituir nada se chamado várias vezes, especialmente depois que os usuários adicionam ou alteram dados para qualquer um dos itens que planejamos inicializar.

require_once( ABSPATH . WPINC . '/registration.php');     
$user = get_user_by('slug','johnsmith');
if (!is_object($user)) {
  wp_insert_user(array(
    'user_login'        => 'johnsmith',
    'role'              => 'administrator',
    'user_email'        => 'johnsmith@example.com',
    'user_url'          => 'http://example.com',
    'first_name'        => 'John',
    'last_name'         => 'Smith',
    'comment_shortcuts' => '',
    'use_ssl'           => '0',
    'user_pass'         => '12345',
  ));
}

Excluindo o plug-in "Hello Dolly"

Para excluir o plugin "Hello Dolly" ( desculpe Matt ) , usaremos a delete_plugins()função delete_plugins()espera uma matriz de caminhos de arquivo que sejam relativos ao /wp-content/includes/diretório. Para o plug-in Hello Dolly, o caminho do arquivo é simplesmente hello.phpporque o plug-in Hello Dolly não é armazenado em seu próprio diretório, mas para a maioria dos plug-ins ele será na forma de {$subdir}\{$filename}.php; ou seja, o caminho do arquivo para o Akismet é akismet/akismet.php.

No entanto, delete_plugins()não está disponível até a inclusão /wp-admin/includes/plugin.phpe também existe uma dependência, wp-admin/includes/file.phpportanto, nós require_once()dois antes de ligar delete_plugins(). Finalmente, usamos WP_PLUGIN_DIRconstante combinada com file_exists()para verificar se o arquivo principal do plug-in existe antes de tentar excluí-lo ( isso não importa se tentássemos excluir um arquivo ausente, mas é mais elegante verificar primeiro e você pode precisar saber como por alguma outra razão) :

require_once(ABSPATH . 'wp-admin/includes/plugin.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
if (file_exists(WP_PLUGIN_DIR . '/hello.php'))
  delete_plugins(array('hello.php'));

Observe que, às vezes delete_plugins(), falha por causa das permissões de arquivo ou talvez pelo fato de um plug-in estar ativado no momento ou por algum outro motivo que você precise resolver primeiro, mas para o nosso caso de uso, o Hello Dolly desaparece sem brigas.

Fazendo Download, Instalando e Ativando Plug-ins de Repositório

Na verdade, eu não preciso baixar plugins do repositório agora (eu estava pensando que seria bom ter) , vamos deixar esse requisito deslizar e revisá-lo mais tarde.

Ativando seus plugins

Em seguida, ative nossos próprios plugins personalizados. Estamos assumindo que já os carregamos no diretório do plug-in e tudo o que precisamos para ativá- los no WordPress. ( Nota : Essa técnica também funcionará para ativar plug-ins de repositório, apenas não fará o download e os instalará primeiro.)

Vamos usar a activate_plugin()função que gosta delete_plugins()requer /wp-admin/includes/plugin.phpa ser incluídos, mas não precisa /wp-admin/includes/file.php, no caso você está apenas a necessidade de automatizar a ativação e não exclusão.

Testaremos novamente a existência (não é necessário ativar, se não estiver lá, eh?) E também verificaremos usando a is_plugin_active()função que o plug-in ainda não foi ativado. Observe que desta vez usei algumas variáveis ​​( $plugin_filepathe $plugin_dir) para não duplicar o identificador do plug-in várias vezes.

Nosso exemplo a seguir ativa o plug-in my-custom-plugin.phplocalizado no my-custom-pluginsubdiretório:

require_once(ABSPATH . 'wp-admin/includes/plugin.php');
$plugin_filepath = 'my-custom-plugin/my-custom-plugin.php';
$plugin_dir = WP_PLUGIN_DIR . "/{$plugin_filepath}";
if (file_exists($plugin_dir) && !is_plugin_active($plugin_filepath))
  activate_plugin($plugin_filepath);

Ativando seu tema preferido

Ativar um tema é um pouco mais fácil do que excluir ou ativar um plugin, comparativamente; uma chamada de função é tudo o que for necessário: switch_theme(). A switch_theme()função aceita dois (2) parâmetros: o modelo e a folha de estilo . Bem, pelo menos é assim que os parâmetros são nomeados. Você pode estar mais familiarizado com os termos Tema pai e Tema filho .

Supondo que você tenha criado um Tema filho com o tema TwentyTen padrão que vem com o WordPress como Tema pai e o tenha chamado de "Meu tema personalizado" e colocado no /wp-content/themes/my-custom-themediretório, você ativaria seu tema usando esta chamada:

switch_theme('twentyten', 'my-custom-theme');

Mas e se não for um tema infantil? Isso é fácil, basta passar o slug do diretório / identificador do tema (ou seja, o nome do subdiretório /wp-content/themesque contém o seu tema) como ambos os parâmetros. Supondo que você deseja ativar o tema Temático por Ian D Stewart, você chama switch_theme()assim:

switch_theme('thematic', 'thematic');

Pessoalmente, acho um pouco estranho ter que acompanhar os dois detalhes aqui, então escrevi uma função chamada activate_my_theme()que primeiro verifica para garantir a get_current_theme()função e, se não, a ativa. Você só precisa dizer o tema filho (também conhecido como "folha de estilo") e descobrir o tema principal para você (também conhecido como "modelo") , capturando os detalhes da get_theme()função.

activate_my_theme('My Current Theme');
function activate_my_theme($theme_name) {
  if ($theme_name!=get_current_theme()) {
    $theme = get_theme($theme_name);
    switch_theme(
      $theme['Template'],
      $theme['Stylesheet']
    );
  }
}

Um ponto chave para estar ciente ; a get_theme()função espera receber o nome do Tema filho, NÃO é o slug do diretório / identificador do tema. (O nome vem da seção "Nome do tema:" no cabeçalho do style.cssarquivo do tema . Felizmente, a get_current_theme()função retorna o nome também.)

Inspecionando o cabeçalho no style.cssarquivo do tema padrão do WordPress Twenty Ten , vemos que seu nome é de fato 'Twenty Ten':

/*
Theme Name: Twenty Ten
Theme URI: http://wordpress.org/
Description: The 2010 theme for WordPress is stylish, customizable, simple, and readable -- make it yours with a custom menu, header image, and background. Twenty Ten supports six widgetized areas (two in the sidebar, four in the footer) and featured images (thumbnails for gallery posts and custom header images for posts and pages). It includes stylesheets for print and the admin Visual Editor, special styles for posts in the "Asides" and "Gallery" categories, and has an optional one-column page template that removes the sidebar.
Author: the WordPress team
Version: 1.1
Tags: black, blue, white, two-columns, fixed-width, custom-header, custom-background, threaded-comments, sticky-post, translation-ready, microformats, rtl-language-support, editor-style
*/

Excluindo a publicação "Hello World"

Em seguida, queremos excluir a postagem "Hello World" . Você pode ter visto que o @Rarst nos mostrou como usar a wp_delete_post()função que é exatamente o que precisamos. Como ele explicou, o segundo parâmetro excluirá totalmente o post, em vez de movê-lo para o lixo, e o primeiro parâmetro é o $post->ID.

É claro que seria bom poder especificar a lesma em vez da $post->IDe então decidi encontrar uma maneira de fazer isso. Depois de alguns spelunking, descobri que o WordPress tem uma função chamada infelizmente chamada, get_page_by_path()que na verdade nos permite procurar qualquer tipo de postagem por sua lesma (infelizmente, ela é chamada porque você pode ignorá-la ao tentar encontrar algo que funcione com outros tipos de postagem 'page').

Como passamos get_page_by_path()a constante definida pelo WordPress, OBJECTela retornará para nós uma postagem na forma de um objeto de publicação. Para o terceiro parâmetro que passamos 'post'para indicar que queríamos que ele procurasse os tipos de post 'post'. Como get_page_by_path()retornará o objeto de postagem que precisamos ou retornará nullse nenhuma postagem corresponder à lesma, podemos verificar a existência e fazer uma pesquisa ao mesmo tempo:

$post = get_page_by_path('hello-world',OBJECT,'post');
if ($post)
  wp_delete_post($post->ID,true);

Nota: Poderíamos ter executado o código para excluir todas as postagens no banco de dados, mas, se o tivéssemos, não poderíamos executá-lo novamente depois de adicionarmos as postagens que queremos manter e essa foi uma das restrições de design.

Próximo...

Continuarei adicionando isso à medida que for descobrindo até terminar ou até que alguém ajude.


Isso é realmente útil, alguma chance de incluir o restante da funcionalidade aqui?
jjeaton

@jjeaton - Resposta curta: Sim, mas ... . Resposta mais longa: serão alguns dias, se não semanas. Eu fiz um trabalho significativo sobre esse problema desde a última vez que escrevi aqui, mas meu cliente está pressionando para concluir um projeto e estou atrasado, então ... se você puder esperar um pouco, eu o postarei o mais rápido possível tenha tempo livre para escrever. BTW, em que aspectos você mais se interessa?
MikeSchinkel 9/10/10

claro, sem pressa. Eu estava pensando que essa pergunta seria realmente valiosa e, portanto, queria ver toda a solução. Eu corro vários sites do WordPress e estou sempre procurando maneiras de automatizar a manutenção repetitiva que tenho que fazer neles (atualizações de plug-ins, atualizações etc.), para que isso seja realmente valioso.
jjeaton

4

Definir links permanentes desejados

Um novo projeto de tema (impressionante) que eu me deparei esta semana, muito focado na funcionalidade HTML5 / CSS3, tem seu próprio script 'bootstrap' para criar algum conteúdo padrão, incorporar configurações de link permanente, definir uma raiz relativa para a instalação do site etc. os recursos são chamados na ativação do tema. O projeto se chama Raízes e o código pode ser baixado aqui ; Não aceito crédito por esse código. Dito isso, aqui está o código para definir automaticamente / ano / nome do post como a estrutura do link permanente (e os ganchos de ativação abaixo para o $ pagenow global são explicados aqui: http://foolswisdom.com/wp-activate-theme-actio/ .) .

<?php

    global $pagenow;
    if (is_admin() && 'themes.php' === $pagenow && isset( $_GET['activated'])) {


        // set the permalink structure
        if (get_option('permalink_structure') != '/%year%/%postname%/') { 
            update_option('permalink_structure', '/%year%/%postname%/');
      }

        $wp_rewrite->init();
        $wp_rewrite->flush_rules(); 


    }

?>


Ah, existem planos para continuar trabalhando nessa questão ... Mas, como muitos outros planos, eles estão em espera. :) Gostaria de observar que é melhor vincular a snippets de código extensivos não educacionais de terceiros, em vez de postar o tema aqui. Este site coloca as contribuições dos usuários sob a licença cc-wiki, para que a situação fique obscura e confusa quando aplicada ao código.
Rarst

Com certeza, com certeza. Há um progresso impressionante aqui, no entanto. Essa é uma ótima decisão de sua sugestão. Estive no bloco do Stack Exchange uma ou duas vezes, mas nunca pensei nas implicações do licenciamento. Editei meu código e o restante do código é facilmente obtido nos links que forneci. Agradecimentos para a ponta :)

3

Excluir o Hello Post (com comentário)

wp_delete_post( 1, true );

Direto dos wp_delete_post()documentos. O segundo parâmetro o destrói completamente, em vez de passar para o lixo.

Criar menus

Isso cria um novo menu e adiciona todas as páginas existentes como itens. Não tenho certeza se está totalmente correto, não foi possível obter itens de menu para mostrar o Pagerótulo entre outras coisas. De qualquer forma, meu cérebro está derretendo, então estou dando um tempo. Talvez alguém possa atualizar isso para algo mais confiável.

$menu = wp_create_nav_menu( 'Pages' );
$menu = wp_get_nav_menu_object( 'Pages' );
$pages = get_pages();

foreach( $pages as $page ) {

$item = array(
'menu-item-db-id' => 0,
'menu-item-object-id' => $page->ID,
'menu-item-type' => 'post_type',
'menu-item-status' => 'publish'
);

wp_update_nav_menu_item( $menu->term_id, 0, $item );
}

Oi @Rarst : Obrigado por comentar. Ah, você pegou a mais fácil ... ;-) Eu estava voltando para escrever essa.
MikeSchinkel

@ MikeSchinkel Alguma coisa que você não está escrevendo agora? Seria um desperdício mergulhar no código dos menus (é assustador) para vir com resultado e descobrir que já está feito. :)
Rarst

Olá @Rarst! Iniciar no final da lista? (obrigado antecipadamente.)
MikeSchinkel

Ok, vou tentar lidar com menus, mas sem promessas. Esse código é complexo por dentro (preço do colírio para os olhos e usabilidade), então não estou confiante de que minhas habilidades estejam em conformidade.
Rarst 13/09/10

Hey @Rarst - Eu praticamente fiz tudo funcionar, mas provavelmente levará mais 24 horas antes que eu possa terminar minha resposta. Só queria que você soubesse, para não se matar tentando fazê-lo funcionar. Obrigado pelo esforço.
MikeSchinkel 13/09/10

0

Se eu entendi bem, você quer instalá-lo inicial - receio que sua abordagem esteja totalmente errada.

Uma maneira muito melhor, mais fácil e padronizada é criar o install.php e colocá-lo na pasta wp-content - ele é carregado automaticamente durante a instalação.

Lá você pode colocar sua própria função wp_install (como a própria função wordpress usa if (! Function_exist)) para que você possa configurar facilmente suas opções, ativar plugins, preencher posts iniciais, categorias, tags, usuários ...

A segunda opção pode ser a situação em que você deseja limpar o wp já existente (por exemplo, para a versão demo configurada a cada 30 minutos usando cron) - você pode a) truncar o banco de dados e usar o procedimento acima, ou criar o plugin que executa o mesmo.


2
@ Thomas Kapler - Obrigado pela resposta, mas eu imploro para diferir; minha abordagem não é "totalmente errada". Primeiro, o que discuto é o mesmo código em que você usaria install.phpe, segundo, há outros casos de uso em que install.phpnão é aplicável. Sim, install.phpele é usado, mas não cuida dos detalhes nem da panacéia que você sugere.
18711 MikeSchinkel

0

Dê uma olhada neste script de instalação. https://github.com/Pravdomil/WP-Quick-Install

Pego suas idéias e alguns códigos e crio algo que você provavelmente está procurando.

Os recursos são: banco de dados de configuração, idiomas diferentes, criar usuários, definir configurações básicas do site, excluir plug-ins e modelos padrão, baixar instalar e ativar plug-ins e temas, avatar padrão, links permanentes, página estática.

Sinta-se livre para contribuir.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.