Actualiza el SEO desde una tabla usando este shorcode para Yoast SEO y Rank Math

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:

info seo yoast

Uso del shortcode para Rank Math:

info seo rank math

 

Captura de pantalla 2023 07 21 a las 15.06.42

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');

 

¡Más Snippets, Más Opciones!

Al compartir, motivamos a más desarrolladores a contribuir. Ayúdanos a hacer de este directorio un punto de referencia en snippets.

Facebook
Twitter
LinkedIn
Telegram
WhatsApp

¿Cómo implementar este snippet en la web?

Tienes 2 opciones, una de ellas es mediante plugin y la otra pegando el código en tu web.

1. Añadir snippet con plugin

code-snippets

Code Snippets

Por Code Snippets Pro

  1. Descarga el plugin o búscalo en el repositorio de plugins de Wordpress e instálalo en tu web.
  2. En el menú lateral del Escritorio verás un nuevo enlace (Fragmetos de código). Ves a Fragmentos de código > Añadir nuevo.
  3. Se abrirá una página con un título, bloque de código, descripción y etiquetas, rellena el título con el que quieras guardarlo, ejemplo: Añadir Google Analytics.
  4. En la parte código verás que está activo PHP, ahí pega el código del snippet
  5. La descripción y las etiquetas solo son para tu información y para que luego encuentres más fácil los snippets.
  6. Publicar y activar el snippet.

2. Añadir snippet en el functions.php

Diseño web con WordPress

Accede al archivo functions.php de tu tema o tema hijo, pega el snippet y guarda el archivo.

Lo encontrarás en Apariencia > Editor de archivos de tema, pinchas sobre el enlace  functions.php y pegas el código al final del archivo.

Relacionados: