Crie posts e páginas do WordPress usando PHP – um tutorial 101
- 1. Atualmente lendo: Crie postagens e páginas do WordPress usando PHP – um tutorial 101
- 2. Gerenciar Postagens do WordPress com PHP – Criar e Atualizar
Sem dúvida, você já viu temas e plugins do WordPress que afirmam instalar automaticamente ‘dados fictícios’ para você quando você os instala, para que você tenha imediatamente um site totalmente funcional. Vou mostrar a você um método para conseguir isso usando apenas funções PHP.
Isso pode ser útil se:
- Seu tema ou plugin requer certas postagens ou páginas.
- Você deseja fornecer uma instalação fictícia premium conforme descrito acima.
- Você deseja automatizar a criação de postagens.
- Você só quer aprender.
Neste tutorial, criaremos uma função simples para iniciantes para obter uma solução de trabalho ‘rápida e suja’. Mais tarde, em um tutorial diferente, aprenderemos como estender o que aprendemos aqui para criar um sistema de postagem robusto e fácil de usar.
Para aqueles de vocês que preferem brincar com código pré-existente em vez de ler todo o how-to, aqui está nossa função final junto com um exemplo de seu uso e notas.
if ( ! function_exists( ‘PostCreator’ ) ) {
function PostCreator(
$name = ‘AUTO POST’,
$type = ‘post’,
$content = ‘DUMMY CONTENT’,
$category = array(1,2),
$template = NULL,
$author_id = ‘1’,
$status = ‘publish’
) {
define( POST_NAME, $name );
define( POST_TYPE, $type );
define( POST_CONTENT, $content );
define( POST_CATEGORY, $category );
define( POST_TEMPLATE, ” );
define( POST_AUTH_ID, $author_id );
define( POST_STATUS, $status );
if ( $type == ‘page’ ) {
$post = get_page_by_title( POST_NAME, ‘OBJECT’, $type );
$post_id = $post->ID;
$post_data = get_page( $post_id );
define( POST_TEMPLATE, $template );
} else {
$post = get_page_by_title( POST_NAME, ‘OBJECT’, $type );
$post_id = $post->ID;
$post_data = get_post( $post_id );
}
function hbt_create_post() {
$post_data = array(
‘post_title’ => wp_strip_all_tags( POST_NAME ),
‘post_content’ => POST_CONTENT,
‘post_status’ => POST_STATUS,
‘post_type’ => POST_TYPE,
‘post_author’ => POST_AUTH_ID,
‘post_category’ => POST_CATEGORY,
‘page_template’ => POST_TEMPLATE
);
wp_insert_post( $post_data, $error_obj );
}
if ( ! isset( $post ) ) {
add_action( ‘admin_init’, ‘hbt_create_post’ );
return $error_obj;
}
}
}
/* All available options for PostCreator()
PostCreator( ‘TITLE’ , ‘POST TYPE’ , ‘POST CONTENT’ , ‘POST CATEGORY’ , ‘TEMPLATE FILE NAME’ , ‘AUTHOR ID NUMBER’ , ‘POST STATUS’);
TITLE – HTML Stripped Out. Simple String.
POST TYPE – Post type slug. Eg ‘post’ or ‘page’. Custom Post Types are supported.
POST CONTENT – Content of the Post/Page. HTML allowed.
POST CATEGORY – An array of the integer ID’s of the category/categories you want to link to your post
TEMPLATE FILE NAME – File name of the template. Only for Pages. In the format ‘file_name.php’.
AUTHOR ID NUMBER – Integer value. Default is 1.
POST STATUS – Available options; [ ‘draft’ | ‘publish’ | ‘pending’| ‘future’ | ‘private’ | custom registered status ]
If successful, PostCreator() returns nothing.
If there is an error PostCreator() returns a WP_error object.
*/
PostCreator( ‘My Lorem Ipsum’, ‘page’, ‘With a sizable serving of Dolor. This was created using Harri Bell-Thomas\’s PostCreator function.’ );
Guia passo a passo
Estaremos criando uma função PHP chamada PostCreator(), e precisaremos que ela aceite certos parâmetros. Cada parâmetro recebeu um padrão, então tecnicamente ao chamar a função você não precisa especificar nenhum deles, mas ei, onde está a graça nisso?
function PostCreator(
$name = ‘AUTO POST’,
$type = ‘post’,
$content = ‘DUMMY CONTENT’,
$category = array(1,2),
$template = NULL,
$author_id = ‘1’,
$status = ‘publish’
) {
// function output here
}
Em seguida, definirei algumas constantes necessárias para a seguinte função incorporada. (Isso poderia ser reescrito para não usar constantes, mas eu as usei porque as considero úteis ao estender a função básica PostCreator(), mas isso é uma história para outro tutorial.
define( POST_NAME, $name );
define( POST_TYPE, $type );
define( POST_CONTENT, $content );
define( POST_CATEGORY, $category );
define( POST_TEMPLATE, ” );
define( POST_AUTH_ID, $author_id );
define( POST_STATUS, $status );
OK, até agora tudo bem. Agora, incluí alguma validação para evitar que postagens/páginas duplicadas sejam geradas (o que é um pesadelo, confie em mim!). Esta validação verifica se já existe um post/página com o mesmo nome. Se isso acontecer, ele não cria um novo, mas se não, ele o cria para você.
A razão pela qual optei por verificar o título do post é porque isso é tudo o que o WordPress exige para gerar uma página (o resto é gerado automaticamente). Outras maneiras de realizar essa validação incluem a verificação de ‘slugs’ ou IDs de postagem. Tudo isso veremos em um tutorial posterior.
Isso é especialmente útil se a postagem/página for exigida pelo seu plugin ou tema. Eu desenvolvi isso pela primeira vez para um dos meus plugins porque exigia que uma página estivesse presente com um determinado modelo de página. Com esta função, eu simplesmente mantive PostCreator() como ‘admin_init’ do WordPress, o que significa que se alguém tentasse excluí-lo (como eles ousam!), então ele seria recriado imediatamente para evitar problemas com o resto do plugin.
Lembre-se de que ninguém quer que seu blog seja invadido, portanto, certifique-se de dizer a eles claramente o que está acontecendo e talvez forneça uma opção para desativá-lo.
Agora de volta para a validação. Aqui está o próximo pedaço de código.
if ( $type == ‘page’ ) {
$post = get_page_by_title( POST_NAME, ‘OBJECT’, $type );
$post_id = $post->ID;
$post_data = get_page( $post_id );
define( POST_TEMPLATE, $template );
} else {
$post = get_page_by_title( POST_NAME, ‘OBJECT’, $type );
$post_id = $post->ID;
$post_data = get_post( $post_id );
}
Então o que diabos está acontecendo aqui?
Bem, este é essencialmente o mesmo processo repetido duas vezes. Eu faço isso por causa de como as postagens e as páginas são tratadas de maneira um pouco diferente. Além disso, a constante POST_TEMPLATE só é definida se você estiver tentando criar uma página, porque somente páginas podem aceitar esse parâmetro (ou seja, será ignorado se você estiver tentando criar uma postagem padrão).
Na primeira linha da cláusula IF (seu nome técnico é ‘apodosis’ caso você ainda não saiba) a variável $post é definida. Se houver um post/página com o mesmo nome que está tentando ser criado, então $post será preenchido com os dados da entrada existente (como um objeto, não um array, mas isso pode ser alterado se for absolutamente necessário). Essa variável é usada para testar se seu título é exclusivo. As próximas duas linhas eu incluí porque, novamente, elas são muito úteis se você quiser estender essa função. Um exemplo disso pode ser atualizar a postagem existente, se ela já existir.
A seguir está nossa função aninhada que será adicionada ao gancho ‘admin_head’. Aqui está;
function hbt_create_post() {
$post_data = array(
‘post_title’ => wp_strip_all_tags( POST_NAME ),
‘post_content’ => POST_CONTENT,
‘post_status’ => POST_STATUS,
‘post_type’ => POST_TYPE,
‘post_author’ => POST_AUTH_ID,
‘post_category’ => POST_CATEGORY,
‘page_template’ => POST_TEMPLATE
);
wp_insert_post( $post_data, $error_obj );
}
Simplesmente, isso está usando a função embutida do WordPress (wp_insert_post) para gerar nosso post/página. Preenchemos $post_data com um array de nossos parâmetros (você pode ver nossas constantes em uso aqui). Isso é criado e se houver um erro, ele gera um valor booleano $error_obj. VERDADEIRO = Um problema. FALSO = Tudo bem. A última coisa a fazer é executar a função anterior no admin head, mas somente se passar na validação e retornar o objeto de erro.
if ( ! isset( $post ) ) {
add_action( ‘admin_init’, ‘hbt_create_post’ );
return $error_obj;
}
Excelente! Agora que criamos nossa função incrível, vamos usá-la!
Uso
Simplesmente inclua a função PostCreator() e execute-a.
Isso será executado usando os valores padrão, mas e se quisermos personalização? Então usamos nossos parâmetros.
PostCreator(
‘TITLE’,
‘POST TYPE’,
‘POST CONTENT’,
‘POST CATEGORY’,
‘TEMPLATE FILE NAME’,
‘AUTHOR ID NUMBER’,
‘POST STATUS’
);
Com todas essas opções, tome cuidado ao usar apóstrofos. Certifique-se de que, se você quiser usar um apóstrofo (exceto aqueles que cercam os próprios parâmetros), você o prefixa com uma barra invertida. Por exemplo;
PostCreator( ‘Alex\’s Post’ );
O parâmetro TITLE aceita um valor de string. Isso é despojado de tags HTML.
O parâmetro POST TYPE aceita o slug do tipo post, por exemplo; ‘post’ ou ‘página’. Tipos de postagem personalizados são suportados.
PostCreator( ‘Alex\’s Post’, ‘page’ );
O POST CONTENT’ aceita um valor de string. Este será o conteúdo da postagem/página criada. HTML é permitido aqui.
PostCreator( ‘Alex\’s Post’, ‘page’, ‘The force is strong with this one…’ );
A POST CATEGORY aceita um array de inteiros. Os números inteiros correspondem ao ID da categoria/categorias atribuídas ao post/página.
PostCreator( ‘Alex\’s Post’, ‘page’ , ‘The force is strong with this one…’ , array( 1, 2 ) );
O TEMPLATE FILE NAME é um valor de string que define o modelo de página desejado de sua nova página. Isso só funciona para páginas. O formato será; ‘nome_arquivo.php’.
PostCreator(
‘Alex\’s Post’,
page’,
‘The force is strong with this one…’,
array( 1, 2 ) ,
‘fullwidth_page.php’
);
O AUTHOR ID NUMBER é um valor inteiro do ID do autor.
PostCreator(
‘Alex\’s Post’,
‘page’,
‘The force is strong with this one…’,
array( 1, 2 ) ,
‘fullwidth_page.php’,
‘1’
);
O POST STATUS permite definir o estado da postagem/página criada. Por padrão é ‘publicado’.
Opções disponíveis; [ ‘rascunho’ | ‘publicar’ | ‘pendente’| ‘futuro’ | ‘privado’ | status registrado personalizado]
PostCreator(
‘Alex\’s Post’,
‘page’,
‘The force is strong with this one…’,
array( 1, 2 ) ,
‘fullwidth_page.php’,
‘1’,
‘publish’
);
Empacotando
O WordPress é uma ferramenta excepcionalmente poderosa, mas pode definitivamente ser indisciplinada às vezes. Espero que você ache este trecho simples útil, talvez aprendendo uma coisa ou duas ao longo do caminho. Fique atento para o próximo onde vou converter o que já fizemos neste artigo para uma classe PHP, adicionando mais funcionalidade e estabilidade. Para uma prévia, confira o código no Github: PostController
Se você tiver alguma dúvida, basta perguntar na seção de comentários abaixo.