web-dev-qa-db-fra.com

Exclure les publications privées/protégées via IP

Je souhaite essentiellement que les mots de passe/pages privées/publications protégés dans WP fonctionnent comme ils le font actuellement, mais que les fonctionnalités de certaines adresses IP sont totalement ignorées.

J'ai examiné les filtres/actions et je ne vois rien qui semble prometteur. Encore une fois, je préférerais le faire sans créer une catégorie spécifique ou quoi que ce soit en dehors de la fonctionnalité actuelle de cette application dans wordpress.

Merci!

1
user652650

Contourner les messages protégés par mot de passe

Malheureusement, vous avez raison sur le manque de filtres, et le piratage du noyau est inévitable. Une solution qui semble fonctionner concerne la fonction sanitize_post_field() qui déclenche plusieurs filtres intéressants si son argument $context n'est pas défini sur raw.

La fonction de modèle chargée de décider si le champ de mot de passe ou le contenu doit être affiché est http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes /post-template.php#L556

Remarquez comme il serait agréable d’annuler le post_password? Creusons dedans ...

Découvrez comment la publication est acquise via la fonction get_post(): http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/post.php#L370

La fonction ne contient pas de filtres ni d’actions à connecter, mais sanitize_post_field() contient des filtres pouvant être connectés, et post_password exécute cette fonction.

Veuillez vous référer à la fonction http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/post.php#L1676

Notez cependant que si $context == 'raw';, la fonction revient et qu'aucun des filtres n'est activé. Il faut donc un peu de base pour que le flux du code atteigne ces filtres.

// wp-includes/post.php, line 557
-- $post = get_post($post);
++ $post = get_post($post, null, 'display');

Forcera le $context à être autre chose que raw. Cela permettra de faire quelque chose dans le sens suivant:

function wpse31407_bypass_password( $value, $post_id, $context ) {
    $allowed_ips = array( '127.0.0.1', '255.255.255.255', ... );
    if (in_array( $_SERVER['REMOTE_ADDR'], $allowed_ips )) return '';
    else return $value;
}
add_filter( 'post_password', 'wpse31407_bypass_password', null, 3 );

Cela supprimera effectivement le mot de passe, donc le test http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/post-template.php#L556if ( empty($post->post_password) ) est évalué à true, ce qui vous permet de contourner le mot de passe. Obtenir le message avec un contexte display ne devrait avoir aucune implication, car il est utilisé uniquement pour la récupération du post_password.

Vous pouvez également créer votre propre filtre dans le noyau autour de la fonction post_password_required() mentionnée ci-dessus, pour ne pas trop compliquer les choses, peut-être. Dépend de vous.

Contourner les messages privés

Maintenant, comme pour les publications privées, reportez-vous à ce bit ou query.php http://core.trac.wordpress.org/browser/ tags/3.2.1/wp-includes/query.php # L2649 car c’est là que la publication trouvée est débarrassée des entrées privées.

Et vous seriez tenté de vous connecter à la http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/query.php#L2625posts_results filtre et modifiez le post_status pour chaque article de private à public... cependant, comme vous avez peut-être vu la fonction get_post_status() fonctionner sur sa propre copie d'un message qu'elle reçoit de get_post(). .. .. qui n'a encore aucun filtre, mais sanitize_post_field(), ce qui nécessite encore un $context de tout sauf raw. Donc encore:

// wp-includes/post.php, line 563
-- $post = get_post($post);
++ $post = get_post($post, null, 'display');

Et branchez-vous dans un filtre pour faire croire à la fonction que la publication est publiée:

function wpse31407_bypass_private( $value, $post_id, $context ) {
    $allowed_ips = array( '127.0.0.1', '255.255.255.255', ... );
    if (in_array( $_SERVER['REMOTE_ADDR'], $allowed_ips )) return 'publish';
    else return $value;
}
add_filter( 'post_status', 'wpse31407_bypass_private', null, 3 );

Ou enroulez votre propre filtre autour de la fonction get_post_status().

Conclusion

Une fois que vous avez compris quelles parties du noyau sont responsables du blocage des publications, vous pouvez essayer de les modifier comme vous le souhaitez. J'espère donc que ma longue réponse vous aidera dans une certaine mesure, et que quelqu'un donnera plus de conseils et peut-être de meilleures solutions. Excellente question, m'a permis de creuser et de réfléchir.

0
soulseekah

Vous n'avez pas besoin de changer de noyau, il vous suffit d'ajouter une action à pre_get_posts et de vérifier:

add_action( 'pre_get_posts', 'filter_anime_tax' );
function filter_anime_tax( $query ) {
    $ip = getUserIP();
    $ip_data = geoip_record_by_name( $ip );
    if( $ip_data['country_code'] != 'anything you want' ) { 
        $query->set( 'post_status', array( 'publish', 'private' ) );
    }
}

Vous pouvez afficher ou masquer des publications privées dans des pays ou des IP spécifiques.

0
user1489083