web-dev-qa-db-fra.com

WP nonce non valide

Avoir un script rapide pour rechercher des pages non traduites, puis renvoyer un lien de traduction. (Polylang crée un nouveau message pour une traduction, qui est ensuite lié à l'original.)

Tout fonctionne bien, sauf le nonce:

$url = admin_url('post-new.php?post_type=product&from_post=' . $ID . '&new_lang=' . $lang);

$nonce_url = wp_nonce_url($url);

Renvoie une URL magnifiquement formatée, avec un nonce non valide:

https://yaddayadda.com/wp-admin/post-new.php?post_type=product&from_post=2851&new_lang=nl&_wpnonce=fb63ac7002

Le lien dans le panneau d'administration se lit exactement de la même manière, mais avec un nonce fonctionnel:

https://yaddayadda.com/wp-admin/post-new.php?post_type=product&from_post=2851&new_lang=nl&_wpnonce=c17b1a3a2a

J'aime penser que je vais bien avec WP, mais cela me brise la tête. Quelqu'un at-il une idée de pourquoi il génère des liens invalides?

Code complet:

require_once('../../../wp-load.php');

$lang = $_POST['lang'];
if ($lang == 'nl') { $language = 'Dutch';}
elseif ($lang == 'pt') { $language = 'Portuguese';}
else { $language = 'Something is going awry, I dont know ' . $lang;}

echo '<h2>Missing ' . $language . ' translations</h2>';
// An array of all published WC_Product Objects
$products = wc_get_products( array( 'status' => 'publish', 'limit' => -1,'lang' => 'en', ) );

// Displaying the number of products in this array
echo '<p>Total number of products published: ' . sizeof( $products ) . '</p>';

// Loop through products and save some data using WC_Product and stuff in array
$tobearray = [];
$count = 0;
foreach ( $products as $product ){
    $ID = $product->get_id();
    $title = $product->get_title();

    if (!pll_get_post($ID, $lang)) {

                  $url = admin_url('post-new.php?post_type=product&from_post=' . $ID . '&new_lang=' . $lang);

                  $nonce_url = wp_nonce_url($url);
                      //wp_nonce_url( $url);  // Adding our nonce to the url with a unique id made from the expiry timestamp

        $addpostlink = '<a href="' . wp_nonce_url('/wp-admin/post-new.php?post_type=product&from_post=' . $ID . '&new_lang=' . $lang) . '" target="_blank"> click here</a>';


        $tobearray[] = ['ID' => $ID, 'Title' => $title, 'Link' => $addpostlink ];
        $count++;
        }
}
echo '<p>Number of Products that are missing their ' . $lang . ' translation: ' . $count . '</p>';
echo 'Posts that need a ' . $language . ' translation: ';

?>
<p>
    Click on the link in the table below to create a new translation.  After the link opens (its a bit slow, pls wait), just open the original English product to copy and paste the title and description so you can translate them.
</p>
<table border="1">
<tr><th>ID</th><th>Title</th><th>Link</th></tr> 
<?php foreach($tobearray as $row) {
  echo('<tr>');
  echo('<td>');
  echo(implode('</td><td>', $row));
  echo('</td>');
  echo('</tr>');
} ?>
</table>
1
user2642724

J'ai découvert quel était le problème. Le plugin Polylang vérifie les nonces, vous devez donc lui passer l'argument 'new-post-translation'.

La solution est: wp_nonce_url ($ link, 'new-post-translation');

cela pourrait aider quelqu'un, mais peut-être pas;)

1
user2642724