J'essaie de mettre à jour le champ lorsque le statut de la publication passe à publié. Il obtient les valeurs correctement mais ne se met pas à jour lorsque je vérifie le champ de mise à jour renvoyé.
Il montre un certain nombre.
S'il vous plaît, aidez-moi pas si je devrais utiliser ceci avec transition_post_status
Mise à jour - J'ai essayé ci-dessous les crochets // l'action est déclenchée mais les champs ne sont pas mis à jour
1. publish // fonctionne mais aucune mise à jour n'est en cours
2. save_post && save_post_l // fonctionne mais aucune mise à jour n'est en cours.
add_action('transition_post_status', 'updated_to_publish', 10, 3);
function updated_to_publish($new_status, $old_status, $post)
{
if ($new_status == 'publish')) // I have removed the check for post type
{
$post_id = $post->ID;
if (get_field('advanced_option_edit_seo', $post_id)) {
if (defined('WPSEO_VERSION')) {
$metatitle = get_field('seo_title', $post_id);
$metadesc = get_field('seo_meta_description', $post_id);
$metakeywords = get_field('seo_keyword', $post_id);
update_post_meta($post_id, '_yoast_wpseo_title', $metatitle );
update_post_meta($post_id, '_yoast_wpseo_metadesc', $metadesc );
update_post_meta($post_id, '_yoast_wpseo_focuskw', $metakeywords);
}
}
} else {
return;
}
}
J'ai pu résoudre le problème en utilisant l'action 'wp_insert_post
'. Puis-je savoir pourquoi d'autres actions ont échoué mais "wp_insert_post
" a fonctionné?
code que j'ai utilisé pour tester
add_action('transition_post_status', 'updated_to_publish', 10, 3);
function updated_to_publish($new_status, $old_status, $post)
{
if (($new_status == 'publish') && ($post->post_type == 'l')) {
$post_id = $post->ID;
error_log( var_export( $post_id, 1 ) );
if (get_field('advanced_option_edit_seo', $post_id)) {
if (defined('WPSEO_VERSION')) {
// ACF field
$metatitle = get_field('seo_title', $post_id);
error_log( var_export( $metatitle, 1 ) );
$metadesc = get_field('seo_meta_description', $post_id);
error_log( var_export( $metadesc, 1 ) );
$metakeywords = get_field('seo_keyword', $post_id);
error_log( var_export( $metakeywords, 1 ) );
//plugin is activated
//old values
$metadesc_old = get_post_meta($post->ID, '_yoast_wpseo_metadesc', true);
error_log( var_export( $metadesc_old, 1 ) );
$metatitle_old = get_post_meta($post->ID, '_yoast_wpseo_title', true);
error_log( var_export( $metatitle_old, 1 ) );
$metakeywords_old = get_post_meta($post->ID, '_yoast_wpseo_focuskw', true);
error_log( var_export( $metakeywords_old, 1 ) );
update_post_meta($post_id, '_yoast_wpseo_title', $metatitle, $metatitle_old);
error_log( var_export( $tyone, 1 ) );
update_post_meta($post_id, '_yoast_wpseo_metadesc', $metadesc, $metadesc_old);
error_log( var_export( $tytwo, 1 ) );
update_post_meta($post_id, '_yoast_wpseo_focuskw', $metakeywords, $metakeywords_old);
error_log( var_export( $tythree, 1 ) );
}
}
} else {
return;
}
//Do something
}
J'ai donc installé le plugin Yoast SEO et testé votre code. Je peux maintenant dire positivement "ni non, ni oui, mais vous pourriez} [" à cette question:
S'il vous plaît, aidez-moi pas si je devrais utiliser ceci avec
transition_post_status
transition_post_status
est déclenché avant l'action wp_insert_post
est déclenchée et le plug-in Yoast SEO enregistre (ajoute/met à jour) tous ses champs personnalisés via l'action wp_insert_post
:
// See WPSEO_Metabox::save_postdata() (in wordpress-seo/admin/metabox/class-metabox.php)
add_action( 'wp_insert_post', array( $this, 'save_postdata' ) );
Donc, votre code lui-même fonctionne et les champs sont mis à jour (si les valeurs nouvelles et actuelles ne sont pas identiques et que toutes les conditions if
sont remplies, bien sûr); Cependant, le plug-in Yoast SEO remplace la valeur via la fonction WPSEO_Metabox::save_postdata()
, ce qui devrait répondre à cette question:
J'ai pu résoudre le problème en utilisant l'action '
wp_insert_post
'. Puis-je savoir pourquoi d'autres actions ont échoué mais "wp_insert_post
" a fonctionné?
Pourquoi ai-je dit ni non ni oui, mais vous pourriez le faire?
Parce que vous pouvez utiliser transition_post_status
avec wp_insert_post
comme suit:
add_action( 'transition_post_status', 'do_updated_to_publish', 10, 2 );
function do_updated_to_publish( $new_status, $old_status ) {
if ( $new_status !== $old_status && 'publish' === $new_status ) {
add_action( 'wp_insert_post', 'updated_to_publish', 10, 2 );
}
}
function updated_to_publish( $post_id, $post ) {
// Remove it; it will be re-added via the do_updated_to_publish() function,
// if necessary or when applicable.
remove_action( 'wp_insert_post', 'updated_to_publish', 10, 2 );
if ( ! defined( 'WPSEO_VERSION' ) || 'l' !== $post->post_type ) {
return;
}
if ( get_field( 'advanced_option_edit_seo', $post_id ) ) {
// Make your update_post_meta() calls here.
update_post_meta( $post_id, '_yoast_wpseo_focuskw', 'test' );
error_log( 'focuskw updated for post #' . $post_id );
}
}
Essayé et testé de travailler avec Yoast SEO version 9.1.
Votre fonction d'origine repose sur $ _POST ['post_type'] défini sur la valeur appropriée. En règle générale, vous devriez éviter d'utiliser des variables globales - si vous voulez uniquement que la fonction vous donne, vous n'avez pas à penser aux contextes dans lesquels elle devrait être appelée.
Dans ce cas, c'est ce qui s'est passé. Votre fonction repose sur une variable globale $ _POST ['post_type'], et bien que cela fonctionne dans un 'état' (publication d'un article), il ne l'est pas dans un autre (travail cron, mise à jour d'un article). En bref, $ _POST ['post_type'] n'est pas toujours ce que vous pensez qu'il devrait être.
Les éléments suivants récupèrent le type de publication à partir de la variable $ post transmise:
add_action('transition_post_status', 'updated_to_publish', 10, 3);
function updated_to_publish ($ new_status, $ old_status, $ post) {
if (($new_status == 'publish') && (get_post_type( $post ) == 'l')) {
$post_id = $post->ID;
if (get_field('advanced_option_edit_seo', $post_id)) {
if (defined('WPSEO_VERSION')) {
//Code goes here
}
}
} else {
return;
}
}
Visitez ce lien d'où je viens de copier la réponse
essayez "wpseo_title" Filtre pour mettre à jour wpseo_title.
add_filter('wpseo_title', 'filter_product_wpseo_title');
function filter_product_wpseo_title($title) {
global $post;
$post_id = $post->ID;
if (get_field('advanced_option_edit_seo', $post_id)) {
if (defined('WPSEO_VERSION')) {
$title = get_field('seo_title', $post_id);
}
}
return $title;
}
pour plus d'informations sur la mise à jour des données de référencement: https://yoast.com/wordpress/plugins/seo/api/