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. Te recomiendo usar el shorcode en una página privada para que nadie pueda editar tu contenido.
Puedes usar varios CPT añadiendo en el shorcode el tipo de cpt.
Uso del shortcode para YOAST:
Uso del shortcode para Rank Math:
Shortcode para 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; $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] )); 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>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); $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) : ''; $slug = str_replace(home_url(), '', get_permalink($post->ID)); $isInvalidRow = false; if(empty($title) || 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.'"><p><small>'.$slug.'</small></p><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="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 .= $thumbnail ? '<td><img src="' . $thumbnail . '" style="width:50px;height:auto;" /></td>' : '<td></td>'; $output .= '<td>' . $slug_image . '</td>'; $output .= $thumbnail ? '<td><input type="text" name="alt_image_'.$post->ID.'" value="'.$alt_image.'"></td>' : '<td></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');
Shortcode para 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] )); 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>H1</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>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)); $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, 'medium') : ''; $slug_image = $thumbnail ? basename($thumbnail) : ''; $alt_image = $thumbnail ? get_post_meta($thumbnail_id, '_wp_attachment_image_alt', true) : ''; $isInvalidRow = false; if(empty($title) || 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</a></span> <span class="ver"><a href="'. get_edit_post_link($post->ID) .'" target="_blank">Editar</a></span><br><small>'.$slug.'</small></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 style="height:90px" src="'.$thumbnailmini.'">' : '').'<br>'.($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');