Este shorcode te muestra una parte muy importante del SEO de tus CPT, pudiendo editar fácilmente el Título, URL, Keyword, Title, Description, así como asignarle un ALT a tu imagen destacada.
Puedes usar varios CPT añadiendo en el shorcode el tipo de cpt. Nuestro shortcode es totalmente compatible con el plugin Yoast SEO, la solución más utilizada para optimizar metadatos en WordPress.
¿Cómo usar el shortcode para YOAST?

¿Cómo usar el shortcode para Rank Math?


¿Cómo usar el shortcode con plugin Yoast SEO?
function infoseo_implementar_yoast_shortcode($atts) {
$cpt = isset($atts['cpt']) ? $atts['cpt'] : '';
$current_page = isset($_GET['infoseo_page']) ? $_GET['infoseo_page'] : 1;
$current_page = ($current_page) ? $current_page : 1; // Asegurarse de que la página 1 esté seleccionada por defecto
$posts_per_page = 50;
$offset = ($current_page - 1) * $posts_per_page;
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
foreach ($_POST as $key => $value) {
if (strpos($key, 'update_') !== false) {
$post_id = str_replace('update_', '', $key);
$thumbnail_id = get_post_thumbnail_id($post_id);
wp_update_post(array(
'ID' => $post_id,
'post_title' => $_POST['title_'.$post_id],
'post_name' => str_replace(' ', '/', $_POST['slug_'.$post_id]) // Se reemplazan los espacios con '/'
));
update_post_meta($post_id, '_yoast_wpseo_focuskw', $_POST['keyword_'.$post_id]);
update_post_meta($post_id, '_yoast_wpseo_title', $_POST['seo_title_'.$post_id]);
update_post_meta($post_id, '_yoast_wpseo_metadesc', $_POST['meta_description_'.$post_id]);
if ($thumbnail_id) {
update_post_meta($thumbnail_id, '_wp_attachment_image_alt', $_POST['alt_image_'.$post_id]);
}
}
}
}
$args = array(
'post_type' => $cpt,
'posts_per_page' => $posts_per_page,
'offset' => $offset,
'post__not_in' => array(get_queried_object_id()),
);
$posts = get_posts($args);
$total_posts = wp_count_posts($cpt)->publish;
$total_pages = ceil($total_posts / $posts_per_page);
$output = '';
$output .= '<style>';
$output .= 'table.informe-yoast-edit input, table.informe-yoast-edit textarea {font-size: 12px;padding: 4px;display: block;}';
$output .= '.missing-data { background-color: #f2c9c9; }';
$output .= '.data-invalid { background-color: #ffe1e1; }';
$output .= 'table {width: 100%; border-collapse: collapse;}';
$output .= 'th {background-color: #4CAF50; color: white;}';
$output .= 'td, th {border: 1px solid #ddd; padding: 15px;}';
$output .= 'tr:nth-child(even) {background-color: #f2f2f2;}';
$output .= 'span.cantidad {position: absolute;margin-top: -17px;font-size: 10px;margin-left: -1px;}';
$output .= 'span.ver a {background: #000;color: #fff;font-size: 10px;padding: 2px;text-decoration: none;left: 0;}';
$output .= 'span.ver.editar a {background: #7c7c7c;margin-left: 2px;}';
$output .= '.current {background-color: #4CAF50!important;color: white;}';
$output .= '.paginationinfo {text-align: center;}';
$output .= '.paginationinfo a {padding: 4px;background: #efefef;margin: 1px;text-decoration: none;font-size: 14px;}';
$output .= '.paginationinfo a:hover, .paginationinfo a.current {background: #4caf4f;color: #fff;}';
$output .= '</style>';
$output .= '<table class="informe-yoast-edit" style="font-size: 12px;">';
$output .= '<tr>';
$output .= '<th>Título</th>';
$output .= '<th>Slug</th>';
$output .= '<th>Keyword</th>';
$output .= '<th>Título SEO <br><small>(30 - 60)</small></th>';
$output .= '<th>Meta Description <br><small>(120 - 160)</small></th>';
$output .= '<th>Imagen</th>';
$output .= '<th>Slug de imagen</th>';
$output .= '<th>Alt de imagen</th>';
$output .= '<th>Actualizar</th>';
$output .= '</tr>';
foreach ($posts as $post) {
$title = get_the_title($post->ID);
//$slug = str_replace(home_url(), '', get_permalink($post->ID));
$slug = str_replace('/', ' ', str_replace(home_url(), '', get_permalink($post->ID)));
$keyword = get_post_meta($post->ID, '_yoast_wpseo_focuskw', true);
$seo_title = get_post_meta($post->ID, '_yoast_wpseo_title', true);
$meta_description = get_post_meta($post->ID, '_yoast_wpseo_metadesc', true);
$thumbnail_id = get_post_thumbnail_id($post->ID);
$thumbnail = $thumbnail_id ? get_the_post_thumbnail_url($post->ID, 'thumbnail') : '';
$slug_image = $thumbnail ? basename($thumbnail) : '';
$alt_image = $thumbnail ? get_post_meta($thumbnail_id, '_wp_attachment_image_alt', true) : '';
$isInvalidRow = false;
if(empty($title) || empty($slug) || empty($keyword) || empty($seo_title) || empty($meta_description) || empty($thumbnail) || empty($slug_image) || empty($alt_image)) {
$isInvalidRow = true;
}
$seoTitleLength = strlen($seo_title);
$isInvalidSeoTitle = $seoTitleLength < 30 || $seoTitleLength > 60;
$metaDescriptionLength = strlen($meta_description);
$isInvalidMetaDescription = $metaDescriptionLength < 120 || $metaDescriptionLength > 160;
$output .= '<form method="post"><tr' . ($isInvalidRow ? ' class="data-invalid"' : '') . '>';
$output .= '<td><input type="text" name="title_'.$post->ID.'" value="'.$title.'"'.(empty($title) ? ' class="data-invalid"' : '').'><span class="ver"><a href="'. get_permalink($post->ID) .'" target="_blank">Ver Post</a></span><span class="ver editar"><a href="'. get_edit_post_link($post->ID) .'" target="_blank">Editar Post</a></span></td>';
$output .= '<td><input type="text" name="slug_'.$post->ID.'" value="'.$slug.'"'.(empty($slug) ? ' class="data-invalid"' : '').'></td>';
$output .= '<td><input type="text" name="keyword_'.$post->ID.'" value="'.$keyword.'"'.(empty($keyword) ? ' class="data-invalid"' : '').'></td>';
$output .= '<td><span class="cantidad">'. strlen($seo_title) . '</span><textarea name="seo_title_'.$post->ID.'"'.($isInvalidSeoTitle ? ' class="data-invalid"' : '').'>'.$seo_title.'</textarea></td>';
$output .= '<td><span class="cantidad">'. strlen($meta_description) . '</span><textarea name="meta_description_'.$post->ID.'"'.($isInvalidMetaDescription ? ' class="data-invalid"' : '').'>'.$meta_description.'</textarea></td>';
$output .= $thumbnail ? '<td><img src="' . $thumbnail . '" style="width:50px;height:auto;" /></td>' : '<td class="data-invalid"></td>';
$output .= '<td' . (empty($slug_image) ? ' class="data-invalid"' : '') . '>' . $slug_image . '</td>';
$output .= $thumbnail ? '<td><input type="text" name="alt_image_'.$post->ID.'" value="'.$alt_image.'"'.(empty($alt_image) ? ' class="data-invalid"' : '').'></td>' : '<td class="data-invalid"></td>';
$output .= '<td><button type="submit" name="update_'.$post->ID.'">Actualizar</button></td>';
$output .= '</tr></form>';
}
$output .= '</table>';
// Implementación de paginación
$output .= '<div class="paginationinfo">';
for ($i = 1; $i <= $total_pages; $i++) {
$current = ($i == $current_page) ? ' class="current"' : '';
$output .= '<a href="?infoseo_page=' . $i . '"' . $current . '>' . $i . '</a>';
}
$output .= '</div>';
return $output;
}
add_shortcode('infoseo_editable_yoast', 'infoseo_implementar_yoast_shortcode');
¿Cómo usar el shortcode con plugin Rank Math?
function infoseo_implementar_rankmath_shortcode($atts) {
$cpt = isset($atts['cpt']) ? $atts['cpt'] : '';
$current_page = isset($_GET['infoseo_page']) ? $_GET['infoseo_page'] : 1;
$current_page = ($current_page) ? $current_page : 1;
$posts_per_page = 50;
$offset = ($current_page - 1) * $posts_per_page;
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
foreach ($_POST as $key => $value) {
if (strpos($key, 'update_') !== false) {
$post_id = str_replace('update_', '', $key);
$thumbnail_id = get_post_thumbnail_id($post_id);
wp_update_post(array(
'ID' => $post_id,
'post_title' => $_POST['title_'.$post_id],
'post_name' => str_replace(' ', '/', $_POST['slug_'.$post_id])
));
update_post_meta($post_id, 'rank_math_focus_keyword', $_POST['keyword_'.$post_id]);
update_post_meta($post_id, 'rank_math_title', $_POST['seo_title_'.$post_id]);
update_post_meta($post_id, 'rank_math_description', $_POST['meta_description_'.$post_id]);
if ($thumbnail_id) {
update_post_meta($thumbnail_id, '_wp_attachment_image_alt', $_POST['alt_image_'.$post_id]);
}
}
}
}
$args = array(
'post_type' => $cpt,
'posts_per_page' => $posts_per_page,
'offset' => $offset,
'post__not_in' => array(get_queried_object_id()),
);
$posts = get_posts($args);
$total_posts = wp_count_posts($cpt)->publish;
$total_pages = ceil($total_posts / $posts_per_page);
$output = '';
$output .= '<style>';
$output .= 'table.informe-rankmath-edit input, table.informe-rankmath-edit textarea {font-size: 12px;padding: 4px;display: block;}';
$output .= '.missing-data { background-color: #f2c9c9; }';
$output .= '.data-invalid { background-color: #ffe1e1; }';
$output .= 'table {width: 100%; border-collapse: collapse;}';
$output .= 'th {background-color: #4CAF50; color: white;}';
$output .= 'table.informe-rankmath-edit tr th{background-color: #4CAF50!important}';
$output .= 'td, th {border: 1px solid #ddd; padding: 15px;}';
$output .= 'tr:nth-child(even) {background-color: #f2f2f2;}';
$output .= 'span.cantidad {position: absolute;margin-top: -17px;font-size: 10px;margin-left: -1px;}';
$output .= 'span.ver a {background: #000;color: #fff;font-size: 10px;padding: 2px;text-decoration: none;left: 0;}';
$output .= 'span.ver.editar a {background: #7c7c7c;margin-left: 2px;}';
$output .= '.current {background-color: #4CAF50!important;color: white;}';
$output .= '.paginationinfo {text-align: center;}';
$output .= '.paginationinfo a {padding: 4px;background: #efefef;margin: 1px;text-decoration: none;font-size: 14px;}';
$output .= '.paginationinfo a:hover, .paginationinfo a.current {background: #4caf4f;color: #fff;}';
$output .= '</style>';
$output .= '<table class="informe-rankmath-edit" style="font-size: 12px;">';
$output .= '<tr>';
$output .= '<th>Título</th>';
$output .= '<th>Slug</th>';
$output .= '<th>Keyword</th>';
$output .= '<th>Título SEO <br><small>(30 - 60)</small></th>';
$output .= '<th>Meta Description <br><small>(120 - 160)</small></th>';
$output .= '<th>Imagen</th>';
$output .= '<th>Slug de imagen</th>';
$output .= '<th>Alt de imagen</th>';
$output .= '<th>Actualizar</th>';
$output .= '</tr>';
foreach ($posts as $post) {
$title = get_the_title($post->ID);
$slug = str_replace('/', ' ', str_replace(home_url(), '', get_permalink($post->ID)));
$keyword = get_post_meta($post->ID, 'rank_math_focus_keyword', true);
$seo_title = get_post_meta($post->ID, 'rank_math_title', true);
$meta_description = get_post_meta($post->ID, 'rank_math_description', true);
$thumbnail_id = get_post_thumbnail_id($post->ID);
$thumbnail = $thumbnail_id ? get_the_post_thumbnail_url($post->ID) : '';
$thumbnailmini = $thumbnail_id ? get_the_post_thumbnail_url($post->ID, 'thumbnail') : '';
$slug_image = $thumbnail ? basename($thumbnail) : '';
$alt_image = $thumbnail ? get_post_meta($thumbnail_id, '_wp_attachment_image_alt', true) : '';
$isInvalidRow = false;
if(empty($title) || empty($slug) || empty($keyword) || empty($seo_title) || empty($meta_description) || empty($thumbnail) || empty($slug_image) || empty($alt_image)) {
$isInvalidRow = true;
}
$seoTitleLength = strlen($seo_title);
$isInvalidSeoTitle = $seoTitleLength < 30 || $seoTitleLength > 60;
$metaDescriptionLength = strlen($meta_description);
$isInvalidMetaDescription = $metaDescriptionLength < 120 || $metaDescriptionLength > 160;
$output .= '<form method="post"><tr' . ($isInvalidRow ? ' class="data-invalid"' : '') . '>';
$output .= '<td><input type="text" name="title_'.$post->ID.'" value="'.$title.'"'.(empty($title) ? ' class="missing-data"' : '').'><span class="ver"><a href="'. get_permalink($post->ID) .'" target="_blank">Ver Post</a></span><span class="ver editar"><a href="'. get_edit_post_link($post->ID) .'" target="_blank">Editar Post</a></span></td>';
$output .= '<td><input type="text" name="slug_'.$post->ID.'" value="'.$slug.'"'.(empty($slug) ? ' class="missing-data"' : '').'></td>';
$output .= '<td><input type="text" name="keyword_'.$post->ID.'" value="'.$keyword.'"'.(empty($keyword) ? ' class="missing-data"' : '').'></td>';
$output .= '<td><span class="cantidad">'.$seoTitleLength.'</span><textarea name="seo_title_'.$post->ID.'"'.($isInvalidSeoTitle ? ' class="missing-data"' : '').'>'.$seo_title.'</textarea></td>';
$output .= '<td><span class="cantidad">'.$metaDescriptionLength.'</span><textarea name="meta_description_'.$post->ID.'"'.($isInvalidMetaDescription ? ' class="missing-data"' : '').'>'.$meta_description.'</textarea></td>';
$output .= '<td>'.($thumbnailmini ? '<img src="'.$thumbnailmini.'">' : '').'</td>';
$output .= '<td>'.($thumbnail ? $slug_image : '').'</td>';
$output .= '<td><input type="text" name="alt_image_'.$post->ID.'" value="'.$alt_image.'"'.(empty($alt_image) ? ' class="missing-data"' : '').'></td>';
$output .= '<td><input style="width:100%" type="submit" name="update_'.$post->ID.'" value="Actualizar"></td>';
$output .= '</tr></form>';
}
$output .= '</table>';
$output .= '<div class="paginationinfo">';
for ($i = 1; $i <= $total_pages; $i++) {
$output .= '<a href="?infoseo_page='.$i.'"'.($i == $current_page ? ' class="current"' : '').'>'.$i.'</a>';
}
$output .= '</div>';
return $output;
}
add_shortcode('infoseo_editable_rankmath', 'infoseo_implementar_rankmath_shortcode');
Shortcode Yoast SEO para CPT
- Edita título, URL, keyword, title, description y ALT de imagen destacada desde una tabla
- Compatible con múltiples tipos de contenido personalizado usando el parámetro cpt
- Muestra 50 posts por página con paginación automática y exclusión de la página actual
- Aplica estilos visuales para identificar datos faltantes o inválidos en la tabla
- Actualiza metadatos de Yoast SEO directamente al enviar el formulario




