Op mijn site wordt een verlanglijst getoond op een masonry manier. Dat ziet er goed uit.
Het probleem is echter dat wanneer ik een product van het verlanglijstje wil verwijderen een error wordt geproduceerd dat dit niet kan.

Het lukt wel als de masonry is uitgeschakeld. Ik heb inmiddels een aantal dingen uitgevonden maar nog geen oplossing.

Ik heb gepost op Stackoverflow en op Wordpress.org. Hier is een uitgebreide beschrijving van het probleem. Ik krijg echter weinig tot geen reactie.

Ik had de volgend oplossing bedacht:

Maak een functie die het volgende doet:
- Unload de Masonry scripts (hier heb ik al een functie voor)
- Herlaad de pagina
- Verwijder het item
- Herlaad de pagina
- Schakel de Masonry scripts weer in (hier heb ik al een functie voor)

Roep deze functie aan in een link.

De code die verantwoordelijk lijkt te zijn is volgens mij dit:
<?php
<?php if( $is_user_owner ): ?>
<div class="product-remove">
<div>
<a href="<?php echo esc_url( add_query_arg( 'remove_from_wishlist', $item['prod_id'] ) ) ?>" class="remove remove_from_wishlist" title="<?php _e( 'Remove this product', 'yith-woocommerce-wishlist' ) ?>"></a>
</div>
</div>
<?php endif; ?>
?>

Voor de volledigheid de eerste PHP openingstag en de laatste sluittag zijn alleen maar om hier de code bij elkaar te houden. Werd anders door elkaar gegooid. Mijn fout waarschijnlijk maar heb het even zo opgelost.

Ben al dagen aan het proberen dit op te lossen maar zonder resultaat.
Is dit überhaupt mogelijk en zo ja, hoe zou ik dit dan moeten bereiken.
Ik ben nog behoorlijk nieuw als het gaat om webdevelopment en php dus graag in begrijpelijke taal a.u.b.

Iedere hulp is zeer welkom.
Bij voorbaat dank,

Adri
Volg het kruimelpad.

Waar komt deze foutmelding "Error. Unable to remove the product from the wishlist." vandaan?

Welke condities gelden dat deze foutmelding getriggerd wordt?

Zit er ergens JavaScript in dit proces die fouten produceert? Dat breekt mogelijk al je functionaliteit.

Produceert de code in het bovenstaande fragment wel de juiste link voor het verwijderen van een item?

Als je zo'n link rechtstreekt aanroept, werkt dit dan wel?
Je wilt een PHP-functie uitvoeren.

PHP wordt op de server uitgevoerd.

Dit betekent dus dat je:
- Of de gehele pagina moet refreshen waarbij de functie wordt uitgevoerd alvoerens de pagina opnieuw naar de client gestuurd wordt.
- Of gebruik moet maken van AJAX om de PHP-functie op de achtergrond uit te laten voeren.
@Thomas:

- Waar komt deze foutmelding "Error. Unable to remove the product from the wishlist." vandaan?
Deze komt uit het bestand (voor zever ik heb kunnen nagaan) class.yith-wcwl.php.

- Welke condities gelden dat deze foutmelding getriggerd wordt?
Wanneer de masonry scripts (4 stuks) geladen zijn gaat het fout. Wanneer ze niet geladen zijn werkt alles naar behoren.

- Zit er ergens JavaScript in dit proces die fouten produceert? Dat breekt mogelijk al je functionaliteit.
Volgens mij niet omdat ze afzonderlijk foutloos functioneren. Het gaat alleen in de combi fout.

- Produceert de code in het bovenstaande fragment wel de juiste link voor het verwijderen van een item?
Nee, als de masonry scripts niet zijn geladen wordt de volgende (correcte) html output gegenereerd:
<a href="/wishlist/?remove_from_wishlist=3759" class="remove remove_from_wishlist" title="Remove this product"></a>

- Als de masonry scripts geladen zijn wordt het volgende aangemaakt:
<a href="/wp-admin/admin-ajax.php?remove_from_wishlist=3748" class="remove remove_from_wishlist" title="Remove this product"></a>
Waar dit vandaan komt weet ik echt niet.

- Als je zo'n link rechtstreekt aanroept, werkt dit dan wel?
Nee, ook als ik de correcte link "hard" codeer krijg ik dezelfde error.

@Pipo Clown
Het is mij bekend dat je niet rechtstreeks een PHP functie in een link kan opnemen. Hierover heb ik divers posts gelezen.
Echter ik krijg het maar niet onder mijn dikke schedel hoe ik het wel voor elkaar moet krijgen (hoe ik de functie moet maken met de page reload er in maar ook de AJAX optie niet). Ik heb nog weinig ervaring.

@Beiden jullie hulp wordt zeer gewaardeerd.
Wanneer de masonry scripts (4 stuks) geladen zijn gaat het fout. Wanneer ze niet geladen zijn werkt alles naar behoren.

Ik bedoelde meer, wanneer wordt deze foutmelding geproduceerd door de wishlist-code. Dit geeft namelijk aan wat er volgens de wishlist zelf mis is/ontbreekt.

En dat masonry, dat is een plugin neem ik aan?

Heb je ook ergens een concreet voorbeeld (website waarin dit niet werkt)? Dat praat wellicht wat makkelijker.
Excuus voor mijn late reactie maar ik was even druk met wat andere dingen.

Bij deze dus:
Ik ben er niet zeker van of ik je begrijp maar de code waaruit de foutmelding komt staat hieronder:
Dit is een stukje uit een bestand met allerlei functies. Van de code in dit bestand begrijp ik niet zoveel.

<?php
/**
* AJAX: remove from wishlist action
*
* @return void
* @since 1.0.0
*/
public function remove_from_wishlist_ajax() {
$wishlist_token = isset( $this->details['wishlist_token'] ) ? $this->details['wishlist_token'] : false;
$count = yith_wcwl_count_products( $wishlist_token );
$message = '';

if( $count != 0 ) {
if ( $this->remove() ) {
$message = apply_filters( 'yith_wcwl_product_removed_text', __( 'Product successfully removed.', 'yith-woocommerce-wishlist' ) );
$count --;
}
else {
$message = apply_filters( 'yith_wcwl_unable_to_remove_product_message', __( 'Error. Unable to remove the product from the wishlist.', 'yith-woocommerce-wishlist' ) );
}
}
else{
$message = apply_filters( 'yith_wcwl_no_product_to_remove_message', __( 'No products were added to the wishlist', 'yith-woocommerce-wishlist' ) );
}

wc_add_notice( $message );

$atts = array( 'wishlist_id' => $wishlist_token );
if( isset( $this->details['pagination'] ) ){
$atts['pagination'] = $this->details['pagination'];
}

if( isset( $this->details['per_page'] ) ){
$atts['per_page'] = $this->details['per_page'];
}

echo YITH_WCWL_Shortcode::wishlist( $atts );
die();
}
?>

De masonry is geen plugin, ik kwam het tegen tijdens een online training op Lynda.com. Daar werd het toegepast.
Ik heb de scripts hier gedownload:

http://masonry.desandro.com/

Ik ben deze site hier lokaal aan het bouwen. Als het moet kan ik wel voor een online versie zorgen. We moeten dan alleen even kijken hoe we inloggegevens bij je krijgen.

Bedankt.

[size=xsmall]Toevoeging op 19/11/2015 10:18:59:[/size]

Een aanvulling:
Wanneer ik de link http://stockphotosite.dev/wishlist/?remove_from_wishlist=4178 rechtstreeks in mijn browseradresveld plak wordt het product correct, zonder foutmelding verwijderd. Hierbij is stockphotosite.dev mijn lokale omgeving en 4178 het product_id dat wordt gegeven door de wishlist plugin.

Het echte verwijderen van een product lijkt door de onderstaande functie te worden uitgevoerd.


<?PHP
/**
* Remove an entry from the wishlist.
*
* @return bool
* @since 1.0.0
*/
public function remove( $id = false ) {
global $wpdb;

if( ! empty( $id ) ) {
_deprecated_argument( 'YITH_WCWL->remove()', '2.0.0', __( 'The "Remove" option now does not require any parameter' ) );
}

$prod_id = ( isset( $this->details['remove_from_wishlist'] ) && is_numeric( $this->details['remove_from_wishlist'] ) ) ? $this->details['remove_from_wishlist'] : false;
$wishlist_id = ( isset( $this->details['wishlist_id'] ) && is_numeric( $this->details['wishlist_id'] ) ) ? $this->details['wishlist_id'] : false;
$user_id = ( ! empty( $this->details['user_id'] ) ) ? $this->details['user_id'] : false;

if( $prod_id == false ){
return false;
}

if ( is_user_logged_in() ) {
$sql = "DELETE FROM {$wpdb->yith_wcwl_items} WHERE user_id = %d AND prod_id = %d";
$sql_args = array(
$user_id,
$prod_id
);

if( empty( $wishlist_id ) ){
$wishlist_id = $this->generate_default_wishlist( get_current_user_id() );
}

$wishlist = $this->get_wishlist_detail( $wishlist_id );
$this->last_operation_token = $wishlist['wishlist_token'];

$sql .= " AND wishlist_id = %d";
$sql_args[] = $wishlist_id;

$result = $wpdb->query( $wpdb->prepare( $sql, $sql_args ) );

if ( $result ) {
return true;
}
else {
$this->errors[] = __( 'An error occurred while removing products from the wishlist', 'yith-woocommerce-wishlist' );
return false;
}
}
else {
$wishlist = yith_getcookie( 'yith_wcwl_products' );

foreach( $wishlist as $key => $item ){
if( $item['wishlist_id'] == $wishlist_id && $item['prod_id'] == $prod_id ){
unset( $wishlist[ $key ] );
}
}

yith_setcookie( 'yith_wcwl_products', $wishlist );

return true;
}
}
?>

Kan het een AJAX gerelateerd probleem zijn? Als ik namelijk na de verwijderpoging waarbij ik een foutmelding krijg opnieuw naar de url kijk in de html output dan is deze veranderd naar: http://stockphotosite.dev/wp-admin/admin-ajax.php?remove_from_wishlist=4178. Ik weet echter helemaal niets van AJAX.

Dat komt op mij vreemd over.....
Om terug te komen op mijn eerdere vraag: de functie/methode remove() retourneert dus om een of andere reden "false", dat zorgt voor de boodschap die je krijgt.

Volgende stap: bepaal waar precies false wordt geretourneerd. Als je dat hebt bepaald weet je welke (noodzakelijke) voorwaarden voor verwijdering niet van toepassing waren en vervolgens kun je gaan uitzoeken waar dat dan door komt.

Reageren