Faire fonctionner un plugin WordPress après un événement spécifique (par exemple lorsqu'un brouillon d'article est créé)
P粉265724930
P粉265724930 2024-01-10 18:11:14
0
1
528

J'ai créé un plugin WordPress (avec l'aide de ChatGPT) qui réécrit les titres des articles dans les brouillons pour répondre à mes critères requis entre 36 et 38 caractères. Actuellement, cela se fait en cliquant sur le bouton de remplissage automatique, qui permet ensuite à ChatGPT de réécrire le brouillon de titre actuel, puis de vérifier la réponse pour voir sa longueur, et si elle ne respecte pas la limite de 36 à 38 caractères, le processus est répété jusqu'à ce qu'il soit terminé. Modifiez ensuite le titre et publiez le message.

Cela fonctionne bien, cependant, j'essaie de le rendre plus automatisé, donc au lieu de devoir me connecter à WordPress et cliquer sur un bouton pour démarrer le processus de réécriture, j'aimerais que cela se produise dès qu'un nouveau brouillon est enregistré et le processus démarre alors automatiquement. Peu importe ce que j’essaie, je n’y parviens pas, est-ce que quelqu’un sait comment y parvenir ? Ci-dessous le code qui fonctionne lorsque j'appuie manuellement sur le bouton

<?php
/*
Plugin Name: ChatGPT Dashboard
*/

// Add a custom menu item to the WordPress dashboard
function chatgpt_dashboard_menu() {
  add_menu_page(
    'ChatGPT Dashboard',
    'ChatGPT',
    'manage_options',
    'chatgpt-dashboard',
    'chatgpt_dashboard_page',
    'dashicons-format-chat', // You can change the icon here
    20
  );
}
add_action('admin_menu', 'chatgpt_dashboard_menu');

// Enqueue jQuery UI library
function chatgpt_enqueue_scripts() {
  wp_enqueue_script('jquery-ui-core');
  wp_enqueue_script('jquery-ui-draggable');
}
add_action('admin_enqueue_scripts', 'chatgpt_enqueue_scripts');

// Register plugin settings
function chatgpt_register_settings() {
  register_setting('chatgpt_options', 'chatgpt_api_key');
}
add_action('admin_init', 'chatgpt_register_settings');

// Callback function to display the ChatGPT dashboard page
function chatgpt_dashboard_page() {
  ?>
  <div class="wrap">
    <h1>ChatGPT Dashboard</h1>

    <!-- API Key settings form -->
    <form method="post" action="options.php">
      <?php settings_fields('chatgpt_options'); ?>
      <?php do_settings_sections('chatgpt_options'); ?>
      <table class="form-table">
        <tr valign="top">
          <th scope="row">API Key</th>
          <td><input type="text" name="chatgpt_api_key" value="<?php echo esc_attr(get_option('chatgpt_api_key')); ?>" /></td>
        </tr>
      </table>
      <?php submit_button(); ?>
    </form>

    <!-- Chat interface -->
    <div id="chat-container">
      <div id="chat-log"></div>
      <input type="text" id="user-input" placeholder="Type your message..." />
      <button id="submit-button">Send</button>
      <button id="autofill-button">Autofill</button>
    </div>
  </div>

  <script>
    (function ($) {
      $(document).ready(function () {
        // Function to handle user input and generate ChatGPT responses
        function handleUserInput() {
          var userInput = $('#user-input').val();

          // Get the API key from the WordPress options database
          var apiKey = '<?php echo get_option("chatgpt_api_key"); ?>';

          // Make sure the API key is provided
          if (!apiKey) {
            alert('Please enter an API key in the ChatGPT dashboard settings.');
            return;
          }

          // Make an API call to ChatGPT to get a response
          function callChatGPT() {
            $.ajax({
              url: 'https://api.openai.com/v1/chat/completions',
              type: 'POST',
              beforeSend: function (xhr) {
                xhr.setRequestHeader('Authorization', 'Bearer ' + apiKey);
                xhr.setRequestHeader('Content-Type', 'application/json');
              },
              data: JSON.stringify({
                model: 'gpt-3.5-turbo',
                messages: [
                  { role: 'system', content: 'You are a user' },
                  { role: 'user', content: userInput },
                ],
              }),
              success: function (response) {
                var chatLog = $('#chat-log');

                if (!response.choices || !response.choices.length) {
                  chatLog.append('<p><strong>Error:</strong> No response received</p>');
                  return;
                }

                var botResponse = response.choices[0].message.content;

                // Check if botResponse is an array
                if (Array.isArray(botResponse)) {
                  botResponse = botResponse.map(msg => msg.content).join('');
                }

                // Count the number of characters in the bot response
                var characterCount = botResponse.length;

                // Display the user input, bot response, and character count in the chat log
                chatLog.append('<p><strong>You:</strong> ' + userInput + '</p>');
                chatLog.append('<p><strong>Bot:</strong> ' + botResponse + '</p>');
                chatLog.append('<p><strong>Character count:</strong> ' + characterCount + '</p>');

                // Clear the user input field
                $('#user-input').val('');

                // Scroll to the bottom of the chat log
                chatLog.scrollTop(chatLog.prop('scrollHeight'));

                // Check if the character count is within the desired range (36, 37, or 38)
                if (characterCount >= 36 && characterCount <= 38) {
                  // Print the new title 5 times in a row
                  for (let i = 0; i < 5; i++) {
                    chatLog.append('<p><strong>New Title:</strong> ' + botResponse + '</p>');
                  }
                  
                 // Create a new post with the new title and set it as a draft
$.ajax({
  url: '<?php echo admin_url("admin-ajax.php"); ?>',
  type: 'POST',
  data: {
    action: 'create_draft_post',
    title: botResponse,
  },
  success: function (response) {
    console.log('Draft post updated:', response);
    chatLog.append('<p><strong>New Title:</strong> ' + botResponse + '</p>');
  },
  error: function (xhr, status, error) {
    console.error(error); // Log any errors to the browser console
  },
});

                  return; // Exit the function if the condition is met
                }

                // Repeat the question until the character count is within the desired range
                callChatGPT();
              },
              error: function (xhr, status, error) {
                var chatLog = $('#chat-log');
                chatLog.append('<p><strong>Error:</strong> ' + error + '</p>');
                console.error(error); // Log any errors to the browser console
              },
            });
          }

          callChatGPT(); // Initial call to ChatGPT
        }

        // Handle user input when the submit button is clicked
        $('#submit-button').on('click', function (e) {
          e.preventDefault();
          handleUserInput();
        });

        // Handle user input when the enter key is pressed
        $('#user-input').on('keydown', function (e) {
          if (e.keyCode === 13) {
            e.preventDefault();
            handleUserInput();
          }
        });
// Handle autofill button click
$('#autofill-button').on('click', function (e) {
  e.preventDefault();

  // Get the draft posts
  $.ajax({
    url: '<?php echo admin_url("admin-ajax.php"); ?>',
    type: 'POST',
    data: {
      action: 'get_draft_posts',
    },
    success: function (response) {
      if (response && response.length) {
        var draftTitle = response[0].post_title;
        var autofillText = 'Summarize "' + draftTitle + '" to 38 characters';
        $('#user-input').val(autofillText);
        
        // Automatically start the process of generating the response
        handleUserInput();
      }
    },
    error: function (xhr, status, error) {
      console.error(error); // Log any errors to the browser console
    },
  });
});
      });
    })(jQuery);
  </script>
  <?php
}

// AJAX handler to retrieve draft posts
function chatgpt_get_draft_posts() {
  $draftPosts = get_posts(array(
    'post_status' => 'draft',
    'numberposts' => 1,
  ));
  wp_send_json($draftPosts);
}
add_action('wp_ajax_get_draft_posts', 'chatgpt_get_draft_posts');
add_action('wp_ajax_nopriv_get_draft_posts', 'chatgpt_get_draft_posts');

// AJAX handler to update the existing draft post with the new title and publish it
function chatgpt_create_draft_post() {
  $title = $_POST['title'];

  $draftPosts = get_posts(array(
    'post_status' => 'draft',
    'numberposts' => 1,
  ));

  if (empty($draftPosts)) {
    wp_send_json_error('No draft post found.');
    return;
  }

  $draftPost = $draftPosts[0];
  $draftPostID = $draftPost->ID;

  // Update the title of the draft post
  wp_update_post(array(
    'ID'         => $draftPostID,
    'post_title' => $title,
    'post_status' => 'publish',
  ));

  wp_send_json_success($draftPostID);
}
add_action('wp_ajax_create_draft_post', 'chatgpt_create_draft_post');
add_action('wp_ajax_nopriv_create_draft_post', 'chatgpt_create_draft_post');

Merci d'avance pour toute aide/conseil

J'ai essayé de créer un hook et une tâche cron mais mes connaissances limitées en php n'ont pas pu y parvenir

P粉265724930
P粉265724930

répondre à tous(1)
P粉613735289

En supposant que vous sachiez déjà comment utiliser et implémenter correctement les hooks dans WordPress, je vous recommande d'utiliser le hook « save_post ». Voici ce que je fais :

// Register the hook
add_action('save_post', 'your_function');

// Whatever function you need to be executed
function your_function($post_id) {
    // Check if the post is a draft
    if (get_post_status($post_id) === 'draft') {
       
    }
}

Référence : https://developer.wordpress.org/reference/hooks/save_post/

La prochaine fois, si vous souhaitez que davantage de personnes soient disposées à vous lire et à vous aider, essayez de raccourcir le code et de le commenter

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal