/rootКодинг медитация→ Создаем плагин для WP OpenGraph Autoposting

,

19 февраля, 2025

Создаем плагин для WP OpenGraph Autoposting

По многочисленным просьбам решил обернуть решение для OpenGraph, которое я сделал вот тут в отдельный плагин для WordPress.

Плагин добавляет на страницу поста Open Graph теги, добавляет автопостинг постов в группу VK, а так же содержит инструмент для очистки кэша OG тегов в VK

Привожу тут полный говнокод код плагина, если будут вопросы и предложения пишите в телегу

Скачать можно тут

<?php
/*
Plugin Name: Open Graph Plugin
Description: Простой плагин для добавления OG тегов и авторепостинга постов
Version: 1.0
Author: kc
*/

function load_meta_og() {
    $og_meta = '';
    if ( is_page() || is_single() ) {
        $post = get_post(get_queried_object_id());
        $tags = get_tags_to_message($post->ID);
        if (!empty($text)) {
            $tags .= PHP_EOL.$text.PHP_EOL;
        }

        if (has_post_thumbnail($post->ID)) {
            $image = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'single-post-thumbnail' );
        }

        $text = $tags . preg_replace('/[\n\r]+/s', "\n\n", strip_tags($post->post_content));
        if (strlen($text) > 500) {
            $text = mb_substr($text, 0, 500) . '...';
        }
        $og_meta .= '<meta property="og:title" content="' . $post->post_title. '" />' . PHP_EOL;
        $og_meta .= '<meta property="og:description" content="' . $text . '" />' . PHP_EOL;
        $og_meta .= '<meta property="og:url" content="' . get_permalink($post->ID) . '" />' . PHP_EOL;
        $og_meta .= '<meta property="og:type" content="URL" />' . PHP_EOL;
        $og_meta .= '<meta property="og:site_name" content="' . get_bloginfo('name') . '" />' . PHP_EOL;
        $og_meta .= '<meta property="og:locale" content="' . get_bloginfo('language') . '" />' . PHP_EOL;
        if (isset($image[0])) {
            $og_meta .= '<meta property="og:image" content="' . $image[0] . '" />' . PHP_EOL;
        }
    }
    echo $og_meta;
}

function og_plugin_add_submenu_page() {
    add_submenu_page(
        'options-general.php',
        'Настройки автопостинга',
        'Open Graph Plugin',
        'manage_options',
        'my-plugin-settings',
        'og_plugin_settings_html'
    );
}

function og_plugin_clear_cache_link_vk($url, $token)
{
    $api_url = 'https://api.vk.com/method/utils.resolveScreenName';
    $params = [
        'screen_name' => $url,
        'access_token' => $token,
        'v' => '5.131'
    ];
    $response = file_get_contents($api_url . '?' . http_build_query($params));

    return json_decode($response, true);
}

function og_plugin_settings_html() {
    if (!current_user_can('manage_options')) {
        return;
    }

    if (isset($_POST['og_plugin_option_clear_cache_vk'])) {
        $response = og_plugin_clear_cache_link_vk(
            $_POST['og_plugin_clear_vk_link'],
            get_option('og_plugin_option_token_vk')
        );
        if (isset($response['error'])) {
            $message = sprintf('<div class="notice notice-error"><p>При обновлении кэша VK произошла ошибка %s</p></div>', $response['error']['error_msg']);
        } else {
            $message = '<div class="notice notice-success"><p>Кэш для ссылки обновлен успешно!</p></div>';
        }
        echo $message;
    }

    if (isset($_POST['og_plugin_option_vk'])) {
        update_option('og_plugin_option_token_vk', sanitize_text_field($_POST['og_plugin_option_token_vk']));
        update_option('og_plugin_option_token_user_vk', sanitize_text_field($_POST['og_plugin_option_token_user_vk']));
        update_option('og_plugin_option_group_vk', sanitize_text_field($_POST['og_plugin_option_group_vk']));
        echo '<div class="notice notice-success"><p>Настройки сохранены!</p></div>';
    }

    $og_plugin_option_token_vk = get_option('og_plugin_option_token_vk', get_option('og_plugin_option_token_user_vk'));
    $og_plugin_option_token_user_vk = get_option('og_plugin_option_token_user_vk', get_option('og_plugin_option_token_user_vk'));
    $og_plugin_option_group_vk = get_option('og_plugin_option_group_vk', get_option('og_plugin_option_group_vk'));

    ?>
    <div class="wrap">
        <h1>Настройки автопостинга</h1>
        <form method="post" action="">
            <input type="hidden" name="og_plugin_option_vk" value="1" />
            <?php wp_nonce_field('og_plugin_settings_action', 'og_plugin_nonce'); ?>
            <table class="form-table">
                <tr>
                    <th scope="row"><label for="og_plugin_option_token_vk">Токен VK</label></th>
                    <td>
                        <input name="og_plugin_option_token_vk" type="text" id="og_plugin_option_token_vk" value="<?php echo esc_attr($og_plugin_option_token_vk); ?>" class="regular-text">
                    </td>
                </tr>
                <tr>
                    <th scope="row"><label for="og_plugin_option_token_user_vk">Токен пользвателя VK</label></th>
                    <td>
                        <input name="og_plugin_option_token_user_vk" type="text" id="og_plugin_option_token_user_vk" value="<?php echo esc_attr($og_plugin_option_token_user_vk); ?>" class="regular-text">
                    </td>
                </tr>
                <tr>
                    <th scope="row"><label for="og_plugin_option_group_vk">Группа VK</label></th>
                    <td>
                        <input name="og_plugin_option_group_vk" type="text" id="og_plugin_option_group_vk" value="<?php echo esc_attr($og_plugin_option_group_vk); ?>" class="regular-text">
                    </td>
                </tr>
            </table>
            <?php submit_button('Сохранить'); ?>
        </form>
    </div>
    <div>
        <h2>Очистка OG кэша в VK</h2>
        <form method="post" action="">
            <input type="hidden" name="og_plugin_option_clear_cache_vk" value="1" />
            <?php wp_nonce_field('og_plugin_settings_action', 'og_plugin_nonce'); ?>
            <table class="form-table">
                <tr>
                    <th scope="row"><label for="og_plugin_clear_vk_link">Ссылка</label></th>
                    <td>
                        <input name="og_plugin_clear_vk_link" type="text" id="og_plugin_clear_vk_link" value="" class="regular-text">
                        <p class="description">Ссылка, VK кэш для которой нужно очистить</p>
                    </td>
                </tr>
            </table>
            <?php submit_button('Очистить'); ?>
        </form>
    </div>
    <?php
}

function send_post_vk($post_id)
{
    $post = get_post($post_id);
    $text = get_tags_to_message($post->ID);
    if (!empty($text)) {
        $text = PHP_EOL.$text.PHP_EOL;
    }
    $text .= preg_replace('/[\n\r]+/s', "\n\n", strip_tags($post->post_content));
    $text = strip_tags($text);
    if (strlen($text) > 500) {
        $text = mb_substr($text, 0, 500) . '...';
    }
    $text .= PHP_EOL.get_permalink($post->ID).PHP_EOL;
    $data = [
        'message' => $text,
        'link' => get_permalink($post->ID)
    ];
    $url = 'https://api.vk.com/method/wall.post';
    $params = [
        'owner_id' => get_option('og_plugin_option_group_vk'),
        'message' => $data['message'],
        'attachments' =>  $data['link'],
        'access_token' => get_option('og_plugin_option_token_vk'),
        'from_group' => 1,
        'v' => '5.131'
    ];
    curl_sender_exec($url, $params);
}

// Добавляет на страницу OG теги
add_action( 'wp_head', 'load_meta_og' );

// Добавляет подпункт меню в настройки WP
add_action('admin_menu', 'og_plugin_add_submenu_page');

// Автопост записи в группу VK при публикации записи
add_action('auto-draft_to_publish', 'send_post_vk', 20, 1);
add_action('future_to_publish', 'send_post_vk', 20, 1);
add_action('draft_to_publish', 'send_post_vk', 20, 1);

Так же может быть интересно:

Автопубликация постов WordPress в Telegram
Создаем систему для партнерских программ в WordPress
Обход защиты сайтов от парсинга данных или anti-anti-scraping
Поднимаем локально докер для Wordpress