J'essaie d'obtenir l'ID du message que je suis en train de modifier dans functions.php dans le but de réécrire dynamiquement un slug de type d'article personnalisé.
C'est ce avec quoi je travaille jusqu'à présent. p >
function change_post_type_slug( $args, $post_type ) { if ( 'lead_page' == $post_type ) { $post_id = $_GET['post']; $location = get_field('leadpage_location', $post_id); $args['rewrite']['slug'] = $location->post_name; } return $args; } add_filter( 'register_post_type_args', 'change_post_type_slug', 10, 2 );
Je ne suis pas sûr si le hook register_post_type_args
se déclenche avant que je puisse obtenir l'ID, ou si c'est même la meilleure façon de procéder J'essaye d'accomplir. Je ne trouve pas grand-chose sur le sujet.
J'ai pu le faire fonctionner avec les éléments suivants:
function change_post_type_slug( $args, $post_type ) { if ( 'custom_post' == $post_type ) { global $post; $location = get_field('custom_field', $post->ID); $args['rewrite']['slug'] = $location; } return $args; } add_filter( 'register_post_type_args', 'change_post_type_slug', 10, 2 );
Cependant, cela a abouti à un remarque sur le front-end:
Remarque: index non défini: post dans /chemin/to/wordpress/functions.php à la ligne 623
La ligne 623 est $ post_id = $ _GET ['post'] ;
3 Réponses :
Essayez ceci: p> function change_post_types_slug( $args, $post_type ) {
if ( 'your-custom_post' === $post_type ) {
// Check and get the custom post ID
$id = isset($_GET[ 'post' ]) ? $_GET[ 'post' ] : '' ;
// $location = get_field('leadpage_location', $id);
$args['rewrite']['slug'] = 'new-slug-here';
}
return $args;
}
add_filter( 'register_post_type_args', 'change_post_types_slug', 10, 2 );
admin_head est une action et non un filtre à utiliser: add_action ('admin_head', 'change_post_type_slug') ;. Cependant, ce n'est pas la bonne façon de procéder, vous devez utiliser le hook updated_postmeta.
désolé mon mauvais register_post_type_args
est le bon crochet pour cela. J'ai mis à jour la réponse et l'ai testée et cela semble fonctionner mais je n'ai pas pu tester get_field
car je n'ai pas ACF.
Cela fonctionne (en quelque sorte) et c'est exactement ce que j'ai dans la deuxième boîte, et je reçois cet avis que j'ai mentionné ci-dessus sur chaque page qui n'est pas le type de poste (lors de la modification).
Je n'ai pas cet avis? Je suis en mode débogage btw. quelle version wp utilisez-vous? J'utilise la v5.1.
Aussi 5.1 - Je reçois l'avis avec le débogage activé et en affichant n'importe quelle page sur le frontend.
Remarque: Index non défini: post dans /var/www/html/path/to/wordpress/functions.php sur la ligne 612
La ligne 612 étant $ id = $ _GET ['post'];
Hmm, essayez de vérifier s'il existe un identifiant de publication. $ id = isset ($ _ GET ['post'])? $ _GET ['post']: '';
Cela prend en charge cet avis :) Cependant, lorsque je passe d'un slug statique à un slug dynamique avec ACF, cela donne maintenant une nouvelle erreur.
Plus facile à utiliser pastebin à ce stade: pastebin.com/ivWi1d1g En dehors de cet avis, cela fonctionne très bien.
Attendre. get_field
renvoie true
ou false
Je suppose que the_field
est ce dont vous avez besoin.
get_field ()
renvoie une valeur. Le champ "leadpage_location" est défini sur un objet de publication. advancedcustomfields.com/resources/get_field
Je vois .. vérifiez Utiliser des instructions conditionnelles ici : get_field renvoie faux si (valeur == “” || valeur == null || valeur == faux). voir également ici
Donc, la raison pour laquelle il donne le nouvel avis est que si vous n'éditez pas ce type de publication, alors $ id ne devient rien, et j'utilise $ id pour appeler le champ.
Oui, je suppose que le paramètre $ post_id
est (facultatif) et s'il n'est pas présent, la valeur par défaut renverra le message actuel que vous éditez.
C'est vrai - mais comme tout cela est déclaré dans le fichier functions.php - il ne saurait à quel article référencer. Je repense honnêtement si cela va être possible. Je pourrais essayer de trouver un autre moyen. J'apprécie ton aide.
Vous devez utiliser le hook updated_postmeta
pour ceci, car il est exécuté chaque fois que vous mettez à jour vos champs personnalisés.
Ensuite, vous pouvez mettre à jour vos données de publication avec Fonction wp_update_post ()
.
add_action( 'updated_postmeta', function( $meta_id, $object_id, $meta_key, $meta_value ) { if ( 'location' === $meta_key ) { wp_update_post([ 'ID' => $object_id, 'post_name' => $meta_value, ]); } }, 10, 4 );
Je ne pense pas que vous puissiez réécrire un slug de type de publication personnalisé avec wp_update_post ()
Oui, je ne parviens pas à le faire fonctionner. Par slug, je fais référence à domain.com/SLUG/pagetitle. Les types de publication personnalisés de Wordpress utilisent le type de publication comme slug par défaut, sauf indication contraire lors de l'enregistrement du type de publication.
Essayez ceci:
function change_post_type_slug( $args, $post_type ) { if ( 'lead_page' === $post_type && is_admin() && $_GET['action'] === 'edit' ) { $post_id = $_GET['post']; $location = get_field('leadpage_location', $post_id); $args['rewrite']['slug'] = $location->post_name; } return $args; } add_filter( 'register_post_type_args', 'change_post_type_slug', 10, 2 );
Il ajoute deux conditions supplémentaires, pour vérifier si vous êtes sur l'écran d'administration et pour vérifier qu'il existe un paramètre GET
sur edit
. Il est probablement exagéré de faire aussi is_admin ()
, mais maintenant vous êtes super sûr.
Essayez ceci pour votre instruction
if
:if ('lead_page' === $ post_type && is_admin ())
Cela garantira qu'il ne se déclenche que du côté de l'administrateur et non du l'extrémité avant. Vous pouvez également l'associer pour savoir si vous êtes sur l'écran d'édition actuel: wordpress.stackexchange.com/questions/125692/...C'est un excellent ajout.
Si cela fonctionne, faites-le moi savoir et je le mettrai comme réponse
Malheureusement, il affiche toujours l'avis dans l'administrateur lorsqu'il ne modifie pas ce type de publication particulier.
oui, vous devrez le combiner avec le lien que j'ai ajouté.