Si estas interesado en posicionar tu sitio de WordPress, quizás seas de esos usuarios que escriben meta títulos y meta descripciones usando un plugin de SEO.
Los plugin de SEO guardan esos datos en campos personalizados (custom fields) y esos datos se almacenan en una tabla de la base de datos llamada “wp_postmeta“.
Por lo tanto si podemos crear un custom fields y una función que agregue esos datos a nuestro HTML, podríamos deshacernos de nuestro plugin de SEO.
En este post, verás lo fácil que es crear un plugin para manejar los meta títulos y meta descripciones sin la necesidad de un plugin.
Table of Contents
¿Donde Agregar estos Código?
Antes de todo, debes saber donde agregar estos códigos.
Tienes varias opciones:
- Plugin para agregar Snippets.
- En el archivo functions.php de tu tema hijo.
- Creando un mu-plugin
Yo trabajo con mu-plugins por lo que ese es mi método para agregar nuevas funcionalidades a WordPress
Creando los Campos Personalizados
Los campos personalizado puedes crearse de tres maneras distintas.
- Puedes crearlos usando las funciones nativas de WordPress
- Puedes la versión gratuita de Advanced Custom Fields u otro plugin similar
- Usando una función de PHP
En lo personal, a mi me gusta usar Advanced Custom Fields porque permite controlar el input que estos campos recibes.
Sin importar el metodo que usas.
- El custom field donde vas a agregar los meta títulos debe llamarse meta_title.
- El custom field donde vas a agregar las meta descripciones debe llamarse meta_descripciones.
La verdad es que puedes llamarlos como quieres pero si ese fuese el caso, deberás hacer modificaciones en el código.
PHP para Agregar Meta Títulos y Meta Descripciones
Una vez que has creado los custom fields con los nombres indicados, debes usar este código de PHP que agregará el meta título y meta descripción de una pagina o publicación al head.
Este código tambien agrega otros datos importantes como fecha de publicación y fecha de modificación al código fuente de la página
$meta_tags_outputted = false; // Initialize a flag to track if any meta tags have been outputted
add_action('wp_head', function () use (&$meta_tags_outputted) {
if (is_singular()) {
$post_id = get_the_ID();
// Set meta title to post title if custom meta title is not set
$meta_title = get_post_meta($post_id, 'meta_title', true);
if (!$meta_title) {
$meta_title = get_the_title($post_id);
}
// Set meta description to first 160 characters of post content, stripped of HTML tags, if custom meta description is not set
$meta_desc = get_post_meta($post_id, 'meta_description', true);
if (!$meta_desc) {
$post_content = get_post_field('post_content', $post_id);
$meta_desc = mb_substr(wp_strip_all_tags($post_content), 0, 160);
}
// Replace newline characters with spaces
$meta_desc = str_replace("\n", " ", $meta_desc);
// Replace multiple spaces with a single space
$meta_desc = preg_replace('/\s+/', ' ', $meta_desc);
// Add a line break before the title
echo "\n";
// Output meta title and meta description
if ($meta_title) {
printf('<meta name="title" content="%s">', $meta_title);
echo "\n"; // Add a line break
$meta_tags_outputted = true; // Set the flag to true
}
if ($meta_desc) {
printf('<meta name="description" content="%s">', $meta_desc);
echo "\n"; // Add a line break
$meta_tags_outputted = true; // Set the flag to true
}
// Display the published date and modified date
$published_date = get_the_date('Y-m-d', $post_id);
$modified_date = get_the_modified_date('Y-m-d', $post_id);
if ($published_date) {
echo '<meta name="published-date" content="' . $published_date . '">' . "\n";
}
if ($modified_date) {
echo '<meta name="modified-date" content="' . $modified_date . '">' . "\n";
}
}
}, 2);
Columnas para Meta Títulos y Meta Descripciones
Si ya has creado los custom fields o campos personalizados y los has nombrado “meta_title” y “meta_description“, puedes usar este code snippet para que estos aparezcan en las columnas en las lista de páginas y publicaciones
// Add custom columns to post and page lists
function custom_columns_head($defaults) {
$defaults['meta_title'] = 'Meta Title';
$defaults['meta_description'] = 'Meta Description';
return $defaults;
}
function custom_columns_content($column_name, $post_ID) {
if ($column_name == 'meta_title') {
$meta_title = get_post_meta($post_ID, 'meta_title', true);
echo esc_html($meta_title);
}
if ($column_name == 'meta_description') {
$meta_description = get_post_meta($post_ID, 'meta_description', true);
echo esc_html($meta_description);
}
}
add_filter('manage_posts_columns', 'custom_columns_head');
add_action('manage_posts_custom_column', 'custom_columns_content', 10, 2);
add_filter('manage_pages_columns', 'custom_columns_head');
add_action('manage_pages_custom_column', 'custom_columns_content', 10, 2);
De esta manera puedes ver cuales páginas o publicaciones tienen un meta título o meta descripción, y así agregar o modificar algunas de ellas.
Código Completo Mu-Plugin
Este es el código completo que puedes usar para crear tu mu-plugin
<?php
/*
Plugin Name: SEO
Plugin URI: https://wpsurfer.com
Description: Add Meta Tags and Published and Modified Dates to Posts
Version: 3.0
Author: TicoLibre
Author URI: https://wpsurfer.com
*/
// Meta Title and Meta Description
$meta_tags_outputted = false; // Initialize a flag to track if any meta tags have been outputted
add_action('wp_head', function () use (&$meta_tags_outputted) {
if (is_singular()) {
$post_id = get_the_ID();
// Set meta title to post title if custom meta title is not set
$meta_title = get_post_meta($post_id, 'meta_title', true);
if (!$meta_title) {
$meta_title = get_the_title($post_id);
}
// Set meta description to first 160 characters of post content, stripped of HTML tags, if custom meta description is not set
$meta_desc = get_post_meta($post_id, 'meta_description', true);
if (!$meta_desc) {
$post_content = get_post_field('post_content', $post_id);
$meta_desc = mb_substr(wp_strip_all_tags($post_content), 0, 160);
}
// Replace newline characters with spaces
$meta_desc = str_replace("\n", " ", $meta_desc);
// Replace multiple spaces with a single space
$meta_desc = preg_replace('/\s+/', ' ', $meta_desc);
// Add a line break before the title
echo "\n";
// Output meta title and meta description
if ($meta_title) {
printf('<meta name="title" content="%s">', $meta_title);
echo "\n"; // Add a line break
$meta_tags_outputted = true; // Set the flag to true
}
if ($meta_desc) {
printf('<meta name="description" content="%s">', $meta_desc);
echo "\n"; // Add a line break
$meta_tags_outputted = true; // Set the flag to true
}
// Display the published date and modified date
$published_date = get_the_date('Y-m-d', $post_id);
$modified_date = get_the_modified_date('Y-m-d', $post_id);
if ($published_date) {
echo '<meta name="published-date" content="' . $published_date . '">' . "\n";
}
if ($modified_date) {
echo '<meta name="modified-date" content="' . $modified_date . '">' . "\n";
}
}
}, 2);
// Add custom columns to post and page lists
function custom_columns_head($defaults) {
$defaults['meta_title'] = 'Meta Title';
$defaults['meta_description'] = 'Meta Description';
return $defaults;
}
function custom_columns_content($column_name, $post_ID) {
if ($column_name == 'meta_title') {
$meta_title = get_post_meta($post_ID, 'meta_title', true);
echo esc_html($meta_title);
}
if ($column_name == 'meta_description') {
$meta_description = get_post_meta($post_ID, 'meta_description', true);
echo esc_html($meta_description);
}
}
add_filter('manage_posts_columns', 'custom_columns_head');
add_action('manage_posts_custom_column', 'custom_columns_content', 10, 2);
add_filter('manage_pages_columns', 'custom_columns_head');
add_action('manage_pages_custom_column', 'custom_columns_content', 10, 2);